Home / Indicators / Order Book & Liquidity / OFS Iceberg Detector
SUBSCRIPTION OFS Iceberg Detector

OFS Iceberg Detector

Proves hidden size instead of guessing it: reads market-by-order data and shows the price levels where a single order kept refilling from a hidden reserve.

Current version1.2.6 · 2026-09-10
CompatibilityATAS 8.0.14+ and ATAS X 8.0.14+
RequirementsWindows 10/11, .NET 10, ATAS or ATAS X, market-by-order data feed
UpdatesAll future updates included
DeliveryATAS catalog (automatic) + download in your account
Choose your license VAT included
✔ Activates on your ATAS e-mail automatically after payment — the indicator appears directly in your ATAS catalog.

Description

OFS Iceberg Detector finds the orders that hide their real size - and it proves them instead of guessing.

WHAT AN ICEBERG IS
A large participant who wants to buy 500 contracts does not show 500 in the book. They show 10, let it get filled, show another 10, and repeat. On the screen it looks like thin liquidity that somehow never runs out. Price stalls at a level with no visible reason, and the reason is that the size was never visible in the first place.

WHY MOST TOOLS ONLY GUESS
A tool that reads the aggregated depth of a price level can only notice that more traded than it could see, and then hope no other order arrived or left in the meantime. That assumption breaks constantly in a fast book, which is why level-based iceberg detection produces so many false marks.

Put side by side with such a detector, this one will mark fewer icebergs and mark them later - by design, not by weakness. A level-based tool cannot tell one hidden participant from a queue of small orders taking turns, so part of what it marks is ordinary book traffic. Here a false mark is close to impossible by construction: the claim is arithmetic on one order, not an impression of a level. Quantity was deliberately traded for certainty.

HOW THIS ONE PROVES IT
This indicator reads Market-By-Order data, where every resting order carries its own identifier. Every trade also reports which resting order was hit. That makes the decisive comparison possible:

If more volume traded against ONE order id than that same id ever displayed at once, the difference cannot have come from anywhere else. It was hidden. That is arithmetic, not inference.

The comparison is only sound if the order being credited really was the passive side, so every trade is checked twice before it counts: the identifier must not be the aggressor's own, and the order must rest on the side opposite the aggression. An aggressive limit order can sit in the book for an instant before it crosses, and crediting its fills as absorption would invent hidden size on the wrong side of the market. Trades that fail either check are counted separately and the panel reports how many there were.

THREE LEVELS OF EVIDENCE
Every level says how strongly it is established, and never claims more than it knows.

PROVEN - more traded against a single order id than that id ever showed.
REFILLED - the same order id posted its visible size again after being hit, at least the configured number of times: either a larger size, or the same size with a fresh queue position, which is how the exchange reports a replenished tranche. An ordinary order does not grow back after being eaten. Optionally every refill must also come with the queue-position change, which is the venue's own sign that a fresh tranche was posted rather than the size simply raised.
ROTATED - an order was fully consumed and a replacement of similar size appeared at the same price within milliseconds under a new id. Some venues rotate tranches this way. This is indirect evidence, it has its own separate count because it needs more repetitions to mean anything, and it can be switched off entirely.

THRESHOLDS ONLY EVER CHANGE WHAT YOU SEE
No volume threshold takes part in detection. The engine records every iceberg it can establish, however small, and the minimum volumes decide only what is worth drawing. Lower one and everything already found reappears immediately; the diagnostic log contains the findings below the threshold too. A tool where the filter sits inside the detection quietly destroys the evidence you later go looking for.

WHAT IS DRAWN
Two things, and no bands across the chart - a line spanning the whole screen covers the price action and says less than what replaces it.

An iceberg here is an ORDER, identified by its exchange order id. Two different orders defending the same price are two icebergs; one order that replenishes twenty times is one iceberg with twenty tranches. Nothing is inferred from the price.

