QA GATE · GOOD 18/18 automated ai-check.js · 18 readability, YMYL and image gates · mechanics verified against vike-indicators · live real-data chart embedded
Burstiness (sentence-length SD)10.7
Lexical diversity (MATTR-50)0.84
Consecutive similar sentences2
Repeated paragraph starts (≥3)0
AI-marker phrases0
Demonstrated experience3
Avg sentence length (words)17.1
Repeated 5-grams0
H2 section balance (50–500w)0 off
YMYL risk disclaimeryes
Mechanics verified vs codeyes
Primary keyword coverageyes
Internal links + CTA7
Content visuals9
Every figure has a caption9/9
Alt / caption text coverage100%
Distributed (≥1 per section)6/7 (86%)
Filenames sluggedn/a (inline)
Live interactive chart6 real
Rust/Python port parity0.000e+00
Learn · Trading Indicators · Volume

Accumulation Distribution Line: What the CLV Multiplier Does

The accumulation/distribution line answers a sharper question than its volume-indicator siblings do. Rather than asking whether a bar closed up or down, it asks where inside its own range the close landed, and scales the bar's volume by that position. Vike computes it as batch_ad, with batch_adosc layered on top, both in the volume family of our engine.

That multiplier is the whole idea and the whole problem. It gives the line a resolution OBV cannot match, and it comes with a blind spot so large that once you see it, the indicator reads differently forever. Both are visible in the source, so we start there.

What the accumulation distribution line measures

ETH/USDT daily — a real Chaikin oscillator cross detected 2026-06-29, Chaikin oscillator crossed above zero → rose 10.1% in 4 days.

Picture a bar as a ruler. The low sits at minus one, the high at plus one, and the close falls somewhere along it.

That position is the close location value, and multiplying it by the bar's volume gives the bar's contribution. Close on the high, and the full volume counts as accumulation. Close dead centre, and the bar contributes nothing at all despite whatever turnover it printed. Close on the low, and every unit of it counts against.

Compare that with counting whole bars as one side or the other. A bar that closes fractionally higher gets the same treatment from OBV as one that rips fifteen percent, whereas here a bar closing mid-range is treated as the genuinely ambiguous event it was. Finer resolution, from the same single column of data.

The exact A/D formula our engine runs

highmidlow+1.0all volume counts up+0.4most of it counts up0.0the bar contributes nothing−0.9almost all counts down
The multiplier clv_series computes, before volume is applied. Only the bar’s own three prices are read — the previous close is never consulted, which is where the gap blindness comes from.
BNB/USDT daily — a real Chaikin oscillator cross detected 2026-05-21, Chaikin oscillator crossed above zero → rose 10.7% in 9 days.

Just two functions, one of them three lines long, and the details are where implementations part company.

How Vike computes it. clv_series gives each bar ((close - low) - (high - close)) / (high - low), writing that value only where a range exists, over an array pre-filled with zeros. batch_ad then seeds out[0] = clv[0] volume[0] and accumulates out[i] = out[i-1] + clv[i] volume[i]. batch_adosc subtracts a ten-bar exponential average of that line from a three-bar one, running directly on the line rather than on a defined tail, because the line has no warm-up to skip.

I ported both from the crate source, then checked them against the Python originals the crate was ported from, across 292 symbols and 356,886 daily bars. Maximum absolute difference on the line: zero. On the oscillator: zero. No position defined in one series and absent in the other.

Now the blind spot. Every price the multiplier reads belongs to the same bar — high, low, close, nothing else. The previous close is never consulted. So a bar that gaps down twenty percent and then recovers to finish at its high scores as maximum accumulation, full volume added, even though holders were crushed on the open.

The bar with no range, and the seed that is not zero

Bars where high equals low, so the multiplier is forced to zero1 day0 of 356,886 — never fired4 hours20 of 2,172,140 · 1 in 108,6071 hour2,591 of 8,700,086 · 1 in 3,357 · 1,761 carried real volume
A guard can be dead code and load-bearing at once. On daily candles it has never been needed; on hourly ones it stops a division by zero roughly nine times a day.

Two details the write-ups gloss, both settled explicitly in the source.

Division by zero first. When a bar's high equals its low there is no range to divide by, and the crate does not return a NaN, skip the bar, or produce an infinity: clv_series fills its output with 0.0 up front and writes only when the range is non-zero, so such a bar contributes precisely nothing and the line holds flat.

Does that guard earn its keep? On daily candles, never. Not once in 356,886 bars across nine years and 292 pairs — a daily crypto candle always has some range. Shorten the bar and it wakes up: 20 four-hour bars out of 2,172,140, then 2,591 hourly bars out of 8,700,086, roughly one in 3,357. Of those hourly cases, 1,761 traded real volume that the line silently discards. So the guard is dead code on a daily chart and load-bearing on an hourly one.

Second detail: the seed. OBV starts at zero, but this line starts at clv[0] * volume[0], its first bar's own contribution. Two cumulative indicators in one family that do not share an origin, which is another way of saying neither level means anything and only slope can be read.

