Volume and Delta
In this chapter: You will learn how the raw stream of gold trades is turned into the numbers that order-flow traders read: how each trade gets labelled a "buy" or a "sell" (and where that label can be wrong), how to judge a bar's volume against the normal activity for its time of day, how a footprint bar opens a candle up price by price, how bar delta and delta percentage summarise aggression, and how cumulative volume delta (CVD) adds it all up. You will also meet the CVD "anchor trap", see why high volume never tells you direction by itself, and get a first, careful look at what it means when delta and price disagree. Everything here is a measurement. None of it is a signal.
---
Who Hit Whom? Classifying Trades as Buys or Sells
Chapter 2 established that every trade has one buyer and one seller, so "buy" and "sell" in order flow can only mean one thing: which side was the aggressor. A trade is called a "buy" when an impatient buyer crossed the spread and took a waiting seller's offer. It is called a "sell" when an impatient seller crossed the spread and hit a waiting buyer's bid. Every number in this chapter (footprint cells, delta, CVD) rests on getting this label right.
There are two ways to find out who was aggressive.
Method 1: the exchange tells you
CME's market-data feed, called MDP 3.0, publishes a Trade Summary message for every trade. One of its fields is AggressorSide (FIX tag 5797):
| AggressorSide value | Meaning |
|---|---|
| 1 | The aggressor was the buyer |
| 2 | The aggressor was the seller |
| 0 | No aggressor |
CME defines the aggressor as the order that, on entering the book, immediately triggers a trade. That is exactly the definition we used in Chapter 2.
Some trades legitimately have no aggressor. The most important example is the opening auction: when the market reopens after the daily halt or after a pause, orders accumulated during the pre-open are matched all at once at a single price. Nobody "crossed the spread", so no side is aggressive. Some implied trades, which arise when orders in calendar-spread markets are combined with orders in individual contract months, can also carry no aggressor flag.
Method 2: compare the trade with the quote
Many platforms and feeds do not pass the exchange flag through to the chart. Instead, they compare each trade with the bid and ask at the moment of the trade, a method called the quote rule (or the at-ask/at-bid rule):
- trade price at or above the ask → aggressive buy (the buyer lifted the offer);
- trade price at or below the bid → aggressive sell (the seller hit the bid).
In NinjaTrader this is the BidAsk method of calculating delta.
A worked example: ten gold prints
Here are ten consecutive GC trades from a busy morning minute, laid out the way you would see them on Time & Sales, with the bid and ask that were in force at the time. (GC prices around 4000 correspond to roughly 3,970–3,973 on XAUUSD; the gap is approximate and changes over time.)
| # | Time (ET) | Price | Size | Bid | Ask | Label (quote rule) |
|---|---|---|---|---|---|---|
| 1 | 09:31:02.114 | 4000.1 | 3 | 4000.0 | 4000.1 | Buy |
| 2 | 09:31:02.120 | 4000.1 | 12 | 4000.0 | 4000.1 | Buy |
| 3 | 09:31:02.388 | 4000.0 | 5 | 4000.0 | 4000.1 | Sell |
| 4 | 09:31:02.391 | 4000.0 | 1 | 4000.0 | 4000.1 | Sell |
| 5 | 09:31:02.905 | 4000.1 | 22 | 4000.0 | 4000.1 | Buy |
| 6 | 09:31:03.010 | 4000.2 | 8 | 4000.1 | 4000.2 | Buy |
| 7 | 09:31:03.011 | 4000.2 | 30 | 4000.1 | 4000.2 | Buy |
| 8 | 09:31:03.350 | 4000.1 | 4 | 4000.1 | 4000.2 | Sell |
| 9 | 09:31:03.612 | 4000.2 | 6 | 4000.1 | 4000.3 | ? |
| 10 | 09:31:03.700 | 4000.3 | 10 | 4000.2 | 4000.3 | Buy |
Adding up: aggressive buys = 3 + 12 + 22 + 8 + 30 + 10 = 85 contracts; aggressive sells = 5 + 1 + 4 = 10 contracts; unclassified = 6 contracts (print 9). Total volume = 101. Net aggression (buys minus sells) = +75, with 6 contracts we could not label.
Print 9 is the interesting one. For a moment the spread had widened to two ticks (bid 4000.1, ask 4000.3), and the trade printed at 4000.2, in the middle. It is neither at the bid nor at the ask, so the quote rule cannot decide.
Where the quote rule goes wrong
The quote rule is simple and usually right, but it has three weak spots:
- Synchronisation. Quotes and trades arrive as separate messages, milliseconds apart. If the platform pairs a trade with a quote that is slightly too early or too late, a trade at the old ask may be compared with a new bid and get the wrong label. This happens most in fast markets: data releases, the open, sudden moves.
- Trades inside the spread. When the spread is wider than one tick, or changes at the instant of the trade, a print can land between bid and ask, like print 9.
- Sweeps. A large aggressive order that eats through several price levels is reported as several prints at different prices. Each print is labelled separately, and the later ones can be compared against quotes that have already moved.
The practical conclusion: the delta you see on screen is a measurement with a small error, not absolute truth. The error is usually small, but it exists, and it is largest exactly when markets are fastest.
Key idea: "Buy" and "sell" in order flow mean aggressive buy and aggressive sell. The label comes either from the exchange's aggressor flag or from comparing the trade with the bid and ask, and both routes have edge cases.
Common mistake: "A trade at the bid means someone bought." Every trade has a buyer, but a trade at the bid means an aggressive seller hit the bid. The buyer was passive.
Common mistake: "My platform's delta is 100% accurate." Accuracy depends on the feed and the classification method. And some trades, such as those in the opening auction, have no aggressor at all.
---
When Quotes Fail: The Tick Rule and Lee-Ready
What should happen to a trade like print 9? Academic market microstructure, the study of how trading works at the level of individual orders, has worked on this question for decades, because many historical data sets have no aggressor flag at all.
The tick rule
The tick rule (or tick test) ignores quotes and compares each trade with the previous trade's price:
- higher than the previous trade (an uptick) → buy;
- lower (a downtick) → sell;
- the same price (a zero tick) → inherit the direction of the last price change. A zero tick after an uptick (a zero-uptick) is a buy; a zero tick after a downtick (a zero-downtick) is a sell.
Example sequence of GC trades:
| Trade price | Change | Tick-rule label |
|---|---|---|
| 4000.1 | (start) | — |
| 4000.2 | uptick | Buy |
| 4000.2 | zero-uptick | Buy |
| 4000.1 | downtick | Sell |
| 4000.1 | zero-downtick | Sell |
| 4000.2 | uptick | Buy |
The tick rule needs nothing but trade prices, which makes it easy to apply to any data. NinjaTrader's UpDownTick delta method follows this logic.
Its weakness shows up in quiet, ranging markets. Suppose gold trades back and forth between 4000.0 and 4000.1 for several minutes, and the last price change was an uptick. Dozens of trades at 4000.1 will all be labelled buys simply because of one old uptick, even if many of them were sellers hitting a bid that had moved up to 4000.1. The tick rule carries errors forward.
Lee-Ready
In 1991, Charles Lee and Mark Ready proposed combining the two approaches. The Lee-Ready algorithm:
- Compare the trade with the midpoint of the bid and ask (the quote rule in its midpoint form): above the midpoint → buy; below → sell.
- If the trade is exactly at the midpoint, use the tick rule.
Apply it to print 9 from the previous section. The bid was 4000.1 and the ask 4000.3, so the midpoint was 4000.2, exactly where the trade printed. Step 2 applies: the previous trade (print 8) was at 4000.1, so 4000.2 is an uptick, and Lee-Ready labels print 9 a buy.
How accurate is it? Studies on stock markets, where researchers could check against true order data, have reported accuracy of roughly 80–90%. That figure varies with the market, the period and the data quality, and fast electronic markets tend to be harder. The lesson is not the exact number. It is that even the best inference methods mislabel a meaningful share of trades.
Same bar, different delta sign
The choice of method is not a technicality. It can flip the sign of a bar's delta. Here is a small constructed example of five GC trades in a choppy moment:
| Trade | Price | Size | Bid / Ask at the time | Quote rule | Tick rule |
|---|---|---|---|---|---|
| A | 4000.0 | 20 | 4000.0 / 4000.1 | Sell | Sell (downtick from 4000.1) |
| B | 4000.1 | 50 | 4000.1 / 4000.2 | Sell (at bid) | Buy (uptick) |
| C | 4000.1 | 30 | 4000.1 / 4000.2 | Sell (at bid) | Buy (zero-uptick) |
| D | 4000.1 | 15 | 4000.0 / 4000.1 | Buy (at ask) | Buy (zero-uptick) |
| E | 4000.0 | 10 | 4000.0 / 4000.1 | Sell | Sell (downtick) |
- Quote rule (BidAsk): buys 15, sells 20 + 50 + 30 + 10 = 110 → delta −95.
- Tick rule (UpDownTick): buys 50 + 30 + 15 = 95, sells 20 + 10 = 30 → delta +65.
Same five trades, opposite conclusions. The disagreement comes from trades B and C: the quotes had moved up, so sellers were hitting a higher bid, but the tick rule only saw that the price was higher than before.
An honest "unknown" bucket
There is a third option that deserves more use: admitting you do not know. The approach we prefer works like this:
- Use the quote rule first.
- If the quote cannot decide, use the tick rule only when the previous trade was very recent (a fraction of a second earlier) and at a different price, so the tick direction reflects fresh information.
- Otherwise label the trade UNKNOWN and leave it there. It is never moved into buys or sells later.
The result is a delta that is slightly "smaller", because some volume is set aside, but less contaminated by guesses. It also lets you report how much of the volume was labelled by each method, which tells you how much to trust the number on a given day.
No method is perfect. What matters most is consistency, so that comparisons from day to day are meaningful, and transparency, so that you and anyone reading your charts know what the numbers mean.
Key idea: Trade classification is inference, not observation, unless you have the exchange's aggressor flag. Prefer a consistent method, know which one your platform uses, and treat unknowns honestly.
Common mistake: "UpDownTick and BidAsk are the same thing." They are different methods and can give different results, sometimes with opposite signs.
Common mistake: "Lee-Ready is 85% accurate everywhere." Accuracy depends on the market, the period and the data quality.
Try it: If your platform offers both BidAsk and UpDownTick delta, display both on the same 1-minute GC chart during a quiet Asian-session hour. Count how many bars show deltas with opposite signs.
---
Volume per Bar and Relative Volume
Before splitting volume into buys and sells, it helps to read the simplest number of all: how much traded in a bar.
Bar volume
Bar volume is the total size of all trades during a bar's time window, measured in contracts for GC. Platforms usually draw it as a histogram under the price chart.
One detail confuses many beginners: the histogram bars are usually coloured by the candle's direction. A green volume bar means the candle closed higher than it opened. It does not mean buyers were more aggressive. A green candle can have more aggressive selling than buying, as you will see when we reach delta.
Gold's daily rhythm
Gold trades nearly 23 hours a day, from Sunday 18:00 to Friday 17:00 New York time, with a daily halt from 17:00 to 18:00. Volume is very uneven across that clock. Asian hours are usually quiet, activity rises with London from around 03:00 ET, and the busiest stretch is normally the London–New York overlap, especially around US data releases (often at 08:30 ET) and the first hours of the New York session.
This means a raw number like "800 contracts in five minutes" has no fixed meaning. At 02:00 ET it may be exceptional; at 09:35 ET it may be quiet.
Relative volume (RVOL)
The fix is to compare each bar with what is normal for that time of day. Relative volume (RVOL) is:
RVOL = bar volume ÷ average volume of bars at the same clock time over the previous N days
Here is an illustrative example with round numbers (not from a specific day). Suppose that over the previous 20 trading days:
- the average 5-minute GC bar at 02:00–02:05 ET traded 250 contracts;
- the average 5-minute bar at 09:35–09:40 ET traded 2,400 contracts.
Today, both bars trade 800 contracts.
| Bar | Volume | Same-time average | RVOL |
|---|---|---|---|
| 02:00–02:05 ET | 800 | 250 | 800 ÷ 250 = 3.2 |
| 09:35–09:40 ET | 800 | 2,400 | 800 ÷ 2,400 ≈ 0.33 |
The same raw volume is three times normal in the first case and one third of normal in the second. RVOL = 2 simply means "twice the usual activity for this hour."
Simpler alternatives exist: comparing a bar with a moving average of the last N bars' volume, or ranking a bar by percentile within the day. These are easy to compute, but they do not fully remove the time-of-day effect. A moving average of the last 20 five-minute bars at 08:35 ET is still mostly made of quieter pre-data bars.
Volume filters: where to look, not what to do
A volume filter marks bars whose relative volume exceeds a chosen threshold, for example "more than twice normal for this hour". Treat such marks as an attention highlight: "something unusual happened here in terms of activity." They are not buy or sell signals. As you will see later in this chapter, high volume has no direction.
What distorts the averages
Several calendar effects can make "normal" misleading:
- Roll periods, when traders move from one contract month to the next. Volume collapses in the old contract and surges in the new one (Chapter 1).
- Holidays and shortened sessions, which shrink volume.
- Scheduled data releases, which make the same minute look huge every month.
- Daylight-saving changes. The US and Europe change clocks on different dates, so for a few weeks a year the London–New York overlap shifts by an hour.
Key idea: Volume only means something relative to its hour. Compare like with like.
Common mistake: "A green volume bar means buyers were stronger." It only means the candle closed above its open.
Common mistake: "A fixed threshold of 1,000 contracts works for every hour." Asia and New York are not comparable.
Common mistake: "An exceptionally high-volume bar is always a turning point." This is a popular claim, not proven.
---
Inside the Candle: Volumetric and Footprint Bars
A candle compresses everything that happened in its time window into four prices. A footprint reverses that compression. Different platforms use different names: NinjaTrader calls it Volumetric Bars, ATAS calls it Clusters, Sierra Chart calls it Numbers Bars. The idea is the same: for every price level inside the candle, show how much traded and which side was aggressive.
Chapter 8 is devoted to footprint charts. Here we only need to learn to read one.
Reading bid × ask
The most common layout is bid × ask. At each price inside the bar you see two numbers:
- the left number is the volume that traded at the bid, which means aggressive selling;
- the right number is the volume that traded at the ask, which means aggressive buying.
For example, a level reading 35 × 120 at 4001.2 means that at that price, 35 contracts were sold aggressively and 120 were bought aggressively. The total volume at the level is 35 + 120 = 155.
Here is a complete small footprint for one illustrative 5-minute GC candle that opened at 4000.6, traded between 4000.4 and 4001.2, and closed at 4001.0:
| Price | Bid (aggr. sells) | Ask (aggr. buys) | Level volume |
|---|---|---|---|
| 4001.2 | 35 | 120 | 155 |
| 4001.1 | 88 | 142 | 230 |
| 4001.0 | 210 | 265 | 475 |
| 4000.9 | 160 | 190 | 350 |
| 4000.8 | 130 | 115 | 245 |
| 4000.7 | 95 | 70 | 165 |
| 4000.6 | 60 | 48 | 108 |
| 4000.5 | 72 | 30 | 102 |
| 4000.4 | 40 | 20 | 60 |
| Total | 890 | 1,000 | 1,890 |
What can we read from it?
- Total volume for the bar is 1,890 contracts.
- The level with the most volume is 4001.0, with 475 contracts. That level is the bar's point of control (POC): the price where the most trading took place inside the candle. Here it sits near the top, not in the middle.
- The low of the bar (4000.4) traded only 60 contracts: price touched it briefly with little business done.
- Overall, 1,000 contracts were bought aggressively and 890 sold aggressively. That difference is the bar's delta, the subject of the next section.
The candle chart would have shown only: open 4000.6, high 4001.2, low 4000.4, close 4001.0. The footprint shows where the business was done and who initiated it.
Other ways to display the same data
Platforms offer several views of the same per-level data:
- a volume profile inside the bar: a small horizontal histogram of total volume at each price;
- delta per level: ask minus bid at each price;
- bar statistics under each candle: total volume, delta and more.
In the bid × ask layout, experienced readers also compare numbers diagonally (the bid at one price with the ask one tick higher) to look for imbalances. That technique belongs in Chapter 8; for now, the basic reading is enough.
Settings that change the picture
Footprints are sensitive to settings, so two charts of the same gold candle can look different:
- Ticks per level. Each row can be one tick ($0.10) or several ticks grouped together. Larger groupings are easier to read but hide detail. A busy gold candle with a $5 range has 50 one-tick levels; grouped by 5 ticks, it has 10.
- Bar type. Time bars (for example, 5 minutes), tick bars, volume bars and range bars all slice the same trades differently.
- Classification method. BidAsk, UpDownTick or an approach with an unknown bucket, as described above.
- Historical data. Building past footprints accurately requires historical tick data with the bid and ask at each trade. Without it, history is either unavailable or rebuilt with a different method than live data.
What a footprint cannot show
A footprint shows what happened, not what will happen. It also shows only trades. Orders that were placed and cancelled, which can matter a great deal, appear nowhere in it (Chapter 10 deals with the order book).
Key idea: In a bid × ask footprint, left = aggressive sells, right = aggressive buys, and their sum is the volume at that price.
Common mistake: "The left number is buyers who bought at the bid." The buyers at the bid were passive. The footprint counts the aggressive side, which at the bid is the seller.
Common mistake: "The bar's POC always becomes support or resistance." This is a popular claim, not proven.
---
Bar Delta: Net Aggression in One Number
A footprint holds a lot of numbers. Bar delta summarises them in one.
The formula
Bar delta = aggressive buy volume − aggressive sell volume
In footprint terms: the sum of the ask column minus the sum of the bid column. For the candle above, delta = 1,000 − 890 = +110.
A larger worked example: a 5-minute GC bar with 1,200 contracts traded at the ask and 900 at the bid has:
- delta = 1,200 − 900 = +300;
- total volume = 2,100 (assuming no unclassified trades).
Delta percentage
A raw delta of +300 means different things in different bars. Delta % normalises it:
Delta % = delta ÷ total volume
For our bar: 300 ÷ 2,100 ≈ 14%. Compare:
| Bar | Volume | Delta | Delta % |
|---|---|---|---|
| Quiet Asian bar | 500 | +300 | +60% |
| Our New York bar | 2,100 | +300 | +14% |
| Data-release bar | 10,000 | +300 | +3% |
The same +300 is overwhelming one-sidedness in the first bar and almost perfect balance in the third. Delta % is what lets you compare bars of very different sizes fairly.
Max delta and min delta
Delta changes continuously as a bar forms. Many platforms show the max delta (the highest value delta reached during the bar) and the min delta (the lowest). A bar might close with delta +300 after spending part of its life at −400. Those two numbers sketch the path of aggression inside the bar, something the closing delta alone hides.
What positive delta tells you, and what it does not
A positive delta tells you exactly one thing: during this bar, buyers were more in a hurry than sellers. More contracts were bought by crossing the spread than were sold by crossing it.
It does not tell you:
- That price went up. A bar can close lower with positive delta. Picture aggressive buyers repeatedly lifting offers while a large seller keeps refilling the offer side with passive limit orders and the bid side quietly steps lower. Plenty of aggressive buying, yet a red candle.
- That "smart money" was buying. Identity is invisible, and many large participants trade passively.
- That the next bar will be higher. Delta describes the bar that just finished.
- Anything independent of classification. As shown above, the method can change the number, even its sign.
There is a simple way to keep this in perspective. Every bar is an interaction between aggressors, which delta measures, and passive orders, which delta does not see at all. Delta is half the story.
In our own testing, the sign of a bar's delta on its own did not predict the direction of the following bars once costs were included. Think of delta as a measurement of aggression, not a signal.
Key idea: Delta measures who was in a hurry, not who was "stronger", and not where price goes next.
Common mistake: "Positive delta means price will go up." Not necessarily, in this bar or the next.
Common mistake: "Delta is the number of buyers minus the number of sellers." Delta counts contracts, not people, and bought and sold contracts are always equal; delta measures only the aggressive side.
Common mistake: "A red candle with large positive delta is certain absorption and a reversal." This is a popular claim, not proven.
Try it: Take ten consecutive 5-minute GC bars and write each bar's delta and delta % underneath. Mark any green bar with negative delta and any red bar with positive delta. They are more common than most people expect.
---
Cumulative Volume Delta (CVD): The Running Total
Bar delta describes one bar. Cumulative volume delta (CVD) strings bars together.
The formula
CVD is the running sum of bar deltas from a chosen starting point, called the anchor:
CVD(n) = Δ(1) + Δ(2) + … + Δ(n)
Worked example: four bars with deltas +300, −100, +250, −50.
| Bar | Bar delta | CVD |
|---|---|---|
| 1 | +300 | 300 |
| 2 | −100 | 200 |
| 3 | +250 | 450 |
| 4 | −50 | 400 |
CVD is usually drawn as a line, or as "CVD candles", in a panel under the price chart.
Reading CVD: the slope, not the number
- Rising slope: over this stretch, aggressive buying has outweighed aggressive selling.
- Falling slope: aggressive selling has dominated.
- Flat: aggression has been roughly balanced.
- Compared with price: if price and CVD move together, the move is accompanied by aggression from the same side. If they do not, there is a disagreement (the last section of this chapter).
The absolute level of CVD, such as "+12,400", means almost nothing on its own, because it depends entirely on where the sum started. What carries meaning is the change over a specific stretch of time. That is the gateway to the next section, on anchors.
CVD inherits, and accumulates, delta's limits
- Errors add up. Small classification errors, harmless in a single bar, accumulate over hours. A CVD line can slowly drift for reasons that have nothing to do with the market.
- Opening or closing? CVD does not know whether aggressive buying came from new buyers or from sellers closing short positions (short covering). Both look identical.
- Passive flow is invisible. A large participant buying patiently with limit orders all day can build a big position while CVD slopes down, because every one of their fills counts as an aggressive sell by someone else.
The realistic use of CVD is to summarise the flow of aggression across a session at a glance and compare it with the path of price. It is context, not an entry signal.
Key idea: Read the slope of CVD over a defined window. The absolute number depends on where you started counting.
Common mistake: "Positive CVD means more money came into gold today." It means more net aggressive buying, nothing more.
Common mistake: "CVD always turns before price." This is a popular claim, not proven.
---
The CVD Anchor Trap: Session Reset vs Chart Load
Because CVD is a running total, the anchor controls what you see. This is one of the most common sources of confusion in order flow, and it is easy to avoid once you understand it.
Trap 1: "since chart load"
Many platforms, by default, start the sum at the first bar loaded on the chart. Load five days of history today and ten days tomorrow, and the CVD line starts from a different place.
Suppose that over the five days before today, net delta was +4,800, while over the ten days before today it was −2,300. Today's own net aggression is +1,150 either way. But:
| Chart setting | CVD at today's start | CVD at today's end |
|---|---|---|
| Since load, 5 days | +4,800 | +5,950 |
| Since load, 10 days | −2,300 | −1,150 |
| Session reset | 0 | +1,150 |
Mathematically, loading more history shifts the line by a constant on the days the two charts share. In practice, though, the panel rescales, the earliest loaded bars differ, data gaps fall in different places, and any comparison involving the start of the data changes. Screenshots stop being reproducible and level comparisons become meaningless. ATAS, for example, states plainly that without its session delta mode, the indicator uses all the loaded data.
Session reset
The alternative is to reset CVD to zero at the start of each session. Days become comparable: each day's CVD answers the same question. But that raises the next question: which session? For gold the reasonable choices include:
| Anchor | Starts at | Question it answers |
|---|---|---|
| CME trading day | 18:00 ET the previous evening | Net aggression since the official trading day began |
| Asia | 18:00 ET | Net aggression during the Asian session |
| London | about 03:00 ET | Net aggression since London became active |
| New York | about 08:20 ET | Net aggression since the New York open (many educators prefer this for intraday work) |
| New York initial balance | 08:20 ET, first hour | Net aggression during New York's opening hour |
Remember from Chapter 1 that the CME trading day starts at 18:00 ET the evening before, so a Monday-evening Asian session belongs to Tuesday's trading day.
Why the anchor can change a "divergence"
Here is a concrete case. During one illustrative day, GC makes a high at 4020.0 at 04:10 ET during London, and a slightly higher high at 4024.0 at 10:30 ET during New York (about 3,990–3,993 and 3,994–3,997 on XAUUSD).
- Anchored at the CME day (18:00 ET): CVD was +1,500 at the London high and +1,300 at the New York high. Price made a higher high, CVD a lower high: it looks like a "divergence".
- Anchored at the New York open (08:20 ET): the London high happened before the anchor, so there is nothing to compare it with. From 08:20 to 10:30, CVD rose by about +900 alongside price.
Both statements are true. They answer different questions: "Since the trading day began, was aggression at the second high weaker than at the first?" versus "Since New York opened, has aggressive buying accompanied the rally?" A comparison between two points after the same anchor gives the same answer whatever the anchor is. A comparison that straddles an anchor, or that compares levels across days, depends entirely on the anchor.
Trap 2: the incomplete anchor
Suppose your platform connects at 09:10 ET because your computer was off, and your "session CVD" is supposed to start at 18:00 ET the previous evening. Unless the platform backfills complete tick history, your CVD actually starts at 09:10: it is missing all of Asia and London. It looks exactly like a complete line. A good tool should flag an anchor as incomplete when data before it is missing or when there was a gap or disconnection during the session.
Trap 3: the wrong scale
A weekly or multi-day CVD buries short intraday swings under days of accumulated flow. The rule of thumb: the scale of the anchor should match the scale of the question. Intraday questions need intraday anchors.
Label your anchor
Whenever you show or share a CVD chart, write the anchor on it, for example "CVD anchored: NY open 08:20 ET". Without the anchor, a CVD claim cannot be checked.
Key idea: A CVD line without a stated anchor is incomplete information. Choose the anchor that matches your question, and say what it is.
Common mistake: "My CVD shows a divergence," without saying the anchor. With a different anchor the divergence may not exist.
Common mistake: "CVD is the same on every platform." Anchors and classification methods differ.
Common mistake: "Weekly CVD gives a bigger, better picture." For intraday questions it mostly adds noise.
Try it: On a 5-minute GC chart, display CVD three ways: since chart load, reset at 18:00 ET, and anchored at 08:20 ET. Pick two price highs on the same day, one before 08:20 and one after, and compare what each version says about them.
---
High Volume ≠ Direction
This idea appeared in Chapter 2 as a myth to discard. Now that you have the tools of this chapter, we can make it practical.
High volume means a large number of contracts changed hands. Every one of those contracts had a buyer and a seller, so volume is, by its nature, direction-free. The same tall volume bar can come from completely different situations.
Five stories behind one tall bar
- Initiative. One side arrives with heavy aggression and moves price. Typical footprint: high volume, delta strongly in the direction of the move, a large range.
- Stop run or liquidation. Many stop orders sit beyond an obvious level, such as the Asian-session high. When price reaches it, the stops trigger and turn into market orders. The volume is high because traders were forced to act, not because they chose to. Afterwards, the move may continue or may simply end.
- Absorption, or a two-sided battle. Heavy aggression runs into large passive orders on the other side. Volume is high but price barely moves.
- Scheduled events. A US data release at 08:30 ET, the GC settlement window from 13:29 to 13:30 ET, or a roll period. The volume is high because of the calendar.
- Spread and routine trading. Part of the volume can come from rolls between contract months or spread strategies that have no net directional intent.
Here are four illustrative 5-minute GC bars, each with RVOL above 3 (round numbers, not from a specific day):
| Story | Volume | Delta | Delta % | Range |
|---|---|---|---|---|
| Data release at 08:30 ET | 6,200 | +1,400 | +23% | $9.0 |
| Break of the Asian high (stop run) | 3,100 | +1,100 | +35% | $4.5 |
| Heavy volume, tiny range (possible absorption) | 4,000 | +900 | +22% | $0.8 |
| Bar containing the settlement window | 3,500 | +60 | +2% | $1.2 |
All four would light up a volume filter. They are four different events.
What to read next to volume
To interpret a high-volume bar, look at least at:
- delta and delta %: was the activity one-sided or balanced?
- price movement within the bar: high volume with a large range is different from high volume with almost no range;
- location: did it happen at a meaningful level (yesterday's high, a prior volume cluster) or in the middle of nowhere?
- time: was there a data release, the settlement window, a session open?
- what happened afterwards: did the market accept the new prices (trade there, build volume) or reject them?
A high-volume bar says, honestly, "something mattered to participants here." Working out what requires the other evidence, and even then the conclusion is a probability, not a certainty.
Key idea: A tall volume bar means "pay attention here," never "go this way."
Common mistake: "Big volume means big players are buying." Volume has no direction.
Common mistake: "A climactic high-volume bar marks the end of a trend." This is a popular claim, not proven.
Common mistake: "Low volume means the move is fake." This is a popular claim, not proven. When the order book is thin, moves on low volume are entirely real.
---
When Delta and Price Disagree (Introduction)
We usually expect aggressive buying to lift price and aggressive selling to push it down. When that does not happen, we have a disagreement, often called a divergence. This section only introduces the idea; later chapters return to it with more tools.
Two levels of disagreement
1. Within a single bar. A green candle with negative delta, or a red candle with positive delta. For example, GC rises during a bar while aggressive selling dominates. Price went up without buyers pushing it: perhaps passive sellers stepped away, or passive buyers kept raising their bids.
2. Across a stretch of CVD. Price makes a higher high, but CVD, with a stated anchor, makes a lower high. Or price makes a lower low while CVD makes a higher low.
The figure shows a real gold session (28 September) in which price fell while cumulative delta rose: aggressive buying was dominating, yet price drifted lower.
Possible explanations
Each of these is plausible, and from the delta numbers alone you usually cannot tell which one applies:
- Absorption. One side's aggression is being soaked up by large passive orders on the other side.
- Passive accumulation or distribution. A large participant is building or reducing a position with limit orders, perhaps through an algorithm that spreads the order over time (for example a TWAP, time-weighted average price, algorithm). Some platform educators point out that a session-long divergence can reflect institutional passive flow rather than weakness.
- Liquidity withdrawal. The other side cancels its orders, and price moves through empty space.
- A measurement artifact. A classification error (as in the "same bar, different delta sign" example) or an unsuitable anchor.
- Short covering or position closing. Aggressive buying from traders closing shorts looks the same as new buying.
A question, not a signal
Why only an introduction? Because divergence is widely sold online as a "reversal signal". That is a popular claim, not proven. A divergence can persist for hours while price continues in its own direction.
The useful way to treat a disagreement is as a question generator, not a decision maker. Ask: "Why isn't this side's aggression moving price? Who is passive on the other side?" Then look for other evidence: the order book or heatmap (Chapter 10), the location within the volume profile (Chapters 5 and 6), and how the market behaves next.
A helpful rule from ATAS's educational material: the scale of your reaction should match the scale of the disagreement. A disagreement in one bar does not justify a conclusion about the whole day.
Key idea: When delta and price disagree, the honest statement is "aggression on this side is not what is driving price right now; find out why."
Common mistake: "Delta divergence means a reversal." This is a popular claim, not proven.
Common mistake: "A CVD divergence always means big players are on the other side." This is a popular claim, not proven.
Common mistake: "Several divergences in a row make a reversal certain." There is no statistical evidence for this.
---
Chapter summary
- In order flow, "buy" and "sell" mean the aggressive side. CME's feed flags it directly (AggressorSide, tag 5797: 1 buy, 2 sell, 0 none); otherwise platforms use the quote rule (at or above ask = buy, at or below bid = sell).
- Opening-auction trades and some implied trades have no aggressor. Quote/trade synchronisation, trades inside the spread and sweeps cause classification errors.
- The tick rule compares each trade with the previous trade; Lee-Ready uses the midpoint first and the tick rule for midpoint trades. Studies report roughly 80–90% accuracy in equities, never 100%. Methods can flip a bar's delta sign. An honest unknown bucket is better than guessing.
- Bar volume must be judged against the same time of day: RVOL = bar volume ÷ same-time average. Volume histogram colours follow the candle, not aggression. Volume filters highlight; they do not signal.
- A footprint shows bid × ask volume at every price in the bar: left = aggressive sells, right = aggressive buys. The bar's POC is its highest-volume level. Ticks per level, bar type, classification and historical data change the picture.
- Bar delta = ask volume − bid volume; delta % = delta ÷ volume. Positive delta means buyers were in more of a hurry, not that price rose or will rise. Delta does not see passive orders.
- CVD is the running sum of bar deltas from an anchor. Read its slope over a defined window, not its absolute level. Errors accumulate; short covering and passive flow are invisible.
- The anchor trap: "since chart load" CVD depends on how much data you loaded; session resets make days comparable; the choice of session answers a specific question. Flag incomplete anchors, match anchor scale to question scale, and always label the anchor.
- High volume has no direction. Initiative, stop runs, absorption, scheduled events and spread trading can all produce the same tall bar. Read delta, range, location, time and what followed.
- When delta and price disagree, possible causes include absorption, passive accumulation, liquidity withdrawal, measurement artifacts and short covering. Divergence is a question, not a reversal signal.
- In our own testing, order-flow measurements such as delta on their own did not predict direction after costs. Everything in this chapter is a measurement.
Checklist
- I can label a trade as an aggressive buy or sell from its price and the bid/ask at the time.
- I know what the CME aggressor flag is and which trades have no aggressor.
- I can apply the tick rule and Lee-Ready to an ambiguous trade, and I know which method my platform uses.
- I can compute RVOL against the same time of day and explain why a fixed volume threshold misleads in gold.
- I can read a bid × ask footprint, find the bar's total volume and POC, and say which column is aggressive buying.
- I can compute bar delta and delta % and explain what positive delta does and does not mean.
- I can build a CVD from bar deltas and read its slope rather than its level.
- I can choose a CVD anchor that fits my question and I always label it.
- I can list at least four different stories behind a high-volume bar.
- I treat a delta/price disagreement as a question to investigate, not a signal.
Quiz
- The bid is 4000.0 and the ask is 4000.1. A 12-lot trade prints at 4000.0. How is it classified under the quote rule, and who was passive?
- Quotes are unavailable. The previous trade printed at 4000.2 and this trade prints at 4000.3. What does the tick rule say? What would it say if the following trade also printed at 4000.3?
- A 5-minute bar at 02:15 ET trades 600 contracts. Over the previous 20 days, the average 02:15 bar traded 200 contracts. What is the RVOL, and what does it tell you about direction?
- A footprint bar's ask column sums to 600 and its bid column to 900. What are the bar delta and delta %? Could this bar have closed higher than it opened?
- Bar deltas, anchored at the first bar, are +200, −50 and +100. What is the CVD after bar 3? If you reloaded the chart with more history and no session reset, what would change?
Quiz answers
- It is an aggressive sell: a seller crossed the spread and hit the bid at 4000.0. The buyer was passive; their limit order was resting at the bid.
- 4000.3 is higher than 4000.2, an uptick, so the tick rule says buy. A following trade at 4000.3 is a zero-uptick, so it would also be labelled a buy, inheriting the last change. (In a quiet range, this inheritance is exactly how the tick rule carries errors forward.)
- RVOL = 600 ÷ 200 = 3: three times the normal activity for that time of day. It tells you nothing about direction; it only says something unusual happened in terms of activity. You would need delta, range, location and what followed to interpret it.
- Delta = 600 − 900 = −300. Volume = 1,500 (assuming no unknowns), so delta % = −300 ÷ 1,500 = −20%. Yes, the bar could still have closed higher: delta measures only aggressive orders, and price can rise if passive sellers withdraw or passive buyers keep raising their bids.
- CVD = 200 − 50 + 100 = 250. Reloading with more history and no reset would shift the level of the whole CVD line (it would start from the sum of all the earlier loaded bars), and the chart could look different because of rescaling and data differences. The bar deltas themselves, and the change from bar 1 to bar 3, would not change.