FIRST, a circle for each iceberg, at its exact price and on the bar where it was established, so it sits in the price action where it happened. Several icebergs at one price show as several circles. Its size follows the volume that level absorbed, between a minimum and a maximum you set. The diameter scales with the square root of the volume, so it is the AREA of the circle that is proportional - scale the diameter directly and four times the volume looks sixteen times bigger. Each side has its own color and the transparency lives inside that color, so one setting decides both. And when the order behind an iceberg moves to another price and proves itself again, the old circle stays with what it earned there and a dashed line links it to the new one - two circles, one participant.

SECOND, a tree beside the price. Each branch sits at the price it belongs to and grows towards the side that was defending it, and its length is the volume that level absorbed. Just past the end of the branch stands the number of contracts absorbed there, written in the color of the branch itself - the same number the length is drawn from, so the two can never disagree. Contracts that arrived in the last moments are added beside it in the highlight color, so a level being hit right now says +40 instead of looking like any other.

Before the first visible iceberg, a neutral TREE ALIGNMENT GUIDE shows the exact tree position and row thickness. It is explicitly labelled NOT MARKET DATA, carries no price or volume, disappears as soon as a real tree row is visible, and can be switched off.

That is all the chart says. The evidence level and the hidden size are in the panel and in the log, because a line of text beside every level covers the price action it is meant to explain.

A branch and its circle brighten AND grow the moment the level takes more size, then fade back - a color change on its own is easy to miss on a busy chart, and both the color and how much it grows are settings. On top of that, the branch keeps a softer glow for as long as its +5 increment is shown, fading out with it - so the levels being defended right now are visible at a glance, not only in the instant they grow. A level being defended right now is distinguishable from one defended twenty minutes ago.

Nothing you have found is taken off the chart again, and there is no ceiling that could take it. No distance filter hides a level once price walks away - the whole point of knowing where size was absorbed is what happens when price returns there - and there is no maximum number of icebergs to drop the oldest or the smallest. A ten-contract iceberg and a thousand-contract one are both kept. The volume floors default to zero and exist only if YOU decide the small ones are in your way.

Every color used for market information is yours: circles, branches, numbers, increment and highlight. Transparency lives inside each color rather than in a second setting beside it. The neutral alignment guide deliberately keeps a fixed non-market color so it cannot be mistaken for a bid or ask iceberg.

The context panel says in words whether order data is flowing, how many resting orders are followed, how many levels and how many iceberg orders were found, how many trades could not be attributed, and where the strongest one sits relative to price.

HONESTY
Market-By-Order data is required. Without it the indicator draws no market evidence and the panel says why. The only optional graphic that may remain is the neutral alignment guide, explicitly labelled NOT MARKET DATA - there is no silent fallback to a weaker detection method, because a weaker method dressed up as this one would be worse than nothing.

Every mark can be audited. The diagnostic log records, for every finding, which order id it stands on, when, and why - so you can check any mark yourself instead of taking it on faith. And the indicator admits its own blind spots: the panel counts the trades it could not attribute - no order id, an unknown id, an ambiguous assignment - so you always know how much of the flow it actually saw. A detector that cannot tell you what it missed cannot tell you what its marks are worth.

Order flow cannot be replayed from history. The indicator therefore works forward from the moment it is on the chart; reloading the chart starts a fresh session. That is a property of the data, not a limitation we chose, and it is why the detection engine is deterministic and ships with a diagnostic log you can read yourself.

The engine is separated from the platform and covered by its own unit tests, including the case that defeats most iceberg detectors: an order eaten to zero and replenished under the same identifier. It has also been replayed over real MNQ order-by-order recordings against an independent ledger built from the raw events, so every proven iceberg it reports has been checked to the contract on real data.