How to trade the Chaikin oscillator

DODO/USDT daily — a real Chaikin oscillator cross detected 2026-08-06, Chaikin oscillator crossed below zero → fell 9.9% in 1 day.
BTC/USDT daily — a real Chaikin oscillator cross detected 2026-06-20, Chaikin oscillator crossed above zero → went the other way 8.1% first.

The line itself has no natural threshold, so the standard trade uses batch_adosc and its zero crossing instead — the three-bar average of the line rising above the ten-bar one, or falling below it.

Signals resolve first-touch over ten bars inside a symmetric eight percent bracket, putting break-even at 50% before fees, and a bar tagging both levels is scored a loss. Running the identical bracket over every bar in the sample gives the base rate each result has to beat.

Crossings above zero fired 16,016 times and resolved 50.4% winners, where an arbitrary long on the same bars managed 49.4%. Crossings below zero fired 16,079 times and also resolved 50.4%, against a random short's 48.9%.

So: a point above the base rate on one side, a point and a half on the other. That is the only measurement across these three volume pages that is not negative, and I want to be careful about how much weight it can bear. One percentage point on sixteen thousand samples is a real number and a useless one — it is nowhere near a round-trip in fees, and it says nothing about whether the effect survives on bars nobody has looked at yet. I've watched an edge that size disappear the moment costs were charged against it.

Where the accumulation distribution line fails

DOGE/USDT daily — a real Chaikin oscillator cross detected 2026-04-28, Chaikin oscillator crossed below zero → went the other way 12.7% first.
KAITO/USDT daily — a real Chaikin oscillator cross detected 2026-04-25, Chaikin oscillator crossed below zero → went the other way 9.5% first.
Three real failures, and BTC is the instructive one: the oscillator crossed above zero and price took the 8% stop before the target. That is what a 50.4% hit rate looks like from inside a single trade.

Divergence is where this indicator gets sold hardest, so I ran exactly the rule the OBV page runs, on this line, over the same bars.

Price at a fresh twenty-bar low with the line holding above its own: 20,374 signals, 47.8% resolved winners against a 49.4% base rate. Price at a twenty-bar high with the line lagging: 15,023 signals, 44.3% against 48.9%. Both directions land below random, and the bearish version gives up 4.6 percentage points — almost exactly what the same rule gave up on OBV.

Two indicators, different arithmetic, same verdict on the same claim. My honest conclusion is that volume-line divergence is not a signal in this market, and the agreement between two independent detectors is what convinced me rather than either result alone. When I saw the first shortfall I assumed the rule was simply mis-specified; seeing it again here removed that excuse.

Then there is the gap blindness, which no parameter can fix. Any market that trades in sessions — equities, futures with a settlement break — hands this line a systematic error every single morning.

A/D against OBV, on identical terms

batch_obvbatch_adreads: close vs previous closeverdict: whole bar, one sideresolution: three outcomesseed: 0reads: close inside its own rangeverdict: any fraction of the barresolution: continuous, −1 to +1seed: clv[0] × volume[0]opposite directions on 18.1% of 351,870 bars
Same column, two splits, and they contradict each other on nearly one bar in five. Running both is not confirmation — it is one reading with the disagreements hidden.

Both lines accumulate volume. Both are read as slopes. Run them side by side and they contradict each other far more than that shared description suggests.

Across the tape the two point in opposite directions on 63,698 of 351,870 bars, which is 18.1% — nearly one bar in five where two respectable volume indicators disagree about which side was buying. Neither is wrong. They are answering different questions, and stacking them is how a trader turns one uncertain reading into two confident ones.

What separates them is the CLV multiplier. Knowing which side of that gap your own chart sits on matters far more than either line's absolute level. Where a bar closes strongly off its low, a hammer and this line agree by construction, because both are reading position within the range. OBV, meanwhile, may well be recording that same bar as distribution.

Frequently asked questions

How does the A/D line differ from OBV? Weighting. This line scales each bar's volume by where the close sat inside its range; OBV counts the whole bar to one side based on the previous close. They disagree on 18.1% of bars.

What are the best Chaikin oscillator settings? Three and ten are the defaults and every figure here uses them. Given that the measured edge is around a point, tuning those numbers is optimising noise.

Does the accumulation distribution line predict reversals? Its divergence version underperformed a random entry in both directions over 35,397 signals. Whatever it is doing, calling reversals is not it.

Why does my A/D value differ from another platform's? Almost certainly the starting bar, since the series is cumulative and seeded at its first bar's contribution rather than at zero. Feed differences in reported volume account for the rest.

Should I use it with a momentum indicator? Pairing it with momentum is far more defensible than running two volume lines beside each other. The MACD reads price alone and the money flow index bounds a volume-weighted ratio, so each brings something this line does not have.

This is educational material, not financial advice. Every figure here is measured on bars that have already closed, past behavior generalizes poorly, and trading carries real risk of loss — size any position so that being wrong stays affordable.

Read the money flow index breakdown