Module 5 · Lesson 11 of 17 · Order flow and auction market theory · About 7 minutes
Reading the DOM Honestly: Spoofing, Icebergs and Hidden Size
On this page
- What you will learn
- What does the DOM show?
- Which data choices shape the DOM?
- What is queue position, and why does it matter?
- Why can the visible book mislead?
- DOM diagram
- How do you write honest DOM observations?
- What are the limits of DOM reading?
- What this does not tell you about the DOM
- Method in Practice
- Check yourself
- Reflect on your own process
- Sources
Before you read: Order Flow Basics: DOM, Time and Sales, Delta
What you will learn
- What a depth of market (DOM) display shows, and the data choices behind it.
- How queue position and matching rules affect what a resting order experiences.
- Why the visible book can mislead: cancellations, pulling and stacking, icebergs, hidden size and spoofing.
- How to write DOM observations that stay inside what the data shows.
Start with order flow basics, which introduces the DOM, time and sales, and the legal summary on spoofing that this lesson refers to.
What does the DOM show?
If the screen says 400 contracts are bid at 100.00, what exactly do you know?
The depth of market (DOM) is a ladder of prices. Next to each price it shows the displayed quantity of resting limit orders: bids below the market, offers above. The best bid and best offer are the top of book. Most displays also show recent trades at each price, and some add your own working orders.
What you know from “400 bid at 100.00” is narrow: at the moment of that update, the feed reported 400 contracts of displayed buy orders resting at 100.00. You do not know how many orders make up the 400, who placed them, whether more size is hidden there, or whether the 400 remains a second from now.
Which data choices shape the DOM?
Are two traders looking at the same DOM always looking at the same book?
No. Several choices shape it:
- Depth. Many feeds and platforms show only a limited number of price levels on each side. Orders beyond that depth are not on the screen.
- Aggregation. Most displays show market-by-price data: one total per price. Some exchanges also publish market-by-order data, which lists individual orders at each price. The two views of the same book can look quite different.
- Update speed. Displays refresh at different rates, and some combine many rapid changes into one update. A fast change can be invisible on a slower screen.
- Implied liquidity. In some futures markets, prices in one contract month can be derived from orders in spread markets. Whether those implied quantities appear depends on the feed and platform.
What is queue position, and why does it matter?
Two traders bid at the same price. Who trades first?
When several orders rest at the same price, the exchange’s matching rule decides which fills first. Many markets use price-time priority, often called first in, first out (FIFO): at a given price, the earliest order fills first. Some products use pro-rata or mixed methods, which share fills among resting orders by size or by a formula. Exchanges publish the rule for each product.
Under price-time priority, an order’s queue position is its place in line at its price. A resting bid at the back of a long queue may not fill even if price trades at that level, because the orders ahead of it absorb the incoming selling. That is one reason a backtest that assumes every limit order at a touched price fills can look better than live results. See honest backtesting.
Why can the visible book mislead?
If displayed size can be canceled at any moment, how much weight can a single snapshot carry?
Several ordinary features of modern markets make the displayed book an incomplete picture.
- Cancellations are constant. Participants cancel and replace orders all the time for routine reasons: prices moved, risk changed, a hedge filled elsewhere, a quoting program updated. Displayed size can appear and vanish in fractions of a second.
- Pulling and stacking. Traders use pulling for displayed size disappearing as price approaches, and stacking for size being added. These words describe changes in the book. They do not explain them.
- Iceberg orders. An iceberg order shows only part of its size. When the shown part trades, more appears. Some platforms flag “detected icebergs” by watching for repeated refills at one price. That flag is an inference from patterns and can be wrong.
- Hidden or non-displayed size. Depending on the venue and order type, some size may not be displayed at all.
- Spoofing. Spoofing means placing bids or offers while intending, at the time they are placed, to cancel them before they execute. In US futures markets, the Commodity Exchange Act prohibits it. Changing or canceling an order is not spoofing by itself: legitimate, good-faith changes and cancellations are allowed, and what matters is the trader’s intent when the order was placed. The fuller summary is in order flow basics.
The practical point for a reader: you cannot tell from a DOM whether any specific order is spoofing, an iceberg, a hedge or a routine quote. The screen shows quantities, not intentions.
DOM diagram
Illustrative diagram constructed for teaching. Not real market data.
The diagram shows a constructed DOM ladder at two moments a few seconds apart. Displayed bids near the top of book shrink between the two snapshots while price does not change. The label notes that the size changed and that the reason is unknown.
How do you write honest DOM observations?
What would a DOM note look like if someone else could check every word of it against a recording?
Compare two notes about the constructed change in the diagram:
- Observation: “At 10:02:15, displayed bids at 100.00 to 100.25 totaled 1,150. At 10:02:20 they totaled 310. No trades printed at those prices in between, so the drop came from cancellations or modifications.”
- Story: “A big player pulled their bids to trick everyone.”
The observation gives times, prices, sizes and what can be inferred from the trade record. The story adds a single actor, a motive and an accusation, none of which the data supports. A short checklist helps:
- Record the time, price and quantity before and after.
- Check time and sales: did trades or cancellations remove the size?
- Note your display’s depth and update speed.
- Stop at what changed. Leave out who and why.
What are the limits of DOM reading?
Which important facts about the book never appear on the ladder?
- No identities or intentions. The DOM does not show who placed an order or what they planned to do with it.
- Snapshot problem. Each view is a moment; the book can change before you finish reading it.
- Partial view. Depth limits, aggregation, hidden size and implied quantities mean the screen is a subset of the full book.
- Other venues and instruments. Related markets, such as an ETF or options on the same index, have their own books that are not on this ladder.
- Your platform matters. Two platforms on two feeds can show the same moment differently.
What this does not tell you about the DOM
- Large displayed size does not mean price has to stop at that level.
- Size that disappears does not prove spoofing; cancellations are routine.
- A “detected iceberg” flag is an inference, not a confirmed order.
- A thin-looking book does not mean price has to move quickly.
Method in Practice: a resting order, and what the ladder can't tell you
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 says the DOM shows quantities, not intentions. So John's plan never uses displayed size as a reason to act. He uses the DOM for one thing: placing a resting limit order at a level he marked before the open. The replays show two lessons from the ladder. Touching his price isn't the same as filling. And displayed bids can vanish right before price drops, with no way to know why.
John's plan
- Setup
- prior session POC 99.00, marked on the pre-session map
- Enter if
- price is above 99.30 at 08:30. Then John rests a limit order to buy at 99.00.
- Wrong if
- price trades at 98.70 (stop order)
- Manage
- take half at 99.40, the rest at 99.75 or by 14:30
- Risk
- $150 maximum, costs included
- Not in the rule
- displayed size on the DOM. John records it, but never acts on it.
Three outcomes
-
Worked: the order filled and price rose → +$105
-
Failed: displayed bids under the level shrank, then price fell to the stop → −$80, inside the limit
-
No trade: price touched 99.00 three times, but the order never filled → $0
Show the full replays
| Item | Plan |
|---|---|
| Context | Prior session POC 99.00. DOM: market-by-price, 10 levels each side (recorded with the replay) |
| Entry condition | Price above 99.30 at 08:30 CT. Rest a limit order to buy 2 at 99.00. Replay convention: filled only if price trades 98.95 or lower |
| Wrong if | A stop order at 98.70 |
| Management | Take profit on half at 99.40 (limit) and move the stop for the rest to the entry price. Rest at 99.75 (limit). Time limit 14:30 CT |
| Risk cap and size | $150. A stop fill one tick under 98.70 is planned to cost $40 per contract, so 2 contracts |
| Not trading if | Scheduled major release within the hour. Unfilled order canceled at 12:00 CT |
Replay A: worked
| Time (CT) | What happened | John |
|---|---|---|
| 08:30 | Price 99.55 | Rests a limit order to buy 2 at 99.00 |
| 09:40 | Trades down to 98.90 | Filled 2 at 99.00 (the limit's price) |
| 09:40–11:05 | Rises, trades 99.40 at 11:05 | Sells 1 at 99.40 (limit). Stop for the other moves to 99.00 |
| 11:05–13:20 | Never back to 99.00, trades 99.75 at 13:20 | Sells the last 1 at 99.75 (limit) |
Result after costs: +0.40 point = +$40, +0.75 point = +$75, commissions −$10. Net +$105. Journal: "Filled at the level, both exits were limits. Displayed size played no part."
Replay B: failed
| Time (CT) | What happened | John |
|---|---|---|
| 08:30 | Price 99.45 | Rests a limit order to buy 2 at 99.00 |
| 10:02 | Trades 98.95 | Filled 2 at 99.00 |
| 10:02:15–10:02:20 | Displayed bids at 98.80–98.90 drop from 1,150 to 310. No trades print at those prices in between | Records it. The rule doesn't use it |
| 10:04 | Trades down through 98.70 | Stop triggers, filled 98.65 |
| 10:04–15:00 | Falls to 98.20 | Done for the idea |
Result after costs: 2 × −0.35 point = −$70, commissions −$10. Net −$80. Journal: "At 10:02:15 displayed bids at 98.80–98.90 totaled 1,150. At 10:02:20 they totaled 310, with no trades at those prices, so the drop came from cancellations or changes. I don't know who or why, and I didn't act on it."
Replay C: no trade
| Time (CT) | What happened | John |
|---|---|---|
| 08:30 | Price 99.60 | Rests a limit order to buy 2 at 99.00 |
| 09:15–10:30 | Low of 99.00 three times. Never trades 98.95 | Not filled |
| 10:30–12:00 | Rises to 100.10 | Order canceled at 12:00. No trade |
Result: $0. Journal: "Price touched my price three times and never traded through it. The orders ahead of mine took all the selling. A replay that called this a fill would be wrong."
Test it yourself
- In replays, count a limit order as filled only when price trades through it (here, 98.95 or lower). A touch isn't a fill, because orders ahead of yours in the queue fill first.
- Log every day price touched your level without trading through. Those are trades a replay would wrongly count.
- If you write DOM notes, use the lesson's checklist: time, price and size before and after. Stop at what changed.
Where it breaks
- Queue position: on a touch, the orders ahead of John's absorbed the selling (the no-trade replay).
- Displayed size can disappear in seconds. The ladder doesn't say why (the failed replay).
- John's platform shows 10 levels each side, at one update speed. Another platform can show the same moment differently.
Calculators: position sizerisk/rewardexpectancy
Reflection question: Which parts of your plan would still make sense if you couldn't see the DOM at all?
Check yourself
Reflect on these; there is no score.
- The DOM shows 500 offered at 101.00. List three things this does not tell you. Hint: who, how many orders, what happens a second from now.
- Under price-time priority, why might a bid at a traded price not fill? Hint: queue position.
- Displayed bids drop from 900 to 200 with no trades at those prices. What can you say, and what can you not say? Hint: cancellations or modifications happened; the reason is unknown.
- In plain words, when does canceling an order count as spoofing in US futures law? Hint: intent at the time the order was placed.
Reflect on your own process
- What does your written checklist require you to record before describing a change in the DOM, and what does it tell you to leave out?
- Which depth, aggregation and update settings does your platform use, and are they written in your journal?
- If your backtest assumes limit orders fill whenever price touches them, how does your plan account for queue position?
- Which parts of your plan would still make sense if you couldn't see the DOM at all?