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
- What you will learn
- What does each cell on the chart show?
- How is bar delta read?
- Bid/ask volume chart diagram
- What are diagonal imbalances?
- What does absorption look like on the grid?
- What this does not tell you about bid/ask volume charts
- Method in Practice
- Check yourself
- Reflect on your own process
- Sources
Before you read: Reading Delta and Imbalance on a Bid/Ask Volume Chart
What you will learn
- How a bid/ask volume chart lays out bid volume and ask volume at each price inside a bar.
- How bar delta, stacked imbalances and absorption are read from the grid.
- Why the same cells can be read in more than one way, and what the chart cannot show.
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
Read the diagram step by step
- hypothetical attributed categories; actual classification depends on data/mode; neighboring rows are not a simultaneous spread.
- Large bid volume at the low: possible absorption or sellers simply stopped. The grid cannot tell.
- Contracts. Chosen threshold, not a platform default or certified aggressor feed.
- 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
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
| Item | Plan |
|---|---|
| Context | Prior day high 102.00. Bid/ask rows at 0.05. Feed's reported aggressor side, recorded with the replay |
| Entry condition | A 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 if | A stop order at 102.15 |
| Management | Take 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 if | Scheduled major release within the hour, or no setup by 12:00 CT |
Replay A: worked
| Time (CT) | What happened | John |
|---|---|---|
| 09:50–09:55 | High 102.05, top row 520 at the ask | Watching the next two bars |
| 09:55–10:05 | Highs 102.00, then 101.95. Second bar closes 101.85 | Condition met: sells 2 at market, filled 101.80 |
| 10:05–11:15 | Falls, trades 101.40 at 11:15 | Buys back 1 at 101.40 (limit). Stop for the other moves to 101.80 |
| 11:15–13:30 | Never back to 101.80, trades 101.00 at 13:30 | Buys 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 happened | John |
|---|---|---|
| 10:20–10:25 | High 102.05, top row 480 at the ask | Watching |
| 10:25–10:35 | Highs 102.00, then 101.98. Second bar closes 101.88 | Sells 2 at market, filled 101.83 |
| 10:50 | Rallies through 102.15 | Stop triggers, filled 102.20 |
| 10:50–15:00 | Rises to 102.70 | Done 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 happened | John |
|---|---|---|
| 11:00–11:05 | High 102.05, top row 610 at the ask | Watching |
| 11:05–11:10 | Trades 102.10, above the high | Condition broken: no trade |
| 11:10–12:00 | Rises to 102.60 | No 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
- A bar shows 900 contracts at the ask and 1,100 at the bid in total. What is bar delta? Hint: ask minus bid.
- Why does a positive bar delta not mean there were more buyers than sellers? Hint: how many parties does every trade have?
- 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?
- Can the same “buy/sell” heading guarantee exchange-reported side in both native tick mode and Pine request.footprint()?
- Would the existing 160/60 pair flag under a 3.0 threshold?
Reflect on your own process
- When you save a bid/ask volume chart to your journal, do you record the calculation mode, row size and imbalance ratio you used?
- How would you check which side-classification method your own platform was using on a given day?
- Which interpretation of a large bid row does your written process require you to rule out before recording absorption?
- Could someone else rebuild your chart's numbers from what you wrote in your plan?