Indicators
CVD (Cumulative Volume Delta)
The running total of buy volume minus sell volume. A measure of which side has been hitting the market hardest, independent of price.
Every trade has an aggressor: a buyer lifting the ask or a seller hitting the bid. Per bar, volume delta is the imbalance between the two, and CVD is its running sum:
delta(bar) = buy volume − sell volume
CVD(t) = Σ delta over all bars up to t
Rising CVD means aggressive buyers dominate the tape. Falling CVD means sellers do.
Why compare it to price
CVD earns its keep when it disagrees with price. In a divergence, price makes a new high but CVD doesn't: the push came on thinner aggressive buying, a warning that the move lacks fuel. In absorption, CVD falls hard (heavy aggressive selling) while price refuses to drop, which means resting bids in the order book are soaking up the flow. Absorption often precedes reversals.
Data requirements
CVD needs per-trade aggressor data, or candles carrying buy/sell volume splits, which most candle-only backtesters don't have. AlphaProve's candle schema stores buy volume, sell volume, and delta per bar, so CVD-based strategies (divergence, absorption, and swing-failure variants) are backtestable as first-class citizens.
On AlphaProve
You reach CVD three ways: as ctx.indicators.cvd in a Python strategy, as
a condition row in the no-code builder comparing it to a constant or
another indicator, and through the builtin registry, where cvd_absorption
and cvd_divergence ship ready to run. The order-flow
write-up walks a full divergence and
absorption read on live data.