OPEN-SOURCE SCRIPT
Volume Delta Footprint Zones Heatmap

Volume Delta Footprint Zones Heatmap (ΔFP)
Order-flow context from CVD. It marks the price levels where aggressive buying or selling showed up without moving price, and keeps those levels on the chart as horizontal lines that fade as they age.
The idea
Delta at a price level tells you how much aggression traded there — but most delta is just the cost of moving price. A bar that rallies 20 points obviously prints positive delta, and that part says nothing you couldn't read off the candle. What's worth marking is delta that did not produce a move: aggression that got absorbed by passive size sitting at a level.
So rather than accumulating raw delta, this script accumulates the residual:
It keeps a rolling average of delta per point of price movement over the last N bars.
For the current bar it computes the delta you would expect from that bar's price change.
Actual minus expected is the unexplained delta.
That residual is spread across the bar's footprint rows in proportion to each row's share of the bar's net delta, and added to a running total for that price.
A level therefore builds up value when trade happens there that the price move doesn't account for. Positive = unexplained buying, drawn green above price. Negative = unexplained selling, drawn red below price.
On a bar with essentially no price change the expected delta is ~zero, so the whole of the bar's delta counts as unexplained — which is the intended behaviour, not a special case.
Decay, not accumulation
Every stored level fades by a fixed percentage each bar, so the map is an exponentially weighted average rather than a session-long total, and recent flow dominates. A contribution keeps (1 − rate)^N of its weight after N bars — at the 5% default that is roughly 60% after 10 bars, 36% after 20, 8% after 50. Levels that fade below the minimum threshold are dropped.
Levels are also removed the moment price trades through them, and are barred from re-forming until price moves a configurable distance away. The display therefore stays on levels that have not been tested yet.
Reading it
Green line above price — unexplained buying that was absorbed there. Supply sat on it.
Red line below price — unexplained selling that was absorbed there.
The label on each line is the level's current residual delta. Red labels show sell-side magnitude as a positive number.
Lines get shorter-lived and thinner on the ground when flow is being explained by the move itself; they persist and stack when price is grinding against size.
Thicker clusters are simply several adjacent rows that each cleared the threshold. Up to 30 levels are kept per side; when both sides are full the furthest level is dropped first.
Limitations — please read before drawing conclusions
Footprint delta is approximated, not tape-derived. Treat magnitudes as relative to each other, not as absolute traded size.
Requires footprint data for your plan and symbol.
Decay only advances on bars where the footprint request actually returns data. On the 1S default, where sub-minute history is shallow, older levels freeze rather than fading — scroll back far enough and the map stops ageing.
The expected-delta baseline is a single rolling mean. It is a crude model of the delta/price relationship and it is symmetric — it does not distinguish up-moves from down-moves.
A level that replaces another in the same drawing slot on the same bar starts one bar late, and a level that lives only a couple of bars in a reused slot may not draw a line at all, though its label still appears.
No signals, no alerts, no directional calls. This is context only, and it is published for people who want to experiment with the idea rather than as a finished system.
Notes
Delta is accumulated per price grid, decays exponentially, and is never reinforced — a level only ever fades once the flow that built it stops. Zones are drawn with plot.style_linebr and the plot layer forces a break whenever a drawing slot changes level, so every segment is horizontal.
Order-flow context from CVD. It marks the price levels where aggressive buying or selling showed up without moving price, and keeps those levels on the chart as horizontal lines that fade as they age.
The idea
Delta at a price level tells you how much aggression traded there — but most delta is just the cost of moving price. A bar that rallies 20 points obviously prints positive delta, and that part says nothing you couldn't read off the candle. What's worth marking is delta that did not produce a move: aggression that got absorbed by passive size sitting at a level.
So rather than accumulating raw delta, this script accumulates the residual:
It keeps a rolling average of delta per point of price movement over the last N bars.
For the current bar it computes the delta you would expect from that bar's price change.
Actual minus expected is the unexplained delta.
That residual is spread across the bar's footprint rows in proportion to each row's share of the bar's net delta, and added to a running total for that price.
A level therefore builds up value when trade happens there that the price move doesn't account for. Positive = unexplained buying, drawn green above price. Negative = unexplained selling, drawn red below price.
On a bar with essentially no price change the expected delta is ~zero, so the whole of the bar's delta counts as unexplained — which is the intended behaviour, not a special case.
Decay, not accumulation
Every stored level fades by a fixed percentage each bar, so the map is an exponentially weighted average rather than a session-long total, and recent flow dominates. A contribution keeps (1 − rate)^N of its weight after N bars — at the 5% default that is roughly 60% after 10 bars, 36% after 20, 8% after 50. Levels that fade below the minimum threshold are dropped.
Levels are also removed the moment price trades through them, and are barred from re-forming until price moves a configurable distance away. The display therefore stays on levels that have not been tested yet.
Reading it
Green line above price — unexplained buying that was absorbed there. Supply sat on it.
Red line below price — unexplained selling that was absorbed there.
The label on each line is the level's current residual delta. Red labels show sell-side magnitude as a positive number.
Lines get shorter-lived and thinner on the ground when flow is being explained by the move itself; they persist and stack when price is grinding against size.
Thicker clusters are simply several adjacent rows that each cleared the threshold. Up to 30 levels are kept per side; when both sides are full the furthest level is dropped first.
Limitations — please read before drawing conclusions
Footprint delta is approximated, not tape-derived. Treat magnitudes as relative to each other, not as absolute traded size.
Requires footprint data for your plan and symbol.
Decay only advances on bars where the footprint request actually returns data. On the 1S default, where sub-minute history is shallow, older levels freeze rather than fading — scroll back far enough and the map stops ageing.
The expected-delta baseline is a single rolling mean. It is a crude model of the delta/price relationship and it is symmetric — it does not distinguish up-moves from down-moves.
A level that replaces another in the same drawing slot on the same bar starts one bar late, and a level that lives only a couple of bars in a reused slot may not draw a line at all, though its label still appears.
No signals, no alerts, no directional calls. This is context only, and it is published for people who want to experiment with the idea rather than as a finished system.
Notes
Delta is accumulated per price grid, decays exponentially, and is never reinforced — a level only ever fades once the flow that built it stops. Zones are drawn with plot.style_linebr and the plot layer forces a break whenever a drawing slot changes level, so every segment is horizontal.
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.