For the Geeks

Most CVD indicators on TradingView use one of two approaches to estimate directional volume from candle data. The first looks at whether the candle closed higher than it opened and assigns the bar's full volume to the...

Written By Axiom Admin

Last updated About 1 month ago

For the Geeks

Most CVD indicators on TradingView use one of two approaches to estimate directional volume from candle data. The first looks at whether the candle closed higher than it opened and assigns the bar's full volume to the winning side β€” green bar means buying, red bar means selling. The second splits volume proportionally based on where the close sits within the bar's range β€” close near the high means mostly buying, close near the low means mostly selling.

Both approaches produce a number. Neither one captures very much about what actually happened inside the bar β€” and the gap between the number and reality matters more than most traders realize.

Consider a 5-minute candle that opens at 100, drops to 97, then rallies back to close at 101. The close-vs-open method calls it buying β€” the bar is green. The proportional method says close is near the high, so mostly buying. But the bar actually spent significant time trading lower before reversing. The lower wick represents real volume committed in the other direction. A simple split treats that wick as if it never happened, or at best as a minor proportion of the range. On a chart full of bars like this β€” candles with meaningful wick structure, rejection patterns, absorption signatures β€” the cumulative error adds up. The CVD line drifts in a direction that reflects candle color more than it reflects what the volume was doing inside those candles.

Axiom CVD Osc Lite uses a different method. This page explains what that method considers, how the tuning parameters shift its behavior, and how the normalization works β€” in terms you can reason about without needing to see the code. The goal is to help you predict how the oscillator will behave on different types of candle structure and to give you enough understanding to trust the readings when they deserve trust and question them when they do not.

This page does not expose the implementation. You will not find formulas, threshold values, or enough detail to reconstruct the model. What you will find is a working mental model of the classification logic β€” enough to use the tool with real understanding of what it is doing.


The participation model

What it looks at

For each bar at the slot's configured timeframe, the indicator fetches sub-bar OHLCV data at the Lower TF Precision resolution. If the slot is set to 60 minutes and the Lower TF Precision is set to 1 minute, the model receives up to sixty 1-minute candles to work with. It examines each sub-bar individually, looking at three aspects of its candle structure:

  1. Body direction and proportion. Is the bar bullish or bearish? How large is the body relative to the total bar range? A candle with a large body relative to its wicks is making a more committed directional statement than a candle where the body is a sliver of the total range.

  1. Close position within the range. Where does the close sit between the bar's high and low? A close near the high suggests buyers held control through the bar's formation. A close near the low suggests sellers did. A close in the middle is ambiguous.

  1. Wick imbalance. How do the upper and lower wicks compare? A long lower wick with a short upper wick suggests price tested lower and was rejected β€” a sign of buying absorption, regardless of the body's direction. A long upper wick with a short lower wick suggests the opposite. The Wick Weight setting controls how much this factor influences the classification.

These three aspects are combined into a single directional score for each sub-bar. The score is not a continuous number that gets fed directly into the CVD calculation β€” it is used to sort the bar into one of five discrete categories.

Five buckets, not a spectrum

This is one of the key design choices that makes this model behave differently from a simple volume split. Instead of producing a continuous value from -1 to +1 (where every bar gets some fractional directional assignment), the model classifies each sub-bar into one of five discrete buckets:

  • Strong bullish β€” the candle structure strongly favors buyers. The bar's full volume is counted as buying.

  • Weak bullish β€” the structure leans bullish but is not definitive. A reduced fraction of the bar's volume is counted as buying.

  • Neutral (carry) β€” the structure is genuinely ambiguous. The bar does not get zero contribution β€” instead, it carries a dampened fraction of the last classified direction. This is the carry state, explained below.

  • Weak bearish β€” the structure leans bearish but is not definitive. A reduced fraction of the bar's volume is counted as selling.

  • Strong bearish β€” the candle structure strongly favors sellers. The bar's full volume is counted as selling.