Installation guide
1. Create or sign in to your OrderFlowSmith account with the same e-mail address used by your ATAS account. When access to OFS Iceberg Detector is activated and the e-mails match, ATAS delivers the indicator automatically; do not install a DLL manually.
2. Open or fully restart ATAS so the automatically delivered indicator becomes available in the indicator catalogue. Whenever an update is released through ATAS, fully restart the platform; ATAS downloads and loads the new version automatically.
3. Only if the OrderFlowSmith and ATAS e-mails are different, download OFS.IcebergDetector.dll from your OrderFlowSmith account and install it manually: %APPDATA%\ATAS\Indicators for classic ATAS or %APPDATA%\ATAS X\Indicators for ATAS X. After every update, download and replace the DLL manually, then fully restart ATAS. If Windows blocked the file, open DLL Properties and select Unblock.
4. Add the indicator to a chart and paste your license key into Settings, group 01 - License.
5. Market-By-Order data is required. A Rithmic subscription that includes order-by-order depth is known to work. If the panel says NO ORDER DATA, the feed is not delivering it and nothing will be detected.
6. While no real iceberg row is visible, the neutral TREE ALIGNMENT GUIDE shows exactly where the tree will sit. Adjust Offset From Right Edge and Row Height in group 10 - Level Tree; the guide disappears automatically with real data and can also be switched off there.
7. Start with the defaults - they hide nothing. If the chart is busier than you want, raise Hidden Volume Floor or Filled Volume Floor in group 06 - Detection; nothing is thrown away by doing so, and lowering them again brings everything back.
Changelog — version 1.2.6
1.2.6 - MANUAL UPDATE CHECK.

Check For Updates: unticking it and ticking it again now runs the version check immediately and shows the new-version card again, even if you had closed it for that version. Nothing else changed.

1.2.5 - PRODUCT ROW SHOWS THE NAME ONLY.

The Product row in 01 - License now shows the product name only. No internal code is displayed anywhere in the settings. Nothing else changed.

1.2.4 - SETTINGS TEMPLATE: LICENSE HEADER, ALERT SOUND UNDER THE ALERT SWITCH, TELEGRAM IN ONE FORM. DETECTION LOGIC UNCHANGED.

Group 01 - License now reads Product, License Key, Website, Version and Check For Updates - the same header in every OFS indicator. In 13 - Alerts the Alert Sound sits right under Enable Alerts, followed by the event switches. The five Telegram rows carry the same names, order and help as every other OFS indicator. Alerts stay off by default.

1.2.3 - A SMALLER PANEL: TRADING ROWS ONLY, TECHNICAL ROWS BEHIND ONE SWITCH.

The panel now shows what matters while trading: icebergs and levels, evidence (proven / refilled / rotated), the strongest iceberg, the nearest above and below, and the version and licence footer. The technical rows - data state, orders tracked, snapshots reconciled, marks and levels drawn, trades used / without id / unknown / rejected, the trade field that carried the passive id, and the drawing-layer counters - are still there, behind Panel Diagnostics in 15 - Diagnostics (off by default). Nothing was removed from the engine or the diagnostic log.

1.2.2 - THE PANEL IS THE STANDARD OFS PANEL FROM THE FIRST BOOK UPDATE, IT STAYS INSIDE THE CHART, AND DIAGNOSTICS IS THE LAST GROUP.

With Show Panel on you now get the same panel as in every OFS indicator - counters, strongest and nearest icebergs, version and licence footer - from the first book update on, whether or not an iceberg has been found yet. The separate waiting badge and the Waiting Notice setting are gone: with the panel on you see the panel, with it off nothing, and faults follow Show Notices.

The panel, the notices and the update card are placed inside the visible chart region like in every other OFS indicator; before, the default top-right panel could overhang the right edge of the window under the price scale.

The Diagnostic Log moved to the last settings group, 15 - Diagnostics, after Alerts and Telegram, as in every OFS indicator. Detection and evidence logic are unchanged.

1.2.1 - A HIDDEN PANEL NO LONGER HIDES A PROBLEM.

