Module 5 · Lesson 13 of 17 · Order flow and auction market theory · About 5 minutes

Bid/Ask Volume Charts: Reading Volume at the Bid and Ask by Price

On this page
  1. What you will learn
  2. What does each cell on the chart show?
  3. How is bar delta read?
  4. Bid/ask volume chart diagram
  5. What are diagonal imbalances?
  6. What does absorption look like on the grid?
  7. What this does not tell you about bid/ask volume charts
  8. Method in Practice
  9. Check yourself
  10. Reflect on your own process
  11. Sources

Before you read: Reading Delta and Imbalance on a Bid/Ask Volume Chart

What you will learn

What does each cell on the chart show?

If every trade either lifted the offer or hit the bid, how would you count them at each price?

A cell shows the platform’s selected directional-volume category at a price row. With reported aggressor-side data, it can represent exchange/provider-attributed buy/sell aggression. Other methods estimate side using trade/quotes, tick direction or lower-timeframe bar movement. “Bid × ask” is common shorthand, but do not assume every display directly observed the same underlying side field.

Specific checked example, TradingView documentation as rechecked November 8, 2026: its default footprint uses aggregated intrabar price movement. Footprint is a registered trademark of its owner. Optional native tick-based calculation can use reported exchange/provider aggressor side, including supported CME/CBOT/NYMEX/COMEX symbols; missing side can fall back to trade proximity to quotes, then tick-price movement. Availability depends on symbol, entitlements, timeframe and available tick history; inspect the active status and incomplete-data warnings. This is not a certificate that a given account/feed/history has complete CME aggressor coverage. The same documentation says Pine request.footprint() and Volume Profile still use the default method. Neither “TradingView never has aggressor data” nor “every Pine footprint uses native tick side” is correct.

Keep the selected category names/feed mode with any saved chart. A change in granularity/history can change results; trade-side attribution does not reveal identity or intent.

How is bar delta read?

What does it mean if more volume traded at the ask than at the bid in one bar?

Bar delta=total selected buy/ask category−total selected sell/bid category. For the existing hypothetical six-row figure, ask total 420−bid total 745=−325 contracts. If supplied categories represent actual reported aggressor side, this describes that sample’s attributed initiation; with default intrabar estimates, it describes the corresponding estimated split, not verified literal trades at contemporaneous quotes. Every completed trade still has both a buyer and seller; the sign is not a count of distinct people or a forecast.

Bid/ask volume chart diagram

A grid of bid and ask contracts on six price rows: 100.75 bid 0 ask 40, 100.50 bid 35 ask 160, 100.25 bid 60 ask 55, 100.00 bid 90 ask 70, 99.75 bid 140 ask 65, 99.50 bid 420 ask 30. A short arrow links bid 60 at 100.25 to ask 160 at 100.50, the diagonal comparison: with a chosen threshold of 2.5, 160/60 = 2.6667 is marked as an imbalance. The large bid of 420 at the low is labeled possible absorption. Below: bar delta = ask 420 − bid 745 = −325.
Read the diagram step by step
  1. hypothetical attributed categories; actual classification depends on data/mode; neighboring rows are not a simultaneous spread.
  2. Large bid volume at the low: possible absorption or sellers simply stopped. The grid cannot tell.
  3. Contracts. Chosen threshold, not a platform default or certified aggressor feed.
  4. Fictional counts illustrate the selected categories and 2.5 threshold, not a platform-default threshold or certified aggressor feed. Bar totals and ratio are unchanged.

Illustrative diagram constructed for teaching. Not real market data.

Fictional counts illustrate the selected categories and 2.5 threshold, not a platform-default threshold or certified aggressor feed. Bar totals and ratio are unchanged.

What are diagonal imbalances?

Why compare the bid at one price with the ask one price higher?

Many platforms compare bid volume at one price with ask volume at the next price up. The diagonal pairing compares chosen neighboring price rows within an accumulated bar, not necessarily simultaneous best bid/ask prices. Minimum tick, aggregated row size and instantaneous spread are different settings/measurements. If one side is much larger, often by a ratio such as 3 to 1, the cell is marked as an imbalance. Several imbalances in a row on the same side are called stacked imbalances. The ratio and the number of rows are settings, so two charts of the same bar can mark different cells.

In the existing example, ask 160 at 100.50 versus bid 60 at 100.25 gives 160/60=2.6667. This figure declares threshold ≥2.5: 160≥2.5×60=150, so it flags; a 3.0 threshold would not flag that pair. None of these ratios proves participant intent.

What does absorption look like on the grid?

If heavy selling hits the bid at one price and price does not go lower, what happened?

Absorption describes a price where large aggressive volume traded but price did not move through it. On the grid, it shows as a row with very large bid volume (or ask volume) at a bar’s low (or high), with the next bars failing to trade beyond it. The usual reading is that passive orders took the other side. Another reading is that aggressive sellers simply stopped. The grid alone cannot tell the two apart.

What this does not tell you about bid/ask volume charts

  • Who traded or why. Hedgers, market makers and algorithms all print on the same grid.
  • Orders that were placed and canceled without trading. The grid shows trades only.
  • Whether an imbalance or absorption row will matter later. Settings change which cells are marked.
  • Nothing here suggests buying, selling or holding at any price on the chart.

Method in Practice: heavy buying at a level, and no new high

