Market Profile is not an indicator — it is a complete framework for understanding market structure through time and price. Developed by J. Peter Steidlmayer at the Chicago Board of Trade in the 1980s, it maps every 30-minute trading period as a letter at every price it traded, building a distribution that reveals where the market found — and rejected — value.
Section 1: Core Mechanics
Market Profile replaces the conventional bar chart with a spatial map. Each 30-minute period is assigned a letter (A = first half-hour, B = second, and so on). At each price level where that period traded, its letter is placed. The result is a profile that visually shows: did the market spend time at this price? A full-width profile indicates balanced two-sided activity. A thin single-column profile at a price indicates fast one-directional movement.
What Is a TPO?
A Time Price Opportunity (TPO) is each individual letter in the profile. One TPO = one 30-minute period at one price level. If the ES futures traded at 4,480 during periods A, B, C, and E — that price level has four TPOs (the letters A, B, C, E stacked vertically at 4,480).
What Is the Point of Control (POC)?
The Point of Control (POC) is the price level with the most TPOs — where the market spent the greatest amount of time. POC is the "fairest" price of the session in time terms. It is the gravitational center of the day's activity.
For Volume Profile, POC is the maximum-volume level. For Market Profile, POC is the maximum-time level. These often coincide but can differ — when they do, the divergence itself carries information.
Value Area Calculation
The Value Area (VA) contains 70% of the day's TPOs, expanded from the POC outward:
Expansion from POC alternates: compare the two TPOs directly above POC to the two TPOs directly below. Add whichever side has more TPOs. Continue until 70% is included.
- Value Area High (VAH): Top of the 70% zone
- Value Area Low (VAL): Bottom of the 70% zone
Key Market Profile Structures
| Structure | Description | Significance |
|---|---|---|
| Bell curve profile | Symmetric distribution, wide VA | Balanced market — buyers and sellers agree on value |
| P-shaped profile | Wide top, narrow bottom | Buying tail — sellers pushed price down, buyers absorbed and lifted |
| b-shaped profile | Narrow top, wide bottom | Selling tail — buyers pushed price up, sellers absorbed and pushed down |
| Single prints | One letter at a price level | Fast market — no agreement; vulnerable on retest |
| TPO breakout | Extension beyond prior day's range | New price discovery beginning |
Inputs
Market Profile requires:
- Price data at 30-minute resolution — which price levels did each 30-minute period trade through
- Professional data feed — Market Profile is not available from standard free data feeds. Required: CQG, eSignal, Sierra Chart, Jigsaw Trading, ATAS
Parameters
| Parameter | Default | Notes |
|---|---|---|
| Period length | 30 minutes per TPO | Fixed by convention — Steidlmayer's original design |
| Value area percentage | 70% | Standard; matches one standard deviation of a normal distribution |
| Profile period | 1 session | Can stack multiple days (composite profile) |
| Letters per profile | A–X (or 1–24) | Up to 24 half-hour periods in a standard session |
Section 2: Interpretation & Signals
Reading the Profile Shape
Balanced (Normal Distribution) Profile: The profile resembles a bell curve. Most TPOs cluster in the center (VA). The market found value, traded two-sided activity, and closed near the middle. Next session context: the market is in balance — expect initial activity to stay within today's value area until a catalyst moves it.
Trending Day Profile: Profile is narrow and elongated in one direction. Few TPOs cluster anywhere — price moved directionally all day. Next session: the market is searching for new value — expect continuation unless price retreats back inside the prior day's range.
b-shape (Selling Tail): Wide lower distribution, narrow upper. Buyers attempted to push price up early (narrow top = few periods spent at the high), but sellers overwhelmed them. The wide lower portion = sellers found long-lasting value at lower prices.
POC as Support and Resistance
The POC Rule: When price returns to a prior session's POC, it is testing the level where that session found its greatest temporal agreement. POC acts as a magnet. Price approaching POC from above = support test. From below = resistance test.
The critical observation: how does price respond at POC? If it holds and reverses — the prior value is still valid, expect a return to the prior Value Area. If price slices through POC decisively — value has shifted, new price discovery underway.
Market Profile POC Support and Value Area Retest
Single Prints — Vulnerable Zones
Single prints occur where only one letter (one 30-minute period) traded at a price level. They represent fast, imbalanced movement where no lasting agreement was found. They are the most vulnerable levels in the profile — price frequently returns to fill single-print zones on subsequent sessions.
- Single prints in a tail (above or below VA): Represent the extreme of one-sided initiative. When price returns to a single-print tail, it is retesting the extreme of conviction.
- Single prints mid-profile (poor structure): Represent a gap in activity — the market moved through this level rapidly and may return to "fill" it.
Auction Market Theory
Steidlmayer's framework rests on auction theory: markets exist to facilitate trade. When price moves to a level where trade occurs readily (buyers and sellers both willing to transact), the market spends time there — building TPOs. When price moves to a level where trade does not occur (no buyers or no sellers), it retreats — leaving single prints or tails.
This creates the behavioral cycle:
- Price moves away from value (POC/VA)
- Probes for new participants at the new price
- If participants appear → new balance area forms (new POC/VA)
- If participants don't appear → price rotates back toward prior value
Section 3: Pass vs. Live — Real-Time Reliability
A completed session's Market Profile is a permanent record. POC, VAH, and VAL for any prior session never change. The current session's profile builds TPO by TPO throughout the day — the POC and Value Area shift as each 30-minute period completes.
Professional traders arrive before the open with prior day's Market Profile already analyzed. POC, VAH, VAL, and single prints from the prior session are marked on the chart as horizontal lines. The session's behavior relative to these pre-marked levels drives the trading decisions.
Section 4: Practical Use Cases
Setup: Prior day's Market Profile with POC, VAH, VAL marked. Current session VWAP overlay. Signal: Opening drive tests prior day's VAH. If price rejects VAH within the first 30 minutes (TPO period A or B), short with stop above VAH + 5 ticks. Entry: First TPO period (30m bar) that fails to hold above VAH and closes back below Exit: Return to prior day's POC (primary target) or prior day's VAL (extended target) Key Rule: Opening rejection at VAH or VAL is the highest-probability Market Profile scalp. The market tests prior value boundaries, finds rejection, and returns to center.
Setup: Composite Market Profile over 5-day window + individual session profiles visible Signal: Multi-day Value Area developing at a specific price range. Price accepts above the 5-day VAH for 2+ sessions = upward value shift in progress. Entry: Daily close above 5-day VAH with volume above 20-day average. Wait for first retest of VAH from above as new support. Exit: Target the next 5-day composite profile's VAH (from 5-10 sessions back) as the next resistance zone Key Rule: Value Area acceptance (2+ sessions inside a new VA zone) is the Market Profile definition of a trend — trade in the direction of accepted value
Setup: Monthly composite profile — one profile spanning the entire calendar month Signal: Price breaks above the monthly VAH and accepts there for 5+ sessions (one trading week). Monthly POC of the new value area is your first target. Entry: First weekly close above monthly VAH with weekly volume confirmation Exit: Target prior monthly VAH (2-3 months back) as next major resistance. Exit if price falls back inside the monthly Value Area for 2+ days. Key Rule: Monthly Market Profile acceptance shifts signal major institutional repositioning — these moves typically extend for 1-3 months before the next profile-level balance forms
Real example: E-mini S&P 500 futures (ES) on November 1, 2023. The prior day's Market Profile showed POC at 4,190, VAH at 4,220, VAL at 4,165. In the first period (Period A) of November 1st, ES opened at 4,195 (inside Value Area) and immediately drove to 4,225 — testing VAH. The drive failed by 10:00 AM, with price printing the final TPO of Period B at 4,210. Classic VAH rejection setup. Traders who shorted the VAH rejection at 4,222 (stop above 4,230) captured a move back to POC at 4,190 — a 32-point gain — by midday.
Section 5: Pseudo Code
INPUT: bar_data[] (each bar: time, open, high, low, close, volume), session_date, period_minutes=30, va_pct=0.70
PROCESS:
Step 1: Filter and label TPO periods
periods = group_bars_into_periods(bar_data, period_minutes)
for idx, period in enumerate(periods):
letter = chr(ord('A') + idx) # A=first, B=second, etc.
period['letter'] = letter
Step 2: Map TPOs to price levels
price_tick = 0.25 # Use instrument tick size
tpo_map = {} # price_level -> list of letters
for period in periods:
price_levels = range_to_levels(period.low, period.high, price_tick)
for level in price_levels:
if level not in tpo_map:
tpo_map[level] = []
tpo_map[level].append(period['letter'])
Step 3: Find Point of Control
poc_level = max(tpo_map, key=lambda p: len(tpo_map[p]))
poc_price = poc_level
Step 4: Calculate Value Area
total_tpos = sum(len(v) for v in tpo_map.values())
target_tpos = int(total_tpos * va_pct)
va_tpos = len(tpo_map[poc_level])
upper = lower = poc_level
while va_tpos < target_tpos:
add_upper = len(tpo_map.get(upper + price_tick * 2, []))
add_lower = len(tpo_map.get(lower - price_tick * 2, []))
if add_upper >= add_lower:
upper += price_tick * 2
va_tpos += add_upper
else:
lower -= price_tick * 2
va_tpos += add_lower
Step 5: Identify single prints
single_prints = [p for p, letters in tpo_map.items() if len(letters) == 1]
Step 6: Classify profile shape
va_range = upper - lower
full_range = max(tpo_map) - min(tpo_map)
concentration = va_range / full_range
if concentration > 0.60: shape = "Balanced (Normal)"
elif upper > (max(tpo_map) * 0.90): shape = "P-shape (Buying Tail)"
elif lower < (min(tpo_map) * 1.10): shape = "b-shape (Selling Tail)"
else: shape = "Trending Day"
OUTPUT: poc_price, vah=upper, val=lower, tpo_map, single_prints[], profile_shape
EDGE CASES:
- Session with fewer than 6 periods: flag as incomplete profile
- Multiple price levels tied for most TPOs: select the one closest to session midpoint as POC
- Single-print tails: always flag for potential retest setup
- Data gaps within session: fill with zero-TPO levels, note for analysis
Section 6: Parameters & Optimization
Composite Profile Types
| Profile Type | Period | Use Case |
|---|---|---|
| Single session | One day | Day trading S/R levels |
| 5-day composite | One trading week | Swing trading value reference |
| Monthly composite | Calendar month | Position-level value area |
| Range composite | Custom event range | Post-earnings, post-FOMC structure |
Platform Requirements
| Platform | Market Profile Support | Cost |
|---|---|---|
| Sierra Chart | Full TPO letter profile, all profile types | Moderate ($50+/month) |
| Jigsaw Trading | Excellent TPO + Volume Profile combo | Moderate ($70+/month) |
| ATAS (Order Flow) | Full Market Profile + footprint | Higher tier |
| NinjaTrader | Add-on required | Free platform, paid add-ons |
| TradingView | No true Market Profile | Not available |
| Interactive Brokers | No Market Profile | Not available |
Why is the Value Area set to 70% and not 50% or 80%?
The 70% convention derives from statistics — one standard deviation of a normal distribution contains approximately 68.27% of values. Steidlmayer rounded this to 70% for practicality. The idea is that the Value Area represents the one-standard-deviation fair value range — where the market agrees on price under normal conditions. Price outside the Value Area is statistically away from consensus and likely to return. The 70% level has become a self-reinforcing convention because so many institutional traders use it.
How is Market Profile different from Volume Profile?
Market Profile maps TIME at each price level — how many 30-minute periods traded at each price. Volume Profile maps VOLUME at each price level — how many contracts traded there. Both identify a POC and Value Area, but from different angles. Time and volume usually agree, but sometimes diverge. When Market Profile POC is significantly different from Volume Profile POC, the divergence tells you: the market spent lots of time at one price, but the heaviest volume transaction occurred elsewhere. This distinction reveals which players (time-based passive participants vs. aggressive volume participants) dominated the session.
Section 7: Synergies & Conflicts
| Works Well With | Avoid Combining With | |
|---|---|---|
| Volume Profile | Market Profile (time-based) and Volume Profile (volume-based) identify the same structure from two angles. When their POC and Value Areas align, the level has dual institutional significance. When they diverge, the divergence itself is a signal — investigate which side (time or volume) has stronger institutional backing. | — |
| VWAP | VWAP gives the session's volume-weighted average price. Market Profile gives the session's time-weighted value area. On a normal distribution day, VWAP and POC will be very close. On trending days, VWAP drifts further from POC — the gap indicates directional conviction. | — |
| Order Flow / Footprint charts | Footprint charts show bid vs. ask volume at each price for each bar — the micro-structure behind the TPO letters. Combining Market Profile (macro structure) with footprint analysis (micro-level execution) is the professional-grade approach for futures day traders. | — |
| Opening Range Breakout | The Initial Balance (first hour, periods A and B) sets the opening range. Market Profile rules for IB extension have high statistical reliability — price extending beyond the IB tends to continue to 1.5× the IB width approximately 75% of the time. | — |
| Standard technical indicators (RSI, MACD) | — | Market Profile is a standalone framework — adding RSI or MACD creates a mismatch between two fundamentally different trading philosophies. RSI looks backward at price momentum; Market Profile maps forward-looking value acceptance. Mixing them produces signal conflict, not clarity. |
| Moving averages for the primary signal | — | Market Profile operates on structure, not trend-following math. Plotting a 20-SMA on a Market Profile chart creates visual noise without adding information. POC, VAH, and VAL are the levels that matter — EMAs add nothing. |
Section 8: Common Mistakes
| Mistake | Root Cause | Solution |
|---|---|---|
| Using approximated Market Profile from retail platforms | TradingView does not have true Market Profile | Use Sierra Chart, Jigsaw, or ATAS for accurate TPO data. Approximations miss single prints and distort profile shape. |
| Treating POC as immovable support/resistance | POC is the highest-time level — not a hard floor or ceiling | Price breaks through POC regularly. Watch HOW it breaks — does it hold for a TPO period? Or slice through? The HOW matters more than the WHERE. |
| Ignoring the Initial Balance | Trading before IB is established (first hour) | Wait for IB completion (10:30 AM ET for US markets) before acting on Value Area signals. IB defines the day's reference range. |
| Acting on single-day profile without multi-day context | One session's profile is one data point in a series | Always view at least 5 sessions of profiles to understand the evolving value area migration direction. Is value moving up, down, or sideways? |
| Expecting Market Profile to work on retail platforms without data feeds | Retail data does not have the resolution required | Market Profile is an institutional tool requiring institutional data. Budget for professional data feed before attempting this methodology. |
Section 9: Cheat Sheet
USE WHEN: Trading futures, indices, or high-volume ETFs with access to professional data (Sierra Chart, Jigsaw, ATAS). Use for pre-session planning — marking prior day's POC, VAH, VAL, and single prints before market open.
AVOID WHEN: No access to true TPO data feed. Equities with low volume or irregular sessions. Using retail charting platforms that do not offer full Market Profile with letter display.
ENTRY SIGNAL: Opening rejection at prior day's VAH or VAL (within first 2 TPO periods) — fade the test back toward POC. Or: value area acceptance above prior VAH for 2+ sessions — buy the first retest of VAH from above.
EXIT SIGNAL: Target prior session POC (from VAH rejection). Target next multi-session composite VAH (from value area breakout). Exit if price closes back inside the prior session Value Area after a breakout attempt — the breakout has failed.
PARAMETERS: 30-minute TPO periods (fixed). Value Area: 70%. Watch Initial Balance (first 60 minutes) for the session's reference range. POC ± 5 ticks = trade zone, not a hard line.
CONFLUENCE: VWAP (session average) + Volume Profile POC (volume-based center) + Market Profile POC (time-based center). When all three agree within a tight price range, the level is as strong as S/R gets in the market.
RISK: Requires professional data feed — not available on free platforms. Methodology has a steep learning curve. Misreading profile shape (balanced vs. trending) leads to mean-reversion trades on trend days and trend trades on balanced days.
BEST TIMEFRAME: Intraday (futures day trading): session-by-session profiles on 30-minute TPO charts. Swing (equities, ETFs): weekly composite profiles on daily charts.