Since 1.1.17 every notice followed Show Panel, and the panel is off by default - so a chart without a licence or without market-by-order data stayed silent. Notices now have their own switch, Show Notices (on by default), their own nine-point position and X/Y offsets, independent of the panel. Error states - missing or rejected licence, no market-by-order data, order-book safety limit, book updates without order ids, trades that cannot be matched, display filters that removed everything - are drawn while the panel is hidden. Waiting for the first iceberg is normal work, not a fault, so it is still shown only with the panel on, according to Waiting Notice.

New: Panel Background - one colour with transparency in its alpha channel, used by the panel, the waiting badge and the notices. Detection and evidence logic are unchanged.

1.2.0 - MEASURED ON REAL ORDER-BY-ORDER RECORDINGS; THREE THINGS THE DATA CHANGED.

The engine was replayed over five real MNQ market-by-order recordings (about 1,100 minutes, 565,000 trades, 276 million book events) with an independent ledger built from the raw events beside it. Every proven iceberg matched the ledger to the contract; the recordings also showed three things no code reading could.

ORDER TIMEOUT IS OFF BY DEFAULT. The old 120 s timeout released every resting order that had not changed for two minutes - and those patient orders are exactly the ones that later get hit. On the recordings 3.5-5 % of all trades hit an order the engine had already forgotten, which under-reported hidden volume and missed proven icebergs. A trade now keeps its order alive, and the timeout defaults to 0. The setting keeps its name but is stored under a new key, so charts saved with 120 s start clean; set a value only as a safety net for a feed that skips deletes and sends no snapshots.

THE BOOK IS RECONCILED WITH SNAPSHOTS. When the platform sends a full book snapshot every second, orders vanish from it without a delete. Without reconciliation the engine kept tens of thousands of phantom orders. After every snapshot, orders inside its price range that are absent from it are now released; orders outside the range are untouched. The panel shows how many snapshots were reconciled and how many orders they released.

A RESTORED TRANCHE COUNTS. The feed reports a native refill as the SAME visible size posted again with a fresh queue position, not as a size increase - so REFILLED never fired before. A refresh of the same size with a new queue position after a hit is now a tranche; the same size without a new position, a decrease, a snapshot row or a new position without a hit still are not. On the afternoon recording this produced seven refilled icebergs, all confirmed by the ledger.

Measured fact: on this feed the passive order id is always carried in the ExchangeOrderId field. Engine tests: 155.

1.1.17 - PANEL LAYOUT AND VISIBILITY CONTROLS.

The tree, waiting and error panel variants now share all nine chart positions, including horizontal and vertical centering, and remain clamped inside the chart. Show Panel controls every variant, defaults to Off, and the enabled panel defaults to Top Right with 20 px offsets. Check for Updates remains enabled by default. Iceberg evidence and detection logic are unchanged.

1.1.16 - THE TREE CAN BE POSITIONED BEFORE THE FIRST ICEBERG, AND SEVEN AUDIT EDGE CASES ARE FIXED.

A neutral TREE ALIGNMENT GUIDE now shows the exact tree width, centre, right-edge offset and row thickness whenever no real tree row is visible. It is labelled NOT MARKET DATA, carries no price or volume, disappears automatically with real data and can be switched off. New instances default to 400 px from the right edge and 6 px row height.

The audit also fixed: strict priority confirmation now applies to same-id refills after full removal; id-less book updates still advance stale-order cleanup; a filtered level can no longer claim refill evidence it never had; only on-screen volume sets marker and branch scaling; marker and level snapshots reach rendering as one atomic picture. Reaching the order-book safety ceiling now shows a warning instead of silently reducing coverage. If licensing ever skips a live MBO event, the next accepted event now starts from a clean book instead of joining new data to stale partial state.

Engine tests: 133.

1.1.15 - THE UPDATE CARD NOW TELLS YOU WHAT IS NEW.

The centred new-version card - product name, your version and the new one, a Close button - now also shows a short description of what each release brings. Identical in every OFS indicator.

1.1.14 - THE PANEL AND THE NOTICES SIT ABOVE THE CANDLES, AND THE NEW-VERSION CARD ALWAYS SHOWS.

