Appearance

Personalize your experience

Mode
Accent Color
Direction
Absorption & Iceberg Map

Absorption & Iceberg Map

Charts / Chart Types / Volume Charts

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

Anatomy of the absorption & iceberg mapHidden liquidity ledger10:41:3524473.0ICE bid1.5K●10:37:2024469.0ICE ask908·10:35:4024472.5ABS bid705●ICE 1.5KABS 47iceberg: diamond, area = hidden volumering = refill (visible size came back)zone: level still holding → to the edgeabsorption: hexagon× = price traded through the levelledger: largest hidden volume firstdashed = estimated from bars (no book yet)price held: sellers kept hitting 1.5K hiddenTeal = bid side (buyers absorbed selling) · magenta = ask side (sellers absorbed buying) · blue = iceberg
Every part of the absorption map. The iceberg at the bottom is still holding; the ask absorption above was broken (×).
PartWhat it isHow 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 ringArc 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.
× markerWhere price traded through the level by a full row.The hidden liquidity was used up or . Breaks after long holds often run.
Dashed outlineAn estimate from bars, before depth was recorded.Same idea from bid / ask volume at bar extremes; no visible size or refill is known.
LabelType and hidden volume: "ICE 1.5K", "ABS 700 est.". sizes across the chart.
LedgerThe 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

From trades and book to an event1. Group tradesper bucket, price level, sidesells → bids, buys → asks2. Read the bookvisible size just beforeand just after the bucket3. Hidden volumetraded − max(0, before − after)Icebergtraded ≥ ratio × beforeand after ≥ refill × beforeAbsorptiontraded ≥ multiple × median groupand no trade went through the levelcheck firstotherwise4. Merge, rank, followmerge repeats · keep the largest · mark where price broke
The detection pipeline: group trades, read the book either side, compute hidden volume, classify, then merge and follow each level.
  1. 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. 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. 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. 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. 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. 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.
Why it is an iceberg: one bid level, second by second0s1s2s3s4s5s6s7s8s9s10svisible size at the levelcumulative volume sold into itvisible before: 60 · visible after: 56 · traded: 860hidden = traded − (before − after) = 860 − 4 = 856traded / before = 14× (≥ 2×) and after / before = 93 % (≥ 50 %) → icebergused upA normal order shrinks as it fills. An iceberg keeps showing the same small slice until its hidden size is gone.
A bid level second by second: the visible slice refills while volume keeps trading into it.
Without the book: estimate from the bar's own bid / ask volume2060110150130907040420380ABS 800 est.Bottom two rows: 800 sold (bid)Average row: 132 sold → 6× ≥ 2 × multipleClose in the top 40 % of the range→ buyers absorbed the selling at the lowMirror case at the high: heavy buying, close in thebottom 40 % → ask absorption.No visible size is known, so these events have no refill ring and the ledger shows "—" for visible.
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. 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. 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. 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. 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. 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. 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. 2
    Select the chart type
    Chart type menu → → Absorption & icebergs. Recording starts now; earlier bars use the estimate.
  3. 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. 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. 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

Absorption map: native Quatick pipelineDATA INENGINE COMPUTESRENDERERDRAWN ON TOPaddTrades(trades)setOrderbookSnapshot(book)Bid / ask per price(optional)1. Group trades per bucket,row and side2. Visible size before /after from the book3. Hidden = traded −visible used4. Iceberg (refilled) orabsorption (held)5. Merge, rank, find whereprice brokeCanvas 2DLevel zones untilbrokenGlyphs, refill rings,labelsLedger and statusLive update cost: Events recomputed at most every 300 ms while depth streams
Inputs, computation, renderer and overlay layers of the Absorption map chart type in the native engine.
StageWhat happens
inaddTrades(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 4Iceberg (refilled) or absorption ()
Step 5Merge, rank, find where price broke
Canvas 2D
LayersLevel until broken · Glyphs, refill , labels · Ledger and status
updatesEvents recomputed at most every 300 ms while depth streams

How data reaches the screen

How data reaches the screenYour app / broker feedChart APIEngine stores & cachesScreen (rAF)new Chart({ container, chartType })setData(series, bars)bars → data managerindex + boundssetChartTypeOptions(type, {...})sanitise against schemaclamp rangessetFootprintData(levels)FootprintStore.setAllchanged bars onlysetOrderbookSnapshot(book, { time })OrderbookModel + LiquidityHistoryrow gridaddTrades(trades)TradeTape (sorted)real trades winupdate(series, formingBar) — every tickrecompute forming barO(1)request redrawone framerender price action + overlays
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' }]

Quatick settings reference

Loading the settings list…

See also

Related articles

  • Depth Footprint

    Charts / Chart Types / Volume Charts

    Each bar split in two: what traded at every price, and what was resting in the book at that price.

  • DOM Ladder

    Charts / Chart Types / Volume Charts

    Depth of market on the chart's price scale: resting bids and asks, your orders, traded volume and delta at every price, with recent candles beside it.

  • Order-Book Imbalance Candles

    Charts / Chart Types / Volume Charts

    Candles of how one-sided the resting book was, with what aggressive traders actually did on the same scale.

  • Volume Footprint

    Charts / Chart Types / Volume Charts

    A bid/ask volume histogram overlaid on each price bar, revealing who is buying and selling at every price level.

  • Composite Profile

    Charts / Chart Types / Volume Charts

    Volume, time and resting liquidity at every price of a session, side by side, with three points of control and each row classified.

  • Cumulative Delta (CVD)

    Charts / Chart Types / Volume Charts

    Candles of the running total of buy volume minus sell volume, with divergence detection against price.

  • Liquidity Heatmap

    Charts / Chart Types / Volume Charts

    Resting order-book size at every price over time, drawn on the GPU, with executed trades as bubbles.

  • Orderflow Chart

    Charts / Chart Types / Volume Charts

    An enterprise-grade orderflow visualization combining footprint, CVD, depth ladder, whale detection, and time & sales.

  • TPO Market Profile

    Charts / Chart Types / Volume Charts

    Time-Price-Opportunity Market Profile using letter-based visualization to reveal where price spent time.

Browse all knowledge base articles →