On this page
Cumulative buy volume — Tape & flow, in its own panel below the chart.
What Cumulative buy volume measures
Buy volume is summed across the usable levels of each bar, then accumulated forward from the session open, and the running total restarts at zero at every new session — the CME convention anchors that open at 17:00 Central Time. Levels with no quantity contribute nothing. If one bar's buy volume is unavailable, the running total for the rest of that session is reported as missing rather than silently continued, because an incomplete cumulative would understate everything after the gap; only the next session open restores a clean starting point. Within a session the line never declines, so its slope, not its level, is the readable quantity.
The formula, as implemented
This is not how the indicator is usually defined elsewhere — it is what the shipped code computes, documented next to the implementation:
Cumul intra-session de `pick(bar)` : repart de 0 à CHAQUE ouverture de session CME (`splitSessions` — les tranches couvrent les barres en ordre, le push séquentiel préserve l'alignement barre → point). */ function sessionCumulative( bars: readonly FootprintBar[], pick: (bar: FootprintBar) => number | null, ctx: SeriesContext, ): SeriesPoint[] { const pts: SeriesPoint[] = []; for (const s of splitSessions(bars, ctx)) { let running: number | null = 0; for (let i = s.start; i <= s.end; i++) { const value = pick(bars[i]); // Une jambe de volume absente rend tout le cumul suivant incomplet. // Seule l'ouverture d'une nouvelle séance permet de repartir de zéro. running = running !== null && value !== null ? running + value : null; pts.push({ time: bars[i].bucketTsNs, value: running }); } } return pts; } /** Moyenne + écart-type POPULATION (÷N) des N valeurs STRICTEMENT avant i (fenêtre [i−N, i−1]). `null` tant que la fenêtre n'est pas pleine — une statistique partielle mentirait sur sa période. */ function priorMeanStd( values: readonly number[], i: number, n: number, ): { mean: number; sd: number } | null { if (i < n) return null; let sum = 0; for (let j = i - n; j < i; j++) sum += values[j]; const mean = sum / n; let acc = 0; for (let j = i - n; j < i; j++) { const d = values[j] - mean; acc += d * d; } return { mean, sd: Math.sqrt(acc / n) }; } // ── Defs ──────────────────────────────────────────────────────────────────── /** Volume ACHETEUR cumulé de la session : Σ buyVolume (niveaux exploitables, qty=0 ignoré) depuis l'ouverture CME 17:00 CT, reset à CHAQUE ouverture (`splitSessions`) — la jambe buy du CVD, en absolu.
How to read it
- Read the slope. A steep segment means aggressive buying arrived quickly; a flat segment means it stopped, even if price kept moving.
- Compare it against cumulative sell volume in the same pane: two lines separating describe one-sided participation, two lines climbing in parallel describe two-sided trade that cumulative delta would show as flat.
- A steepening buy line while price stalls is the raw version of the absorption picture, and is worth checking against the footprint of the bars involved.
- The value is only comparable within one session. After the reset, comparing levels with the previous session means nothing.
- A break in the line is a data gap for the remainder of the session, not a drop in buying.
Parameters and defaults
The session anchor is fixed by the definition and is not a parameter, which leaves the line colour and the smoothing length. Smoothing is 1 by default and plots the raw cumulative. Averaging a series that only climbs mostly softens its slope changes, and the slope changes are the information the line carries, so there is rarely a reason to move it.
| Parameter | Type | Default | Range |
|---|---|---|---|
| Smoothing | number | 1 | 1 – 200 |
What it does not show
The line counts trades by aggressor side, so a bid that is filled counts as selling, not as buying — passive accumulation does not appear here. It says nothing about price, position, or the size of any resting order. It cannot be compared across sessions because of the reset, and it is unusable for the rest of a session once a bar's data is missing. On instruments whose activity does not match the anchored session, the reset falls at a point that means nothing for them.
Related indicators
- Tape Speed — Tape & flow
- Diagonal Imbalances — Tape & flow
- Stacked Imbalances — Tape & flow
- Absorption Score — Tape & flow
- Unfinished Auctions — Tape & flow
- Effort vs Result — Tape & flow
This page in other languages
Frequently asked questions
- When does cumulative buy volume reset?
- At every session open. The series is anchored on the CME session boundary at 17:00 Central Time, and the running total returns to zero there. That is also the only event that clears a gap: once a bar's buy volume is missing, the rest of that session is left unreported.
- How is cumulative buy volume different from cumulative delta?
- Cumulative delta accumulates buying minus selling, so it can rise and fall. Cumulative buy volume accumulates only the buying, so within a session it never declines. Plotting the buy and sell legs separately shows whether a flat delta came from low participation or from heavy two-sided trade.
- Why does the cumulative buy volume line stop mid-session?
- Because one bar's buy volume could not be determined, and every later total in that session would then be incomplete. Rather than continue a number known to be wrong, the series is left empty until the next session open resets it to zero.