The panel, the status notices and the new-version card were drawn in the same layer as the markers - behind the forming candle, which could paint over them. They live in the top layer now.

The new-version card also shows in every state: without a licence, without market-by-order data and on an empty chart alike - three states used to skip it entirely.

1.1.13 - NEW UPDATE CARD, CENTRED AND WITH DIRECT LINKS.

The card that appears when a newer version is available has been redesigned, identically for every OFS indicator. It now sits exactly in the centre of the chart, shows each product with its current and new version, recommends updating, and carries clearly visible buttons: an Info button that opens the product's page on orderflowsmith.com directly, a Close button at the bottom and the familiar cross in the corner. When several OFS indicators on one chart have updates at once, they all share the single card - one line and one Info button each.

1.1.12 - CIRCLES AND MOVE ARROWS SIT ON THE WICK TO THE PIXEL.

Following yesterday's vertical fix, the horizontal anchor got the same treatment: iceberg circles and order-move arrows were one to two pixels to the side of the candle they belong to, because the coordinate asked of the platform differs from the one the platform itself draws the wick with. They now use the chart's own wick formula and sit on the candle exactly at every zoom.

1.1.11 - MARKERS SIT EXACTLY ON THEIR PRICE LEVEL.

Iceberg circles, tree branches and move arrows were drawn half a price row too low, so a marker appeared on the boundary between two levels instead of on the level where the iceberg actually happened. The cause was a leftover half-row correction from an old version: the chart already centres a price inside its row, and the extra correction pushed everything past the centre. At a deep zoom the offset grew to twenty pixels and more.

Every marker now sits exactly on the centre of its price level at any zoom - verified against the platform's own coordinate mapping.

1.1.10 - ALERT SOUND IS A LIST WITH A PLAY BUTTON.

The alert sound used to be a text field with "alert1" typed into it. If you did not already know what the sound files are called, there was no way to find out from inside the indicator, and a typo produced silence rather than an error. It is now the platform's own sound picker: a drop-down of the installed sounds with a small play button beside it, so you can hear a sound before you settle on it. It is the same control ATAS uses in its own indicators.

Because the list comes from the platform rather than from us, it also shows sounds you added yourself - drop a .wav into the platform's Sounds folder and it appears.

A sound you had chosen before is kept.


1.1.8 - THE UPDATE CARD'S CLOSE BUTTON IS A REAL BUTTON - a framed, highlighted square instead of a faint cross, comfortably clickable.

1.1.7 - THE PANEL FOOTER NO LONGER SHOWS YOUR E-MAIL ADDRESS. It read Licensed to: your@address - expires <date>, so anyone you sent a screenshot to could read who the license belongs to. It now reads v1.1.7 - license OK: version first, then the state of the license and nothing else, the same in every OFS indicator. Who the license belongs to stays in the settings, where only you see it.

1.1.6 - A NEW VERSION NOTICE. Once a day the indicator asks orderflowsmith.com whether a newer version has been released and, if so, shows a small card on the chart with what the new version brings you.

It sends nothing at all - no license key, no product name, not a single parameter - so the request cannot tell anyone what you use, and one request covers every OFS indicator on the chart. The answer is signed with the same key as your license, so nothing else can put text on your chart. It never blocks anything and it stays silent when there is no connection.

There is one card per chart, not one per indicator, and it lists every product that has an update. Close it and it will not come back until the next release. It can be switched off in Settings under 01 License.

1.1.5 - LICENCE GATE ON NOTIFICATIONS. Platform alerts and Telegram messages now require a valid key, exactly like the drawing on the chart does. The gate sits in the place where a notification is actually sent, not at the caller, so it cannot be bypassed by a new call site. Any queued notifications are discarded while the key is missing, so they do not pile up and all fire at once the moment a key is entered.

1.1.3 - waiting for the first iceberg no longer takes a wide box on the chart.

