Skip to content

Execution

Missing Depth vs Zero Liquidity in Crypto Books

Three observed rows can still hide an intervening price. Follow a bounded snapshot as an unseen level becomes the true best ask.

Ivory ceramic steps disappear behind a black screen with a lime edge, with one step visible beyond it.
Illustration for execution; examples in this article are educational.

A missing order-book level is not evidence of zero liquidity when the feed or snapshot has a depth limit. It may lie outside the observed range and remain unknown until the venue publishes it. Track the book's coverage boundary as well as quantities; continuous updates and a familiar row count do not prove that all prices relevant to an order are visible.

The dangerous case can look healthy. Messages keep arriving, quantities change and the local table contains as many rows as the original snapshot. Yet an unchanged price level may never have entered that table. A depth calculation can silently turn a limit on observation into a statement about the market.

The distinction matters before estimating available size, calculating imbalance or calling the lowest stored ask the best ask. The following hypothetical ledger makes the missing information explicit. It is a teaching construction, with no live market capture or execution result.

Give absence a reason

An order-book collector needs more than a mapping from price to quantity. It needs a reason for treating an absent price as empty.

For Binance Spot's documented diff-depth procedure, an update sets a level's quantity, inserting a previously unknown price when necessary; a zero quantity removes that level. These instructions describe an explicit state change. They do not turn every price missing from the initial snapshot into zero. See the Binance Spot local-book procedure.

What the consumer knowsMeaning at that observationSuitable treatment
Current positive quantity in valid scopeDisplayed quantity was observedUse with its observation and validity conditions
Explicit zero updateThat displayed level was removedRemove it under the channel's rules
Price omitted by the depth limit, with no later valid updateQuantity was not establishedPreserve as unknown
An update gap or invalid initializationMaintained state is unverifiedRecover before relying on derived values

These distinctions apply within the public feed's representation. The Level 1, Level 2 and Level 3 comparison explains a separate question: what each record represents. A more detailed record type does not, by itself, establish unlimited price coverage.

Three observed rows can still miss an intervening price

Consider a fictional asset quoted in USDT. Quantities below are base-asset units at each price, not cumulative units. The complete teaching ledger initially contains five ask levels. The consumer receives only the lowest three.

Ask price, USDTUnits at priceIncluded in initial view?
1002Yes
1013Yes
1024Yes
1035No
1046No

The three-level window keeps the arithmetic readable; it is not a claim about an exchange's subscription options. Assume a snapshot followed by continuous, ordered, full-range quantity-change deltas. An unchanged level outside the initial view is not repeated. Ignore executions, latency and other market changes beyond the events listed.

The initial view establishes the ask book through price 102. It says nothing about higher asks. Now apply three events to both the full teaching ledger and the consumer's partial copy.

StageQuantity changes deliveredConsumer's positive asks, price × unitsTrue best ask in teaching ledger
T0Initial view100 × 2; 101 × 3; 102 × 4100
T1Set 100 to zero101 × 3; 102 × 4101
T2Set 104 to 7101 × 3; 102 × 4; 104 × 7101
T3Set 101 and 102 to zero104 × 7103

At T1 the consumer has two rows. The unseen level at 103 has not changed, so this model provides no message containing its five units.

At T2 the update at 104 brings the row count back to three. That does not restore the top three asks. The actual three lowest prices are 101, 102 and 103; the collector instead holds 101, 102 and 104. Sorting the stored prices correctly cannot recover an omitted price.

A quantity sum needs a coverage label

At T2, suppose a report asks for displayed ask quantity within 3% above the best ask of 101. The upper price is 101 × 1.03 = 104.03 USDT.

The partial copy sums 3 + 4 + 7 = 14 units. The full teaching ledger contains 3 + 4 + 5 + 7 = 19 units in that band. Calling 14 the complete total understates this constructed book by five units, or 5 ÷ 19 × 100 = 26.32%, rounded.

A real consumer would not know that the correct total is 19. That number belongs to the deliberately complete teaching ledger. It can report 14 observed units with incomplete coverage, subject to the example's continuity assumptions. It cannot infer the missing quantity or its percentage from the partial data alone.

A narrower request has a different answer. At T2, quantity at or below 102 is seven units, and that region remains within the original supported view. One collector can therefore support a complete narrow sum and an incomplete wider sum at the same moment.

The slippage and order-book depth worksheet uses visible quantities to estimate fills. Apply a coverage check before that arithmetic. A model that runs out of observed rows has reached its evidence boundary; it has not established that the venue runs out of liquidity there.

The missing level can become the best ask