Fictional example. John, Harbor Index futures, the prices, times, costs and results are all invented for teaching. This shows how a written plan can be built and tested. It is not a recommendation, and nothing here says how often this idea works.

Try it on a real chart. Test this idea yourself on past sessions with bar replay. Keep your own count, including the days with no trade.

The idea. The lesson describes absorption as heavy aggressive volume at a bar's extreme, with the next bars failing to trade past it. It also says the grid can't show who traded or why. John turns the description into a short-sale condition at a level he marked in advance. His volume setting and his "next bars" rule are written down, because the no-trade replay shows how quickly the same picture changes.

John's plan

Setup
prior day high 102.00, marked on the pre-session map. Volume categories: the feed's reported aggressor side, recorded on the chart
Enter if
a 5-minute bar's high is between 102.00 and 102.10, its top row has at least 400 contracts at the ask, and the next two bars don't trade above that high. Sell after the second bar closes.
Wrong if
price trades at 102.15 (stop order)
Manage
take half at 101.40, the rest at 101.00 or by 14:30
Risk
$150 maximum, costs included
Video (3:29, voiced, captions available): the idea, John's plan and the three replays, with pause-and-predict moments. Everything it shows is written out under "Show the full replays".

Three outcomes

  • Worked: price turned down from the level → +$110

  • Failed: the heavy row led nowhere, and price rose through it → −$84, inside the limit

  • No trade: the very next bar traded above the high → $0

Show the full replays
ItemPlan
ContextPrior day high 102.00. Bid/ask rows at 0.05. Feed's reported aggressor side, recorded with the replay
Entry conditionA 5-minute bar with its high from 102.00 to 102.10 and 400+ contracts at the ask in its top row. The next two bars stay at or below that high. Sell 2 at market after the second bar closes
Wrong ifA stop order at 102.15
ManagementTake profit on half at 101.40 (limit) and move the stop for the rest to the entry price. Rest at 101.00 (limit). Time limit 14:30 CT
Risk cap and size$150. A stop fill one tick above 102.15 is planned to cost about $45 per contract, so 2 contracts
Not trading ifScheduled major release within the hour, or no setup by 12:00 CT

Replay A: worked

Time (CT)What happenedJohn
09:50–09:55High 102.05, top row 520 at the askWatching the next two bars
09:55–10:05Highs 102.00, then 101.95. Second bar closes 101.85Condition met: sells 2 at market, filled 101.80
10:05–11:15Falls, trades 101.40 at 11:15Buys back 1 at 101.40 (limit). Stop for the other moves to 101.80
11:15–13:30Never back to 101.80, trades 101.00 at 13:30Buys back the last 1 at 101.00 (limit)

Result after costs: +0.40 point = +$40, +0.80 point = +$80, commissions −$10. Net +$110. Journal: "Heavy buying at the level, no new high for two bars. Both exits were limits."

Replay B: failed

Time (CT)What happenedJohn
10:20–10:25High 102.05, top row 480 at the askWatching
10:25–10:35Highs 102.00, then 101.98. Second bar closes 101.88Sells 2 at market, filled 101.83
10:50Rallies through 102.15Stop triggers, filled 102.20
10:50–15:00Rises to 102.70Done for the idea

Result after costs: 2 × −0.37 point = −$74, commissions −$10. Net −$84. Journal: "Same picture as a good day for ten minutes, then price went straight through. The grid never said who those buyers were or what came next."

Replay C: no trade

Time (CT)What happenedJohn
11:00–11:05High 102.05, top row 610 at the askWatching
11:05–11:10Trades 102.10, above the highCondition broken: no trade
11:10–12:00Rises to 102.60No setup. 12:00 cutoff

Result: $0. Journal: "The heaviest row of the week, and the next bar went right past it. My rule needed two bars, and it got none."

Test it yourself

  • Write your volume setting and feed mode first. The lesson shows that the same heading can mean different calculations.
  • Replay every bar that reached the level, not only the ones with a heavy top row.
  • Re-run with 300 and 600 contracts. If the results swing, the setting is doing the work.

Where it breaks

  • The grid shows trades only. Orders canceled at the level never appear.
  • A heavy row shows where aggression happened, not whether it will matter later (the failed replay).
  • For five minutes, the no-trade day looked the same as the worked day.

Calculators: position sizerisk/rewardexpectancy

Reflection question: Could someone else rebuild your chart's numbers from what you wrote in your plan?

Check yourself

  1. A bar shows 900 contracts at the ask and 1,100 at the bid in total. What is bar delta? Hint: ask minus bid.
  2. Why does a positive bar delta not mean there were more buyers than sellers? Hint: how many parties does every trade have?
  3. A row at a bar’s low shows very large bid volume, and the next bar trades higher. Give two different readings. Hint: passive buyers, or sellers who stopped?
  4. Can the same “buy/sell” heading guarantee exchange-reported side in both native tick mode and Pine request.footprint()?
  5. Would the existing 160/60 pair flag under a 3.0 threshold?

Reflect on your own process

For your own notes; there is no score and no right answer.

  1. When you save a bid/ask volume chart to your journal, do you record the calculation mode, row size and imbalance ratio you used?
  2. How would you check which side-classification method your own platform was using on a given day?
  3. Which interpretation of a large bid row does your written process require you to rule out before recording absorption?
  4. Could someone else rebuild your chart's numbers from what you wrote in your plan?

Sources

Last reviewed . Spotted a mistake? Report an error.