- Changed: while the book is streaming and nothing has met the evidence bar yet, the indicator shows a single small line in the panel corner - OFS ICEBERG · WAITING · 128 orders - instead of the three-line box the width of the panel. Waiting is normal work, not a fault, so it no longer wears the alarm color and no longer covers a part of the chart that has price in it. The order count is kept because it is the one number that proves the data is flowing.
- Added: Waiting Notice, in the Panel group. Compact is the new small line and the default, Full restores the previous wide box with all the counters, Off draws nothing at all while waiting.
- Unchanged on purpose: a genuine fault still shows the full box with every counter, whatever this setting says - book updates without an order id, trades that match no resting order, or display filters that removed every finding. Silence about a fault would be the one thing worse than a box that is too big.
- No change to detection.

0.3.3 - the product texts now say openly how this compares with level-based detectors.

- The description states what a side-by-side comparison will show: fewer marks, later, by design - a level-based tool cannot tell one hidden participant from a queue of small orders, so part of what it marks is ordinary book traffic, while here a false mark is close to impossible by construction.
- The honesty section spells out the two things a level detector cannot offer: every mark is auditable in the diagnostic log (which order id, when, why), and the panel counts the trades the indicator could NOT attribute, so you always know how much of the flow it actually saw.
- New FAQ: why it shows fewer icebergs than level-based detectors, and what to change if you want more findings at the cost of weaker evidence.
- No behavior change.

0.3.2 - the waiting notice says what is actually happening.

- Changed: the empty-chart notice while data flows but no iceberg has met the evidence bar now reads 'Waiting for the first iceberg.' instead of 'Nothing has qualified yet.' It is not an error state - the book is streaming and trades are being attributed - so the wording says 'working and waiting' rather than 'nothing'. The live counters underneath and the genuine error notices are unchanged.

0.3.1 - numbers in the tree stop disappearing, and active branches glow.

- Fixed: not every branch showed its number when zoomed out. Two causes. The number in a text row went to whichever level happened to be created first, so when several prices fell into one row the choice was random and the largest defence could stay unlabelled - the biggest level in the row wins now, with no sorting involved. And a number that did not fit past the end of its branch was dropped entirely, which meant the longest branch - the most important one - never had a number at all; it is now pressed against the edge instead of discarded.
- Added: Increment Glow, in the Level Tree group. A branch now stays lit towards the flash color for exactly as long as its +5 increment is shown, fading out together with it. The short flash still marks the moment size arrives; the glow keeps the levels being defended right now visible at a glance. It changes color only, so the tree never jumps, and it can be turned off.

0.3.0 - a deep audit: moved orders, stable drawing, centred circles.

- Fixed, and it mattered: an order that moved to another price kept crediting its OLD price. The engine reset its counters on the move (that part was right), but the iceberg record itself stayed live at the old price - new evidence earned at the new price was attributed to the old level, the circle stayed where the order no longer was, and part of the volume was lost outright. A moved order's iceberg is now ARCHIVED at the old price with everything it earned there, and new proof at the new price opens a new iceberg that knows where the old one stands.
- Added: Show Move Link - a dashed line connecting the old circle to the new one when an order moves and proves itself again. Two circles, one participant.
- Fixed: circles sat half a price row above the price. The platform reports the TOP of a price row, not its centre; every Y coordinate now targets the centre of the row and is computed from a single anchor, which also survives deep zoom where per-row queries saturate.
- Fixed: the tree and its numbers dropped out while zooming or moving the chart. Two causes: the layout was computed from a partial clip rectangle during zooms, and the same content was drawn into all three drawing layers - semi-transparent colors stacked darker than configured, and layers refreshed at different moments left ghosts. Layout now comes from a stable area and everything is drawn exactly once.
- Added: branch thickness adapts to zoom - it grows to the height of a price row when zoomed in and falls back to the configured minimum when zoomed out.
- Fixed: the PROVEN alert never fired when an existing refilled iceberg was upgraded to proven, which is the most common way proof arrives. Alerts now follow upgrades too.
- Fixed: a cancelled order could open a rotation. One hit followed by a cancel counted as consumed even with ninety contracts remaining - exactly the ordinary queue traffic that produced false rotations. Only an order eaten to zero opens one now.
- Fixed: with rotation enabled, volume could be counted twice at a level, and rotation counts no longer leak into refill counts.
- Fixed: a comma inside a diagnostic reason broke the CSV log; reasons use semicolons and the writer guards against it.
- Fixed: switching the diagnostic log off while data was flowing could crash the data thread in a rare timing; shared state is now cleared under the lock, and re-enabling the log after a write error retries.
- The panel's Strongest and Nearest rows now point only at icebergs that pass the display filters.
- The engine suite is 111 tests.