At T3, both remaining prices inside the initial boundary disappear. The lowest stored ask becomes 104. The actual best ask is the unchanged, unseen 103.

There was no missing delta in this construction. Every listed event arrived and was applied correctly. The collector still cannot certify a best ask from its remaining row. Treating transport continuity as proof of complete top-of-book coverage would produce a false quote.

The appropriate state is that the supported initial ask range is empty and the best ask is unestablished by this copy. A fresh snapshot, correctly joined to subsequent updates, can establish a new bounded view. Merely waiting for another unrelated change does not guarantee that 103 will be reported.

Venue rules decide which levels belong in the cache

The example illustrates a documented limitation of snapshot-plus-delta reconstruction. As reviewed on 28 October 2026, Binance Spot's REST order-book endpoint returns at most 5,000 levels per side; its REST market reference specifies the limit. Binance's stream documentation warns that quantities outside the initial snapshot remain unknown unless those levels change. More starting levels extend the observed range without making it unlimited.

Do not transfer cache rules between channels. Kraken Spot WebSocket v2's L2 book reference offers subscription depths of 10, 25, 100, 500 and 1,000 levels per side. Its maintenance guide requires truncating the local book to the subscribed depth after updates: levels leaving scope do not receive explicit zero-quantity removals.

Consequently, retaining every historical Kraken level as if it remained current would violate that channel's maintenance contract. Falling outside a maintained window is different from receiving an explicit removal at a price. Both may remove a local row, but they justify different claims about liquidity beyond the window.

Kraken's guide also limits its checksum to the top ten price levels on each side regardless of subscription depth. A passing comparison does not certify an unobserved outer region. The order-book checksum guide develops that validation boundary without confusing byte agreement with complete depth.

Attach a coverage record to each calculation

For the snapshot-plus-full-range-delta model used above, preserve the original outer ask price as a conservative coverage boundary. An isolated update at a higher ask establishes that row's quantity; it does not establish all intervening rows. The bid-side reasoning reverses direction: the initial lowest included bid marks the outer boundary on that side.

This is an inference from the example's information model, not a universal replacement for a venue's feed specification. A stream maintaining a moving subscribed-depth window needs its own scope rules.

RecordWhat to captureDecision it supports
IdentityVenue, product, symbol and channelPrevent mixing incompatible books
InitializationSnapshot identifier, requested depth and returned rowsDefine the starting evidence
CoverageOuter observed boundary on each side and scope ruleDecide which requested price range is supported
ContinuityLast accepted update and validation stateDistinguish bounded data from broken reconstruction
TimingObservation and local receipt timesApply the consumer's freshness policy
QuerySide, price interval and completeness statusKeep a sum from implying wider coverage

Do not move the coverage boundary outward just because the largest stored price increased. At T2, that would incorrectly certify the missing 103 level. Likewise, a dashboard should distinguish an incomplete sum from a complete zero and an invalid calculation.

Retain native price-level resolution when establishing these boundaries. Price-level grouping can combine several prices into display buckets. Counting those buckets does not reveal how many native levels were observed or whether the requested price interval was fully covered.

Replay the boundary before trusting the number

Use the four-stage ledger as a small validation exercise for a collector or data review:

  1. Initialize the partial copy with only 100, 101 and 102. Confirm that 103 and 104 are unknown, rather than initialized to zero.
  2. Apply T1 and T2. Require three stored rows while still flagging the interval through 104.03 as incomplete. Check the observed sum of 14 and complete sum of seven through 102.
  3. Apply T3. Require the collector to withhold a certified best ask from this copy, even though it retains the observed quantity at 104.
  4. Separately introduce a sequence gap. Mark reconstruction invalid and follow the venue's recovery procedure. Do not describe that state merely as truncated depth.
  5. Reinitialize from a supported fresh snapshot and join updates according to the channel contract. Replace the old coverage record with the newly established one.

Binance's documented synchronization procedure requires rebuilding when a forward update-ID gap is detected. Its initialization also buffers stream events around snapshot acquisition. The WebSocket recovery guide addresses that sequencing task. Fetching a snapshot without joining it correctly can replace a coverage problem with a continuity problem.

For each downstream depth figure, write the side, price interval, observation time and whether coverage is complete. If the requested interval extends beyond the supported view, return an explicitly incomplete observation or obtain suitable fresh data before answering. Keep unknown liquidity unknown all the way to the decision that consumes it.

Keep the context with the example.

Each worked example is illustrative, with its sources and assumptions in the article. Read our editorial standards for authorship, verification and corrections.