Hidden liquidity made visible: levels where more traded than the book showed, and levels that absorbed heavy flow without breaking.
What the chart shows
traders rarely show their full size. An iceberg order displays a slice in the book and refills it after every fill, so the queue at that price never seems to . Absorption is the broader case: sellers (or buyers) hit a level hard and the level does not break, because passive orders keep taking the other side.
Neither is visible on a candle chart, a footprint or a heatmap alone. The footprint shows what traded but not what was resting; the heatmap shows what was resting but not how much traded against it. This chart compares the two at every level and marks the places where they disagree.
Menu
Chart type → → Absorption & icebergs
Engine type
absorption-map
Combines
Trades (with aggressor side) + order-book snapshots + candles; bid / ask per price for the history estimate
Renderer
Canvas 2D; events recomputed at most every 300 ms while depth streams
Unique to this chart
Hidden volume per level, refill ratio, where each level finally broke, and a ranked ledger
Anatomy of the chart
Every part of the absorption map. The iceberg at the bottom is still holding; the ask absorption above was broken (×).
Part
What it is
How to read it
An iceberg. Area grows with hidden volume.
A is a large hidden order. Several at one price are one order refilling over time.
Refill ring
Arc around a : visible size after the as a share of before.
A full ring means the slice came straight back: the hidden order is still there.
Absorption: heavy into a level that did not break during the bucket.
Passive orders took everything thrown at them. Common at turning .
Zone
The event level, drawn to where price traded through it or to the edge.
Bands reaching the edge are levels still holding; they are candidates for support and resistance.
× marker
Where price traded through the level by a full row.
The hidden liquidity was used up or . Breaks after long holds often run.
Dashed outline
An estimate from bars, before depth was recorded.
Same idea from bid / ask volume at bar extremes; no visible size or refill is known.
Label
Type and hidden volume: "ICE 1.5K", "ABS 700 est.".
sizes across the chart.
Ledger
The largest events: time, price, type and side, traded, visible, hidden, refill, holding.
A green dot means the level still holds.
Status line
source and counts of icebergs, absorptions and levels holding.
Check that it says "Book + trades" before trusting exact numbers.
How events are detected, step by step
The detection pipeline: group trades, read the book either side, compute hidden volume, classify, then merge and follow each level.
1
Group the trades
Trades are grouped by time bucket (Group trades every, 5 s by default), price level and the side they : sell trades take resting , buy trades take resting asks.
2
Read the book either side of the bucket
For each group the chart reads the visible size at that level in the last book snapshot before the bucket and the first one after it.
3
Compute hidden volume
Hidden = traded − max(0, before − after). If 860 traded but the visible queue only fell from 60 to 56, 856 of it was never shown.
4
Classify
An iceberg needs traded ≥ Iceberg: traded ≥ × visible-before and the level refilled (after ≥ refilled to × before). Otherwise absorption needs traded ≥ Absorption: traded ≥ × the group volume, with no trade in the bucket going through the level.
5
Merge, rank and follow
Repeats at one level within Merge events within become one event. The largest are kept, and the trade tape is scanned forward for the first print beyond the level: that is where the zone ends.
6
Fill in history
Before depth was recorded (or with : Bars only), absorption is estimated per bar from its bid / ask volume at the extremes, as below.
A bid level second by second: the visible slice refills while volume keeps trading into it.The bars-only estimate: heavy selling in the bottom rows of a bar that closed near its high.
Reading the chart, step by step
1
Check the source
The status line says whether events come from book + trades or from the bar estimate. Only the first gives hidden volume and refill.
2
Find the levels still holding
that reach the edge, and ledger with a green dot, are hidden liquidity that has not been used up. Expect price to react when it returns there.
3
Read the side
Teal (bid) events are buyers absorbing selling, typically under price. Magenta (ask) events are sellers absorbing buying, typically above. Blue diamonds are icebergs on either side.
4
Weigh the size
hidden volume with normal bar volume. A hidden order several times the average bar is a participant with a real position to build.
5
Watch the breaks
A × after a long hold means the hidden order finished or was . A break on volume often runs; a break on small volume after a pull often fails.
Setting it up, step by step
1
Choose a symbol with depth and trades
The broker must stream the order book. Real trades with aggressor side (Delta Exchange, crypto) give exact ; elsewhere trades are inferred from volume and the side is estimated with the tick rule.
2
Select the chart type
Chart type menu → → Absorption & icebergs. Recording starts now; earlier bars use the estimate.
3
Open the settings
Click the gear left of the name. Start with the ; use the Sensitive preset on quiet instruments and only on busy ones.
4
Match the bucket to the market
Fast : 2–5 s. Slower stocks: 10–30 s, so a refill that takes several seconds still falls into one bucket.
5
Group levels on fine ticks
For instruments with a very , raise Book per level so a hidden order spread over neighbouring ticks counts as one level.
Common setups
Index futures scalping
Bucket 3 s, iceberg ratio 2×, refill 50 %, until broken, ledger on. Fade into holding bid icebergs under price.
Crypto perpetuals
Bucket 5 s, book per level 5, minimum 50 contracts, only preset. Watch for absorbing late longs.
Swing context
: Bars only, absorption multiple 2. Daily or hourly bars show where heavy passive volume stopped moves in the past.
Limitations
!
Caution:Hidden volume is inferred from snapshots. Orders and between two snapshots look hidden too, and a slow book feed (one snapshot per second or less) overstates icebergs. Treat single events with caution and rely on repeated or large ones.
Only recorded depth is used; there is no stored book history before the chart was opened.
Without trades from the tape, come from the rule and can be wrong on some .
The bars estimate cannot tell icebergs from ordinary heavy passive volume; it only flags absorption.
Events beyond the book depth the broker sends (often 5–20 levels) cannot be measured.
Native Quatick implementation and live demos
The charts below are the real Quatick engine (@quatick/quatick-charts), the same code the trading terminal runs, fed by a deterministic simulated market. Switch between demos, press Run market to stream ticks, order-book snapshots and trades, to pan and use the wheel to zoom. Show code exactly the calls each makes.
Live demo
Hidden orders hold levels while sellers or buyers keep hitting them. Each diamond is an iceberg: more traded than was ever shown, and the visible size refilled (ring). Run live to see new ones appear.
Loading the Quatick chart engine…
absorption-map · 0 bars · last — · 0 trades · drag to pan, wheel to zoom
How the engine draws Absorption map
Inputs, computation, renderer and overlay layers of the Absorption map chart type in the native engine.
Stage
What happens
in
addTrades(trades)
setOrderbookSnapshot(book)
Bid / ask per price (optional)
Group trades per bucket, row and side
Visible size before / after from the book
Hidden = traded − visible used
Step 4
Iceberg (refilled) or absorption ()
Step 5
Merge, rank, find where price broke
Canvas 2D
Layers
Level until broken · Glyphs, refill , labels · Ledger and status
updates
Events recomputed at most every 300 ms while depth streams
How data reaches the screen
The calls your code makes, what the engine stores, and when it draws. Redraws are coalesced into one animation frame.
Minimal implementation
The first above, as standalone code:
typescript
import{ Chart }from'@quatick/quatick-charts';const chart =new Chart({
container: document.getElementById('chart')!,
chartType:'absorption-map',
theme:'dark',
renderer:'canvas',
showVolume:false,});const series = chart.addSeries({type:'candlestick'});
chart.setData(series.id, bars);// [{ time, open, high, low, close, volume }] — time in seconds
chart.setChartTypeOptions('absorption-map',{
bucketSeconds:5});// Real bid / ask volume per price, keyed by bar time
chart.setFootprintData({[bar.time]:[{ price, bid, ask },...]});// Live: every tick updates the forming bar (a new time opens a new bar)
feed.onTick(bar => chart.update(series.id, bar));
feed.onLevels((time, levels)=> chart.updateFootprintBar(time, levels));// Depth and trades
feed.onBook(book => chart.setOrderbookSnapshot(book,{ time: chartSeconds }));// { bids: [[price, size]], asks: [[price, size]] }
feed.onTrades(trades => chart.addTrades(trades));// [{ time, price, size, side: 'buy' | 'sell' }]