0.2.5 - the passive side of a trade is now DETERMINED, not assumed. This is what stopped it finding anything.

- Fixed, and it is the reason almost nothing was ever detected: the indicator treated one of the two order ids a trade carries as the resting order and merely verified it. On live data that assumption was wrong - out of thousands of trades, fifteen could be matched, because the field it trusted names the order that CROSSED the spread, and an aggressor is almost never resting in the book. Without a match there is no proof and no refill either, so the chart stayed empty.
- The specification was explicit about this and the earlier implementation only did half of it: the passive id must be DETERMINED from the two ids and verified to exist in the book on the side opposite the aggression. Both ids are now tried, and the one that is actually resting on the opposing side wins. If both qualify or neither does, the assignment is ambiguous and the trade is not counted - stated rather than guessed.
- Added: the panel reports which of the two fields the passive order actually came from. The documentation does not answer that question; these two numbers answer it from your own feed.
- Fixed: the empty-chart notice was long enough to be truncated, which made it useless at exactly the moment it was needed. The explanation is short now and the counts sit on their own line.
- The engine suite is 94 tests, including a trade whose ids are the other way round.

0.2.4 - the status numbers were only refreshed when something was found.

- Fixed: the order count, the trade attribution counters and the rejection count were assigned after the check that decides whether to publish - and that check only fires when a finding appears. Until the first iceberg, every one of them read zero, so the panel and the empty-chart notice claimed the book was not running while it was running at full speed. Diagnostics that lie are worse than none: they send you down the wrong path, which is exactly what happened.
- Changed: the empty-chart notice now separates 'waiting for the first book update' from 'the book is flowing but nothing is resting long enough to follow'.

0.2.3 - the three defects a full code audit turned up, and an empty chart that explains itself.

- Fixed: housekeeping ran only when a trade could be matched to a resting order. If the feed did not supply order

Frequently asked questions

