Most order-flow material assumes you already know the vocabulary. This doesn't. It starts from what a resting order is and works up to why the same event can read as absorption on a 5-minute chart and three separate exhaustions on a 15-second one — and why both readings are correct.
A futures market is a queue. At any instant there is a list of people who have said "I will buy at this price" and a list who have said "I will sell at this price." Those standing offers are resting orders, and the whole list is the order book.
The highest price anyone is currently willing to buy at is the bid. The lowest price anyone is willing to sell at is the ask (or offer). The gap between them is the spread. On liquid futures that gap is usually one tick, because plenty of participants are competing to be at the front of each queue.
Below the bid sits a ladder of other buyers waiting at worse prices. Above the ask, a ladder of sellers. That ladder — the sizes waiting at each price away from the current market — is what people mean by market depth or Level 2.
Nothing in that book has happened yet. Every number in it is an intention. A trade only occurs when somebody stops waiting and crosses the spread.
Why this matters for everything below. Price is a record of what already happened. The book is a record of what people are currently willing to do. They are completely different kinds of information, and the book is the only one that tells you anything about the near future — which is also why it's the one people manipulate.
Every trade has a buyer and a seller, so "more buyers than sellers" is never literally true. What differs is who was waiting and who was impatient. This is the single most important distinction in order-flow reading, and it's the one most explanations skip.
You place a limit order and join the queue. You get the price you asked for, but only if somebody comes to you. You are providing liquidity. You are, in a real sense, defending a price.
You cross the spread and take whatever is resting. You get filled immediately, at a slightly worse price. You are consuming liquidity. You are attacking a price.
So at any given price level there are two opposing forces with a clear geometry:
| Level type | Who is passive (defending) | Who is active (attacking) |
|---|---|---|
| A bid level below price — support | Buyers. Resting bids waiting to be filled. | Sellers. They hit the bid to get out or get short. |
| An ask level above price — resistance | Sellers. Resting offers waiting to be filled. | Buyers. They lift the offer to get in or get long. |
Hold onto that table. Every verdict later in this page is just a statement about which of those two sides won a particular fight, and the naming follows directly from it: a bid is hit by sellers, an ask is lifted by buyers, always.
This is also why Holdfast draws bid levels and ask levels in different colors, and why every verdict is named for the participant it happened to rather than for a direction. Support and resistance are not the same event mirrored — they involve different participants doing different things, and being able to tell them apart at a glance is most of the read.
The naive use of depth data is: find a big number in the book, draw a line there, treat it as support. This fails, and it fails in a specific and predictable way.
A limit order is free to place and free to cancel. It costs nothing until it fills. That asymmetry has an obvious consequence: the largest orders in the book are frequently the ones least intended to fill.
Size gets placed to be seen. It slows a move down. It encourages other people to lean on it, to place their own stops just beyond it, to treat it as a floor. And then, when price actually arrives, it's gone — canceled in the milliseconds before it would have traded. You leaned on a wall that was never load-bearing.
Meanwhile, genuine resting size behaves completely differently. Somebody actually working a large position leaves it there. Through pullbacks, through approaches, through time. It is boring. It does not announce itself. And in a snapshot it looks exactly the same as the fake: same price, same number of contracts, same appearance on your ladder.
Here is the part that determines what data you need. Suppose a price level showing 500 lots drops to 40. Two completely different things could have happened:
These are opposite pieces of information, and aggregated depth reports the same number for both. That's the technical reason Holdfast requires order-by-order MBO data rather than the aggregated depth bundled with most platforms: MBO carries the individual orders and the add / modify / cancel messages behind them, which is what makes the distinction recoverable at all. More on the data requirement here.
Size is trivially fakeable. Time is not.
Leaving size resting in the book for minutes means genuinely risking the fill for those minutes. You cannot show a wall for four minutes without accepting that somebody might trade against all of it. That's not a clever insight — it's just an observation about incentives — but it has a practical consequence most depth tools ignore entirely: the useful question isn't how big, it's how long.
This is the whole basis of how Holdfast decides what reaches your chart. A level does not appear because it's big. It appears provisionally, and then it has to survive:
| State | What it means | On the chart |
|---|---|---|
| Unproven | Size just crossed your threshold. The clock starts. Explicitly not trusted yet. | Thin, dashed, faded, * prefix |
| Holding | Survived the first validation window still holding its size. | Solid, medium weight |
| Proven | Rested long enough that placing it as a bluff would have been genuinely expensive. | Thick, full opacity |
| Withdrawn | Size pulled before ever reaching a verdict. Treated as spoofing and deleted. | Removed entirely |
| Vacated | Reached a flow verdict. Kept as a record, carrying its bubble. | Verdict styling + bubble |
The deletion is the important half and the part people miss. A tool that draws every level and leaves them all up gives you a chart where some lines are real and some are theatre, with no way to tell which. Deleting the ones that failed their own test is what makes the survivors mean something.
Surviving on a clock earns a level the right to be on your chart. It says nothing about what happens when price finally arrives. That's a separate question, and it's measured separately.
Each time price comes to a level and trades there, that's a visit — internally, an episode. Each episode tracks its own numbers, independent of every other visit to the same level:
Refill is what separates the outcomes, and it's worth understanding on its own because it's the least intuitive of the three.
Imagine 200 lots resting on a bid. Sellers hit it for 300. If the level ends up with nothing left, the defender was overwhelmed — 200 was all they had. But if there are still 180 lots resting after 300 traded, somebody has been continuously adding as fast as their orders were consumed. They aren't holding a position at that price; they're actively defending it, and they have more size behind the size you can see.
Those are enormously different situations, and refill is how you tell them apart in real time. High refill means someone is committed. Low refill means the size that was there is simply being used up.
Nothing here is a probability, and that's deliberate. Market depth isn't stored historically the way price and volume are, so there is no archive of past order books to fit outcome odds against. Any percentage attached to a verdict would be invented. What can be measured honestly is what the flow is doing right now, and that's all any of these states claim to describe.
Every visit that reaches a conclusion produces a verdict. They fall into two families: absorption describes the passive side's defense, while depletion and exhaustion describe the aggressors' attack and whether it stuck.
Which participant a verdict names follows the verb, and the verbs are not interchangeable. Aggressors are what get absorbed and exhausted. Resting orders are what get depleted. So the labels read like sentences: "active sellers absorbed", "passive buyers depleted", "active sellers exhausted".
Absorption is a verdict the moment it is measured. When the refill mechanics fire, something has been observed at the book: somebody defended this price. That is a finished measurement, not a provisional one, and a great many absorptions are never revisited at all — price simply leaves and keeps going.
What a revisit adds is a second, separate question: given that price came back, did the level hold? That produces two offshoots — DEFENDED and FAILED — which are revisions of the base verdict rather than replacements for it. Same event, same participants, more known about it.
What happened: volume arrived and hit the resting size, and that size survived because it kept being replaced. Somebody was standing there replenishing as fast as they were being hit.
What it means: the passive side defended this price. That is a measurement taken at the book, and it stands on its own — it does not need later price action to validate it.
Named for the aggressor that got absorbed: SELLERS ABSORBED at a bid, BUYERS ABSORBED at an ask.
Most absorptions end here. Price leaves and never comes back to argue about it. That is the common case and a complete outcome.
How to use it: a reversal read, and the honest strength of it is in the hover: the tooltip reports how far price closed clear of the level. An absorption that drove price a long way and one that barely moved it carry the same verdict, and the excursion is what separates them.
READS AS: REVERSAL
What happened: price returned to a level that had already absorbed, and this time the question was whether it would hold.
A revisit has to clear two bars to count. The bar has to actually reach the level, and real volume has to transact. Price drifting back on a handful of contracts is not a test of anything, and without the volume gate it would decide a verdict.
DEFENDED — price closed back on the defended side within the hold window. The level was tested and held. This is the sturdiest reversal read the data produces, precisely because it is the one that got tested rather than merely observed.
FAILED — price closed through and stayed through. The passive side temporarily won and ultimately lost. The original absorption was not a false reading: somebody genuinely soaked up the first wave. They just did not have enough behind it to survive the second, and very often had stopped replenishing altogether by the time price came back. The defender stopped defending.
Both name the aggressor, like every absorption state: SELLERS ABSORBED, DEFENDED and SELLERS ABSORBED, FAILED at a bid. Resting orders are never absorbed — they are depleted — so the outcome lives in the qualifier rather than switching which participant the sentence is about.
What the book adds. Price decides held-or-broken; the book says what it cost. A parenthetical marks the two cases where the book gave a clear reading: (REFILLED) means the size came back and defended again, (SWEPT) means it was eaten. Expect neither most of the time — absorption and depletion are narrow tests and a typical revisit lands in the margin between them.
Why FAILED is not depletion: depletion needs no prior absorption — aggressors simply ate the size and carried on. This level demonstrated a real defense first. That history is what makes the failure informative: committed size was there, and has now left. FAILED (SWEPT) says aggressors ate through real size; bare FAILED says price walked through with nobody home, which usually means the level was never worth much.
DEFENDED READS AS: REVERSAL FAILED READS AS: CONTINUATION
What happened: volume arrived, the resting size was eaten and not meaningfully replaced, and price carried on through.
What it means: the defense was real but finite. It got used up. The orders that were there are now gone, converted into somebody's position, and the price no longer has anything holding it.
Named for the side of the book that was consumed: BID DEPLETED at a bid, ASK DEPLETED at an ask. It's the one verdict that names the book rather than the participants, because resting orders are what the verb happened to.
How to use it: depletion is a continuation read, and it's also a warning about that price going forward. A level that has been depleted is not support any more — the thing that made it support has been spent. Traders who keep treating a depleted level as a floor are trading a line that used to mean something.
The cancellation guard. There's a deliberate check here: for a level to count as depleted, trades against it must account for a minimum share of the size that left the book. If the size mostly canceled rather than traded, that's a withdrawal — a pull, not depletion — and it's handled as spoofing instead. Without that guard, a wall that vanishes on cancellations would read as genuine consumption, which is precisely the lie this whole system exists to catch.
READS AS: CONTINUATION
What happened: the level was depleted — genuinely consumed, price went through — and then, within a defined window of bars, price closed back through the level in the other direction.
What it means: the aggressors got what they wanted and it didn't hold. They had enough volume to clear the resting size, and not enough to do anything with the ground they took. That's a different failure from being absorbed: absorption means they never got through, exhaustion means they got through and then ran out.
Named for the aggressors that ran out: SELLERS EXHAUSTED when a bid was taken and then reclaimed, BUYERS EXHAUSTED at an ask.
How it resolves. This is the only verdict that is not immediate, and the mechanic matters for the timeframe discussion below. When a level is consumed, it is provisionally marked DEPLETED. The indicator then watches a set number of completed bars. If price closes back through the level (by a small tick buffer, so a wick doesn't count) within that window, the verdict is upgraded to EXHAUSTION. If the window passes with no reclaim, the depletion stands and is confirmed.
How to use it: exhaustion is the classic failed-breakdown or failed-breakout. It's a bounce read. It is weaker structurally than absorption — the resting size really is gone now, so a return to the level has nothing defending it — but it's often the more tradeable of the two, because it hands you a clear level that just proved the aggressors couldn't hold it.
READS AS: BOUNCE / FAILED BREAK
Each in one line. Absorbed = somebody defended this price. Revisit defended = they were still there when it was tested. Revisit failed = they were not. Depletion = the aggressors won. Exhaustion = the aggressors won the level and then lost the ground.
The two families revise differently. Every exhaustion begins life as a depletion — that one genuinely is provisional, because "consumed" and "consumed then reclaimed" are different events. Absorption is not provisional: it is measured and rendered immediately. A revisit adds a second finding on top of it. The distinction matters, because it is the difference between a verdict waiting to be decided and one that is already true.
A verdict describes that visit and is not a forecast. Price breaking a level an hour later does not retroactively unmake a defense that worked — that return is a new event, and it earns its own verdict.
+.Occasionally an absorption label carries a trailing plus sign — SELLERS ABSORBED+. It's a small marker for a meaningful escalation, and it is rare enough that you can trade for a while without seeing one.
During an ordinary absorption at a bid, sellers are the ones doing the work. They're hitting the bid; the defender is passively soaking it up. Seller volume dominates, and the defense is holding.
The flip is when that reverses. Within a short rolling window, the opposite side starts out-trading the aggressor — at that same bid level, buyers are now lifting more than sellers are hitting. The defender has stopped merely absorbing and started buying aggressively themselves. The defense isn't holding, it's winning.
Three things worth knowing about it, since it's easy to wonder whether it's broken:
When you do see one, it's worth attention: it's the strongest single-glance evidence the data produces that a level isn't just being defended, it's being defended by someone who has decided to press.
Put Holdfast on a 5-minute chart and a 15-second chart of the same instrument, at the same moment, and you will not get the same bubbles. Some events appear on both. Some appear only on the fast chart. And an event that reads as one clean absorption on the 5-minute may show up as three separate exhaustions on the 15-second.
This looks like a bug the first time you see it. It isn't. Understanding why is genuinely the difference between using this tool well and being frustrated by it.
Two halves of the system behave differently, and the whole thing follows from that:
So the same order-book event gets judged against a different stopwatch on every chart. On a 15-second chart, a four-bar reclaim window is one minute. On a 5-minute chart, a one-bar reclaim window is five minutes. Those are not the same question being asked, and they honestly shouldn't produce the same answer.
Picture a genuine fight at a support level lasting twelve minutes. Sellers come in three separate waves. Each wave clears the visible resting size and pushes price a few ticks below the level; each time, buyers reload and drive it back within half a minute.
Those three waves happen inside two or three bars. No bar ever closes below the level, because each dip is recovered long before the bar ends. From the 5-minute chart's point of view the size was hit repeatedly, never gave way on a closing basis, and kept being replenished. That is textbook absorption — and it's a fair description of the twelve minutes as a whole.
Each wave gets its own bars. Price closes below the level, so each wave is a genuine depletion — and then closes back above within the reclaim window, upgrading each one to EXHAUSTION. Three waves, three separate exhaustion bubbles. Also a fair description: three times, sellers got through and couldn't hold it.
Neither chart is wrong. One is describing the outcome of the battle, the other is describing the individual skirmishes. The 5-minute tells you the level held. The 15-second tells you it held three times, and each time the sellers who broke it had nothing left within thirty seconds. That second reading is considerably more actionable, and it's invisible at 5 minutes.
The other direction is just as important. A visit that resolves entirely within a single 5-minute bar can be a complete, well-formed event on the 15-second chart — arrival, consumption, reclaim, confirmation — while the 5-minute chart sees one bar with a wick and nothing to judge. There is no bar boundary for the reclaim to be measured against, so no verdict is reachable.
That's not the slow chart missing something it should have caught. Its job is to answer a slower question, and by its standards nothing decisive happened.
The practical consequence. Match your chart to the decisions you actually make. If you're scalping on a 15-second chart, the fast-chart verdicts are your signal and the 5-minute is context. If you hold for twenty minutes, the fast-chart bubbles are noise you'll be happier without. Running both is the strongest read available — one for the shape of the fight, one for the individual exchanges — and Holdfast ships timeframe presets specifically so the reclaim windows and confirmation bars are sensible on each rather than borrowed from the other.
Below is one MNQ session captured on all three charts at the same moment. The colored boxes are annotations added for this page, not something the indicator draws. They mark which events survived onto which chart.
Large, slow, decisive events. Enough size and enough time that every chart could reach a verdict — though not always the same verdict.
Real events that resolved too quickly for the 5-minute chart to see a bar close against them. Significant, and completely absent from the slow chart.
The finest grain. Slower to build and easy to dismiss, but they resolve and they perform — the events that only exist if you're watching at execution resolution.
Read them in order and the pattern is unmistakable: the slow chart carries a handful of large, unambiguous events. Each faster chart keeps all of them and adds a layer the previous one couldn't resolve. Nothing contradicts — the resolution just increases, and events that were a single wick at 5 minutes become fully-formed, verdict-bearing episodes at 15 seconds.
The totals on the bubble faces also shift between charts, and that's expected for the same reason. A bubble's number is the volume transacted during that visit, and what counts as one visit depends on when the episode is considered closed — which is tied to bar formation. One long visit on the slow chart can be three shorter visits on the fast one, and the volume divides accordingly.
The one that matches your holding period. This isn't a dodge — the verdicts are answers to a question about time, so a verdict is only meaningful relative to a timescale you actually care about. A scalper holding for ninety seconds needs to know whether sellers ran out within ninety seconds; the 5-minute chart cannot tell them that, and isn't trying to. If you hold for half an hour, the reverse applies and the fast-chart bubbles are just noise.
No. Absorption means the aggressors that just attacked a price were soaked up by someone with more size. That is a fact about what already happened, not a forecast. Plenty of levels absorb once and get taken out on the next attempt — which is exactly why the revisit exists as a separate finding.
REVISIT — DEFENDED is the reading that carries the strongest reversal read, because it is the one that got tested: price came back on real volume and the level held anyway. REVISIT — FAILED is the same beginning with the opposite ending, and reads as continuation. Neither is a probability; both are records of what price did.
A live ABSORBING label — price still at the level, visit still open — should be read as "someone is defending here right now", not as a settled verdict.
Because price revisited the level and answered a second question about it. The absorption itself was never in doubt — it was measured and rendered when it happened. What changed is that the level then got tested, so the same bubble is rewritten in place as DEFENDED or FAILED rather than a second bubble appearing beside a stale one.
Something similar happens on the aggressor side, but for a different reason: a depletion genuinely is provisional until its reclaim window passes, and upgrades to exhaustion if price closes back through. Absorption is not provisional — a revisit adds a finding on top of one that was already true.
Only the first qualifying revisit revises the verdict. After that it locks: a later return is a new event at a level that no longer has the same defenders standing in it.
Because it would be fabricated. Fitting outcome probabilities requires a historical archive to fit against, and market depth is not stored historically the way price and volume are — the book exists only in the live feed. Any percentage printed next to a verdict would be an invention dressed as a measurement. What can be stated honestly is what the flow did, so that's what gets stated.
Not in the way it was. Depletion means the resting orders that made it support were consumed — converted into somebody's position and gone. The price may still matter for other reasons (it's a visible number, other traders remember it), but the specific thing this data measured is no longer present. This is exactly why depleted levels are retained as a record rather than kept as live levels.
It was withdrawn — the size was pulled before the level ever reached a verdict — so it was deleted rather than kept. That's the spoofing filter doing its job. A level that shows up, sits there looking impressive, and then evaporates without ever being traded against was never information you wanted on your chart, and leaving it up would be actively misleading.
Refresh the chart. Bubbles are deliberately durable — they survive a settings change, an indicator reload, and a dropped data connection, because they record verdicts that were built from live depth and cannot be replayed once lost. By default the last 24 hours of them stay on the chart as a session map, which is what makes a long session accumulate.
Reloading the data series clears the vacated levels and their bubbles, and new levels start forming from that moment — depth is live-only, so there is nothing historical to rebuild. Your settings and calibration are untouched, which is why a refresh is the right tool here rather than turning persistence down: one resets what is currently drawn, the other changes how the tool behaves from then on. The trade-off is that you lose the earlier part of the session's map and any level mid-clock restarts its validation, so it's best done between setups.
Yes, and you'll usually regret it. Lowering the threshold makes every ordinary price on the ladder a level, and then everything that happens to any of them produces a verdict. The output stops being selective, which is the entire value. The right threshold is specific to your instrument and time of day, and the indicator's debug log measures it from your own feed rather than making you guess — the procedure is in the installation guide.
Related, but a different data source answering a different question. Footprint charts and volume profiles are built from trades — what actually transacted, and at what price. This is built from the book — what was resting and waiting, and what became of it. Volume tools tell you where business got done. Book tools tell you who was standing there and whether they held. They complement each other well and neither substitutes for the other.
+ on absorption labels.Holdfast Liquidity Levels does all of the above live: validation clocks, verdict classification, flow bubbles, and timeframe presets tuned so the reclaim windows make sense on the chart you actually trade.