Price is a truce. Two sides agree on a number for a moment, and then they don't. What price never tells you is who had to reach across the spread to make the trade happen, and that reaching is most of what I actually care about when I am trying to figure out if a move is real. Cumulative volume delta is the crudest possible way to measure that reaching, and crude turns out to be enough.
The idea is simple once you see how it is built. Every trade that prints has a passive side and an aggressive side. Someone posted a resting limit order and waited, and someone else came in with a market order and hit it. The market order is the aggressor, because it paid the spread to get filled right now instead of waiting. Volume delta just tags each trade by which side was the aggressor. A market buy that lifts the offer counts as positive. A market sell that hits the bid counts as negative. Delta for a bar is buys minus sells. Cumulative volume delta is that number, running, added up bar after bar so you can watch the line drift instead of squinting at individual candles.
What CVD is actually telling you
So CVD is a rough tally of net aggression. When it rises, buyers are the ones crossing the spread, willing to pay up to get in. When it falls, sellers are the impatient ones. That is the whole signal, and it is worth sitting with how different it is from price. Price can rise because buyers are aggressive, or it can rise because sellers simply stepped back and the offer floated up on thin volume. CVD helps you tell those two apart, and they are not the same trade.
A word on how the tagging happens, because it matters for trusting the number. On most exchange feeds each trade comes stamped with a maker side or an aggressor flag, so the classification is exact, not guessed. If you are working off a feed that does not stamp it, tools fall back to the tick rule, guessing aggressor from whether the trade printed at the bid or the offer, and that guessing gets noisy in fast tape. When I look at CVD I want it built from tagged aggressor data. If I cannot tell how it was built, I trust it less, especially on lower liquidity pairs where the guessing goes wrong more often.
The honest caveat up front: CVD is not a magic read on real intent. A patient buyer accumulating with resting limit orders shows up as negative delta, because every fill against their bids is technically an aggressive sell hitting them. Passive size does not move CVD in the direction of the person who wanted it. So CVD measures who is impatient, not who is smart. Most of the time impatience and direction line up. The interesting trades are the moments they don't.
Absorption: heavy selling into flat price
This is the setup CVD reads better than almost anything else. Watch what happens when CVD is sliding hard, sellers dumping market orders, and price just sits there. Refuses to drop. Bar after bar of net selling and the price barely gives up any ground.
Something has to be eating all that selling, and the something is a wall of resting bids soaking it up without flinching. That is absorption. A large passive buyer is sitting on the bid, letting the impatient sellers hit them all day, and price holds because the supply is being quietly absorbed as fast as it arrives. When the sellers finally exhaust themselves and there is nothing left to hit that bid, price tends to snap back the other way, because the pressure that was pinning it down just evaporated and the resting size is still there.
The mirror version happens at tops. CVD climbs and climbs, aggressive buyers leaning in, and price stalls out flat. Someone is capping it, feeding offers into every buy, and the buyers are spending all their energy going nowhere. Here is the rule of thumb I use. When aggression is heavy in one direction and price will not go the way the aggression is pushing, the passive side is winning, and the passive side usually wins the actual move once the aggressors give up. Divergence between effort and result is the tell.
Delta divergence at the extremes
The second setup is a straight comparison of the two lines, price and CVD, at swing points. In a clean, healthy trend they agree. Price makes a higher high, CVD makes a higher high, aggression is confirming the move. The signal fires when they stop agreeing.
Price pushes to a new high but CVD makes a lower high. The market got to a fresh price on less net buying aggression than the last leg took. That is a warning that the move is being carried by thin participation, or by shorts covering, or by nobody in particular, and the buyers who drove the earlier leg are not showing up with the same size. Same logic at a bottom. Price prints a lower low while CVD refuses to, meaning sellers could not muster the aggression to match the earlier flush even though price went lower. Sellers are exhausted and price is running on fumes.
Divergence is a warning, not a trigger. I have watched CVD diverge for a long, uncomfortable stretch while price kept grinding against it, and if you shorted every divergence you would get run over. I treat it as a reason to tighten up, to stop trusting the breakout, to wait for price to actually confirm with a lower high before acting. Never as a standalone entry.
Spot versus perp CVD, and who is driving
In crypto you get a second layer for free, and it is the part I would not skip. You can build CVD separately for the spot market and for the perpetual futures market, and comparing the two exposes who is actually behind a move.
Perp flow is where leverage and speculation live. Spot flow is closer to real money changing hands, people actually taking coins off the market. When price rallies and perp CVD is doing all the work while spot CVD stays flat or falls, that is a leverage-driven push. Longs piling into futures with no real accumulation underneath. Those moves are the ones that get violently unwound, because the fuel is borrowed and a wick full of liquidations can reverse it in seconds. When price rallies and spot CVD is leading, real buyers lifting real offers, the move has better footing. The check is quick:
- Price up, perp CVD up, spot CVD flat or down. Leveraged and fragile. Fade candidate or at least do not chase.
- Price up, spot CVD leading, perp along for the ride. Better supported. Breakout more likely to hold.
- Price down while spot CVD quietly rises. Someone is accumulating into the fear. Watch for a floor.
None of these are certainties. They shift your prior, which is all any order-flow read is doing.
Putting it to work on a breakout
Here is the workflow I actually run when price is testing a level and I need to decide whether to trust the break. First, is CVD confirming? Price breaking up should come with CVD breaking up too. If price clears the high and CVD is flat or already rolling over, the break is not backed by aggression and I fade it or stand aside. Second, check for absorption at the level. If I see heavy delta pressing against the level and price not moving, the passive side there is strong and the break is likely to fail on the first try. Third, in crypto, split spot and perp. A breakout carried by perps alone is one I chase with a hand on the stop, not with size.
The failure mode to burn into memory is trusting delta as a price substitute. CVD is context, not a signal generator. Aggression can be relentless and price can still go nowhere, and that stalemate is the information, not a countdown to price catching up. If you take one thing from this, let it be the habit of asking, every time price does something, whether aggression agreed. When it did not, you are usually looking at the more interesting trade. On Blockcircle we surface delta alongside price partly so this comparison is a glance instead of a spreadsheet, but the reasoning matters more than any tool. Watch effort against result, and let the disagreements do the talking.