How is this different from an iceberg detector that reads the DOM?
A DOM shows the total size at a price, not the individual orders behind it. A detector built on that can only observe that more traded than was displayed at the level, and it has to assume nothing else was added or cancelled meanwhile - an assumption that fails many times a minute in a fast book. This indicator reads each order separately and attributes each trade to the specific order it hit, so the hidden quantity is measured on one order rather than inferred from a level.
Why does it show fewer icebergs than level-based detectors?
Because it only marks what it can prove on a single order id, and proof takes more evidence than an impression. A level-based detector marks any price where more traded than was displayed, which also catches queues of ordinary orders taking turns - so it shows more marks, and more false ones. This indicator deliberately trades quantity for certainty: it marks later and less often, every mark carries its evidence level, and the diagnostic log lets you audit each one - which order id it stands on and why. It also tells you what it could NOT see: the panel counts trades that carried no order id or could not be attributed, so the coverage is never a guess. If you want more findings at the cost of weaker evidence, enable rotated tranches; the defaults keep only what is proven or repeatedly refilled.
What data do I need?
Market-By-Order depth, sometimes sold as order-by-order or full depth of book. A Rithmic subscription that includes it is known to work. Plain Level 2 is not enough, because it aggregates orders and throws away exactly the identifiers this indicator depends on. Without the data the panel says NO ORDER DATA and no market evidence is drawn; only the optional neutral alignment guide may remain visible.
Why does everything disappear when I reload the chart?
Order flow is not stored in chart history and cannot be replayed. The indicator works forward from the moment it is on the chart. This is a property of the data rather than a design choice, which is also why the detection is deterministic and why a diagnostic log is included so you can verify any session yourself.
What is the difference between PROVEN, REFILLED and ROTATED?
PROVEN means more traded against one order identifier than that identifier ever displayed, so the extra quantity was hidden - it is arithmetic. REFILLED means the same order posted its visible size again after being hit, repeatedly - a larger size, or the same size with a fresh queue position, which is how a replenished tranche arrives from the exchange. ROTATED means an order was consumed and a similar one appeared at the same price within milliseconds under a new identifier, which is how some venues rotate tranches. Only the first is a proof; the other two are strong patterns and are labelled as such.
Can I turn off the weaker evidence?
Yes. Accept Rotated Tranches in group 06 - Detection controls whether new rotated evidence is accepted. Each kind has its own count: Minimum Refills (Native) is how many times one order id has to replenish, Minimum Rotations (Synthetic) is how many times the order at a price has to be replaced. The second is higher on purpose, because ordinary queue turnover looks exactly like rotation and only repetition tells them apart. Findings already recorded in the live session are not rewritten when a detection setting changes.
What does Require Priority Refresh do?
A native iceberg keeps its order identifier when a tranche is replenished, but it usually loses its place in the queue. With this switch on, a refill only counts when that queue position actually moved, which separates a genuine new tranche from someone simply raising the size of an existing order. It is off by default because it has not yet been established that every feed reports a moving queue position, and a requirement that silently removes every signal is worse than no requirement at all. The diagnostic log records, for every refill, whether the queue moved - so you can decide from your own data rather than from ours.
Does it repaint?
Detection is event driven and never revisits a decision once made: a signal can only be upgraded to stronger evidence, never downgraded or removed retroactively. We do not use the phrase non-repainting about this indicator, because the parity test the other OFS indicators pass cannot be run on data that cannot be replayed. What we can offer instead is a deterministic engine and a diagnostic log, so the same recorded session always yields the same result.
Do levels disappear once price moves away?
No, and there is deliberately no setting that could make them. A level where size was absorbed stays for the rest of the session, because the moment it matters most is when price comes back to it. Only the visible price range of the chart limits what you see.
What do the two numbers beside each branch mean?
420 (3) means that level absorbed 420 contracts and three different orders did the absorbing. The first number is exactly what the length of the bar is drawn from, so the two always agree. Repeated refills of the same order do not increase the count in brackets - it counts orders, not events.
Will it slow the chart down?
The detection runs on the data thread and the chart receives a finished marker-and-level picture in one atomic step, at most ten times a second. Drawing only filters that snapshot to the visible chart and scales the graphics; it never reruns detection. The number of resting orders is capped, orders that a book snapshot no longer contains are released, and an optional timeout can release stale ones on a feed without snapshots. Confirmed findings are intentionally kept for the live session, so a very long and exceptionally busy session still carries more drawing work than a fresh one.
What does the number beside each branch mean?
420 means that the price level absorbed 420 contracts. It is exactly the quantity the branch length is drawn from, so the bar and the number always agree. The context panel reports the separate count of iceberg orders and price levels without covering the chart with extra labels.
⚠ This indicator is an analytical tool; it does not place orders and does not predict prices. Past behavior of the order book does not guarantee future results. Trading futures, forex and crypto carries a substantial risk of loss and is not suitable for everyone. This product is analysis software - it is not financial, investment or trading advice, and it cannot guarantee any profit. Every decision stays with you: whether to trade at all, position size, stop-loss and when to walk away. Any performance figures we publish come from historical testing; hypothetical and back-tested results have inherent limitations and never guarantee future results. To the maximum extent permitted by law, OrderFlowSmith is not liable for trading losses, missed opportunities or other damage arising from the use of this software. Never trade with money you cannot afford to lose.

Reviews

No reviews yet — be the first verified buyer to share your experience.