The boundaries between these buckets are not fixed β€” they are controlled by Pressure Sensitivity. At higher sensitivity, the thresholds are lower, meaning bars are more easily promoted into the strong or weak buckets. At lower sensitivity, bars need more definitive candle structure to earn a strong classification, and more bars stay in or near the neutral zone.

Why five buckets instead of a continuous score? A continuous approach treats a clean momentum candle and a noisy doji as points on the same scale β€” the doji might get a classification of 0.15 bullish, which is technically directional but practically meaningless. The bucket approach forces a decision: is this bar genuinely directional, weakly directional, or too ambiguous to classify? That forced decision means the model does not accumulate small fractions of false directionality from bars that are really just noise. The tradeoff is that the classification is coarser β€” there is no distinction between a "barely strong bullish" and a "decisively strong bullish" bar within the same bucket. Both contribute the same amount.

The carry state

When the model encounters a bar whose candle structure is too ambiguous to classify as even weakly directional, it does not assign zero. Instead, it carries a reduced fraction of the last classified direction forward into the current bar.

The reasoning: during a genuine trend, there will be bars that pause or consolidate without reversing. A simple split model treats those bars as directional noise β€” a slight green close gets counted as buying, a slight red close as selling, regardless of the broader flow. The carry approach says: "this bar is not making a clear statement, so I will assume the prior flow continues at a reduced weight until something definitive changes."

The amount of carry is influenced by Pressure Sensitivity. At higher sensitivity, more of the prior direction is carried through neutral bars, making the oscillator more persistent during trends. At lower sensitivity, neutral bars contribute very little, making the oscillator more willing to flatten during pauses.

The tradeoff: Carry logic makes the model path-dependent. The classification of a neutral bar depends on what came before it β€” two identical dojis will be classified differently if one followed a string of bullish bars and the other followed bearish bars. This is a feature, not a bug: it captures the intuition that a consolidation pause during an uptrend means something different from the same pause during a downtrend. But it means the model has memory, and that memory can occasionally persist a directional read longer than the market actually supports.

When carry helps: During genuine trends that include pauses. A clean uptrend with periodic doji bars or small-bodied candles will keep the CVD line drifting upward through those pauses, reflecting the reasonable assumption that the trend has not reversed. Without carry, those neutral bars would contribute zero, and the CVD line would flatten during every consolidation even when the broader flow has not changed.

When carry misleads: At actual turning points. If the market transitions from a trend into a range and the first few bars of the range are ambiguous rather than clearly directional, the carry state continues pushing CVD in the prior direction. The oscillator will lag the actual shift until enough bars arrive with clear enough structure to override the carry. This is one reason the oscillator can show a directional reading for several bars past a genuine reversal β€” the carry is still echoing the old trend through the ambiguous transition bars.


How Pressure Sensitivity works

Pressure Sensitivity is a single number (0.25 to 4.0) that adjusts the model in two related ways:

It shifts the classification thresholds. At low values, a sub-bar needs strong candle structure β€” a large body relative to range, close near the extreme, minimal opposing wick β€” to earn a "strong" classification. At high values, the thresholds are lower, so weaker candle structures get promoted to the strong bucket.

It increases carry persistence. At low values, the carry fraction applied to neutral bars is small β€” neutral bars contribute very little to the running CVD. At high values, neutral bars carry more of the prior classified direction, keeping the oscillator more committed during ambiguous periods.

The practical effect: turning sensitivity up makes the oscillator more opinionated. It reacts sooner to candle structure, commits more strongly to directions, and persists through pauses. Turning it down makes the oscillator more conservative β€” it waits for clearer structure before classifying, contributes less during neutral bars, and is quicker to flatten when conviction drops.

How to predict the effect of a change: If you raise Pressure Sensitivity and the oscillator becomes more responsive during trending periods without whipsawing during consolidation, the instrument's candle structure is giving the model enough to work with at the new threshold. If you raise it and the oscillator starts swinging aggressively during choppy periods, you have lowered the thresholds past the point where the instrument's candle structure can support confident classification.

