Volatility-Adjusted Supply & Demand Zones [Footprint]Volatility-Adjusted Supply & Demand Zones
Overview
Most supply and demand indicators draw zones based on price structure alone — a strong candle appears, a box gets painted, and every zone looks equally valid. This indicator takes a different approach: it sizes and scores every zone using ATR-based volatility, then validates each zone using real order flow data pulled from the bar's volume footprint. The result is a layer of institutional context that price-only zone detectors cannot provide.
The indicator detects displacement candles whose bodies exceed a user-defined ATR multiple, assigns each zone a composite strength score derived from body size and relative volume, and then cross-references the zone's origin bar against footprint delta — the net difference between aggressive buying and aggressive selling — to classify each zone as confirmed, weak, or mitigated. Zones where order flow agreed with the directional move are rendered at full opacity. Zones where delta contradicted the move are faded, acting as a caution signal rather than a confident level. A built-in performance heatmap tracks historical win rates and delta confirmation rates across five strength bins so you can calibrate inputs to your instrument over time.
How it works
Zone detection
On each bar the indicator computes ATR and compares the candle body size against it. If the body exceeds the displacement threshold (ATR × Displacement Multiplier), the bar is flagged as a displacement move. A pending zone is created at the candle's proximal edge and held in a queue. The zone is only confirmed after price has moved away cleanly for a user-defined number of bars without re-entering the candidate range. If price re-enters during the waiting period, the candidate is discarded.
bodySize = math.abs(close - open)
dispRatio = bodySize / atr
isStrongMove = dispRatio > displacementMult
Zone height is fixed at the time of detection: ATR × Zone Width Multiplier, measured from the proximal edge of the displacement candle inward. Demand zones extend downward from the candle high; supply zones extend upward from the candle low.
Strength score
Each zone carries a strength score calculated from the body-to-ATR ratio and the bar's relative volume (volume divided by its moving average). Multiplying these two factors rewards moves that were both large in price terms and accompanied by elevated volume.
relVol = volume / ta.sma(volume, volLengthInput)
strengthScore = dispRatio * math.sqrt(relVol)
The score is displayed on the zone label and used to bin zones into the statistics table.
Footprint delta confirmation
The indicator calls request.footprint() once per bar to obtain the volume footprint for the displacement candle. It reads the bar-level delta (net aggressive buying minus selling), and also inspects the Point of Control (POC) row for directional imbalance. A demand zone is delta-confirmed when the origin bar shows net buying (delta > 0). A supply zone is confirmed when the origin bar shows net selling (delta < 0). When delta contradicts the zone direction, the zone is rendered at the Weak Zone Transparency level as a visual warning.
Zones whose POC row has a confirming buy or sell imbalance are marked with a ⚡ symbol on their label, indicating that the most-traded price level within the bar showed a pronounced one-sided order flow skew.
Visual encoding
Full-opacity zone — footprint delta confirmed the zone direction. Treat as a standard level.
Faded zone (Weak Zone Transparency) — delta contradicted the zone direction. Approach with caution; order flow did not support the move.
Heavily faded zone (Mitigated Transparency) — price has since closed through the far edge of the zone. The level has been invalidated.
⚡ label marker — the POC row of the origin bar showed a confirming imbalance, suggesting concentrated institutional activity at the most-traded price.
Inputs
Detection
ATR Length — lookback period for ATR, which controls zone width, displacement sensitivity, and reaction targets across the entire indicator. Lower values (e.g. 7) make ATR respond faster to recent volatility, producing narrower zones on quiet bars. Higher values (e.g. 21) smooth out spikes for more consistent sizing. Default: 14.
Displacement Multiplier — minimum candle body size as a multiple of ATR required to qualify as a displacement move. Lower values (e.g. 0.5) detect more zones including smaller impulses. Higher values (e.g. 1.5–2.0) filter down to only the most explosive candles. Default: 1.0.
Volume MA Length — lookback period for the volume simple moving average used to compute relative volume. Lower values (e.g. 10) make the baseline adapt quickly so only larger surges register. Higher values (e.g. 50) treat moderate volume increases as more significant. Affects the strength score only, not zone placement. Default: 20.
Zone Width ATR Multiplier — height of each zone expressed as a multiple of ATR at detection. Lower values (e.g. 0.3) produce tight zones that require a precise re-entry. Higher values (e.g. 1.0) tolerate wider wicks before a touch is registered. Default: 0.5.
Confirmation Bars — number of bars price must hold outside the zone after the displacement candle before the zone is drawn. Lower values (e.g. 1–2) capture zones faster but allow more false starts. Higher values (e.g. 5+) require a sustained move away and reduce noise. Default: 3.
Volume Footprint
Ticks Per Footprint Row — price range of each footprint row in ticks. Smaller values (e.g. 10–25) produce more granular rows and more detailed POC detection. Larger values (e.g. 200–500) aggregate into fewer rows and run faster. Match to your instrument: for ES futures (0.25 pts/tick), 100 ticks = 25 points per row; for BTC (0.10/tick), 1000 ticks ≈ $100 per row. Default: 100.
Value Area % — percentage of total bar volume that defines the Value Area, following standard market profile convention. Raising this widens the VA; lowering it tightens it. Default: 70.
Imbalance Threshold % — how much a row's buy volume must exceed the row below's sell volume (or vice versa) to be flagged as imbalanced. At 300%, buy volume must be 3× the adjacent row's sell volume. Lower values (e.g. 150%) flag more imbalances; higher values (e.g. 500%) flag only extreme skews. Default: 300.
Show Delta on Zone — when enabled, the zone label includes the footprint delta direction (▲/▼) and size in thousands at the origin bar. Disable to show only the strength score. Default: on.
Highlight Imbalanced Zones — when enabled, zones whose origin bar POC row has a confirming directional imbalance are marked with ⚡ in the label. Disable to suppress imbalance detection entirely. Default: on.
Statistics
Show Performance Heatmap — toggles the heatmap table in the top-right corner. The table groups zones into five strength bins and shows demand win rate, supply win rate, total zone count, and delta confirmation rate per bin, colour-coded from red (low) to green (high). Default: on.
Reaction Target (ATR) — how far price must move away from a zone after touching it to count as a successful reaction, in ATR multiples. Lower values (e.g. 0.5) count small bounces as wins; higher values (e.g. 2.5–3.0) require meaningful moves. Affects statistics only — does not resize zones. Default: 1.5.
Style
Demand Color — fill and border colour for demand zones. The opacity set in the colour picker controls baseline transparency; delta-confirmed zones render at this opacity while weak zones are additionally faded. Default: green at 60% transparency.
Supply Color — fill and border colour for supply zones. The same transparency layering applies as demand zones. Default: red at 60% transparency.
Weak Zone Transparency — transparency applied to zones where footprint delta contradicts the zone direction. Higher values (closer to 100) make weak zones nearly invisible. Lower values keep them visible as a caution marker. Default: 82.
Mitigated Transparency — transparency applied after a zone is invalidated by price closing through its far edge. Higher values clean up the chart; lower values retain mitigated zones as historical context. Default: 90.
Usage notes
Before trusting any zone, check the label: a ▼ delta on a demand zone or ▲ delta on a supply zone means aggressive order flow did not support the move. Wait for additional confirmation before entering against the zone.
The ⚡ marker identifies zones where the most-traded price level within the displacement bar showed a one-sided imbalance. These levels represent potential areas of concentrated institutional activity and may produce stronger reactions than unmarked zones.
Use the performance heatmap to calibrate your displacement and volume inputs. If the highest-scoring bins (6–8, 8+) are showing low win rates for your instrument, the displacement multiplier may be too low and is capturing impulsive but unsustained moves.
The Δ Conf% column in the heatmap shows what fraction of zones in each strength bin had confirming delta. If high-strength zones show low confirmation rates on your instrument, consider whether a different timeframe or session gives more reliable footprint data.
Footprint data requires a TradingView subscription tier that provides volume footprint access. On instruments or timeframes where footprint is unavailable, delta values display as "Δ n/a" and all zones default to confirmed status so zone detection still functions.
Ticks Per Footprint Row is the most instrument-sensitive input. Set it too small and computation overhead increases; set it too large and POC imbalance detection loses resolution. For equity index futures, 50–100 ticks per row is a reasonable starting range.
Mitigated zones (heavily faded) mark levels where price has already broken through. They are kept visible by default as historical reference but can be hidden completely by setting Mitigated Transparency to 100.
This indicator does not generate entry signals. It identifies structural levels with order flow context. Combine it with a trigger mechanism — a lower-timeframe confirmation candle, a momentum signal, or a volume surge — before committing to a trade.
Indicateur Pine Script®






