How to verify on-chart: Set Pressure Sensitivity to 0.50 and observe the oscillator on a period of mixed price action. Then raise it to 3.0 and watch the same period. At 0.50, the oscillator should be flatter and less reactive. At 3.0, it should swing further and respond sooner. The difference in behavior during trending periods tells you how much the thresholds matter for that instrument. The difference during choppy periods tells you how much over-classification risk you are taking on.


How Wick Weight works

Wick Weight controls how much wick imbalance influences the directional score that feeds the bucket classification. At 0.0, wicks are ignored entirely β€” the model classifies based only on body direction and close position. At 0.50 (the maximum), wick rejection has significant influence over the classification.

What "wick rejection" means here: If a sub-bar has a long lower wick and a short upper wick, that suggests the price tested lower and was rejected β€” buyers absorbed the selling. Even if the bar's body is flat or slightly bearish, the wick structure suggests buying pressure was present. Higher Wick Weight lets this information upgrade the bar's classification toward bullish (or neutralize a bearish classification that the body alone would have produced).

The practical effect: On instruments where wick structure is informative β€” markets with genuine rejection dynamics, where a long wick reliably indicates that one side was absorbed β€” increasing Wick Weight improves the model's sensitivity to those dynamics. On instruments where wicks are noise β€” thin order books, erratic fills, candles that routinely produce long wicks without meaningful rejection β€” increasing Wick Weight adds noise to the classification.

How to verify on-chart: Set Wick Weight to 0.0 and observe the oscillator on a chart with visible rejection candles (long wicks on one side). Then raise it to 0.40 or 0.50. If the oscillator captures the rejection dynamics more accurately (moves in the direction the rejection implies), the wicks on that instrument are informative and the higher weight is helping. If the oscillator becomes noisier without being more useful, the wicks are not adding reliable information.


Asymmetric normalization

After the participation model produces a raw CVD accumulation for each bar in the window, that accumulation is normalized to the -100 to +100 display range. The normalization is not a simple min-max scaling of the full range. Instead, the positive side and negative side are normalized independently.

What this means: The oscillator tracks two separate range boundaries within each window β€” the highest positive CVD reached (period high) and the lowest negative CVD reached (period low). Positive CVD values are scaled against the period high. Negative CVD values are scaled against the absolute value of the period low. Each side maps to 0–100 within its own polarity.

Why it matters: Standard symmetric normalization uses the full range (period high minus period low) as the denominator for everything. That works fine when the range is roughly balanced. But in a session where the first major move is strongly bullish β€” pushing the period high to a large positive value β€” the entire denominator gets inflated by that spike. Later moderate bearish CVD, which represents real selling pressure, gets compressed to a tiny negative number because it is being measured against a range that was blown wide by the bullish spike. The bearish reading looks like nothing happened, even though meaningful selling pressure was present.

Asymmetric normalization prevents this by keeping the denominators separate. The bullish spike inflates only the positive side's range. The bearish readings scale against their own, more modest, negative range β€” and show up as proportionally significant.

The tradeoff: Because +80 and -80 reference different range boundaries, they are not directly comparable in absolute terms. A +80 means "80% of the way to the most extreme positive CVD in this window." A -80 means "80% of the way to the most extreme negative CVD in this window." If the positive extreme was reached on heavy volume and the negative extreme on light volume, the same face value represents different levels of commitment.

How to verify on-chart: Find a session where the first strong move was in one direction, followed by a moderate reversal. Under asymmetric normalization, the reversal should register as a meaningful negative reading (say, -40 to -60), not a flattened value near zero. If the oscillator were using symmetric normalization, the reversal would be visually compressed by the large one-sided move that preceded it.


What this page does not cover

This page explains the design reasoning behind the estimation model's mechanics so you can predict the oscillator's behavior and understand what shapes its readings. It does not provide the specific weights, thresholds, interpolation curves, or formulas that would allow the model to be reproduced in code. The goal is informed use, not reconstruction.

If you have questions about how these mechanics interact with specific instruments or market conditions, the Workflows page covers validated use patterns, and the Limitations and Trust Boundaries page maps the broader trust perimeter.