scsf_GDO_Iceberg_Refill in GDO_Signals.dll ·
green star = hidden buyer / red star = hidden seller ·
v13.47
clip x refills reads as displayed size shown each reload, times how many times it reloaded (e.g. 3 x 30 = showed 3, reloaded 30 times).An iceberg is a large hidden order that keeps reloading a small visible tip at one price. This study watches the trade tape, spots a price level that gets eaten and reloaded again and again, and drops a star on Chart F at that price, the moment it happens.
Detection lives in a pure C++ core (GDO_Signals/core/iceberg_refill.h/.cpp), a faithful port of the Python tape_iceberg.py Signature B rule, parity-tested in Catch2. The study reads sc.GetTimeAndSales(), runs the core, and draws with sc.UseTool.
clip x refills label, side-colored, beside the star
| You see | It means | Bias |
|---|---|---|
| ✶ green, below a candle low | Passive buyer keeps refilling the bid as sellers hit it | Demand absorption, support |
| ✶ red, above a candle high | Passive seller keeps refilling the ask as buyers lift it | Supply absorption, resistance |
| Both sides at adjacent levels | Two-sided absorption (market-maker / range) | Range-bound, read with care |
Every trade carries its aggressor side, so the detector splits its tracking. A seller hitting the bid (SC_TS_BID) reveals a hidden buyer; a buyer lifting the ask (SC_TS_ASK) reveals a hidden seller.
| Star | Who is hiding | What they are doing | Read |
|---|---|---|---|
| BID ✶ | A passive buyer | Absorbing aggressive selling, replenishing the bid | Accumulation, likely support, bullish bias |
| ASK ✶ | A passive seller | Absorbing aggressive buying, replenishing the ask | Distribution, likely resistance, bearish bias |
Format: clip x refills.
3 x 30 means it showed 3 lots each time and reloaded 30 times. A small tip, a deep hidden order.LevelExitTicks.UTAM_ADD_ONLY_IF_NEW, LineNumber 84000 + n), so they stay on the chart as a record.Seeded from the 2026-05-27 raw tape. The old 3 / 10 placeholders flooded 137+ signals a day; these settings produce roughly 15 to 20 stars per session.
| Input | Default | What it controls | Tune |
|---|---|---|---|
MinRefill | 5 | Minimum reloads before a level qualifies as an iceberg | Raise for fewer, stronger stars |
MinAbsVol | 30 | Minimum total volume absorbed at the level | Raise to ignore thin levels |
RefillFraction | 0.5 | How much of the peak tip must reappear to count as a refill | Raise for stricter refills |
LevelExitTicks | 4 | How far price must leave before the episode closes | Raise to hold episodes longer |
MinClip | 2 | Minimum displayed tip size to consider the level | Raise to ignore tiny tips |
Label math: clip = peak displayed size, refills = refill_count. All five are SC study Inputs, so you can adjust them live without a rebuild.
Per price level, the core tracks the displayed size on each trade, the running total absorbed, a consume / replenish cycle, and a refill count. A refill is when the displayed size was eaten down and then a later trade shows it back to at least RefillFraction x peak. It fires once the level clears all three gates: enough refills, enough total volume, and a big enough tip.
on each trade at price P, side S (displayed = bid_size if S=BID else ask_size):
close levels where |level - P| > LevelExitTicks # episode bounding
st = level[P] (reset if S flipped)
st.total_absorbed += volume
if st.peak > 0 and st.drawn_down and displayed >= RefillFraction * st.peak:
st.refill_count += 1; reset consumed; st.drawn_down = false # a refill
st.peak = max(st.peak, displayed)
st.consumed += volume; if st.consumed >= st.peak: st.drawn_down = true
if not st.fired
and st.refill_count >= MinRefill
and st.total_absorbed >= MinAbsVol
and st.peak >= MinClip:
FIRE ICEBERG @ P, SIDE = BID|ASK, clip = st.peak, refills = st.refill_count
Signature B (refill) is what this study draws. It works on raw unbundled tape, so it is robust to trade-combining settings.
Signature A (one oversized print) is not in this DLL. The live API hands a custom study individual unbundled trades and (per SC Engineering board #98480) no setting combines them for a study, so an oversized-single-print rule cannot run live without self-combining. It is delegated to SC's native Large Volume Trade Indicator (study ID 390), which Pierre already runs on Chart F.
Side turns "a trade touched an iceberg" into four clean cases. Whether your entry was on the same side as the absorber (respected) or against it (fought) is the read.
| Your entry | Iceberg encountered | Verdict | Reading |
|---|---|---|---|
| LONG | BID iceberg below entry | Respected | Buyers accumulating underneath you |
| LONG | ASK iceberg above entry | Fought | Sellers capping you, target probably will not print |
| SHORT | ASK iceberg above entry | Respected | Sellers distributing overhead |
| SHORT | BID iceberg below entry | Fought | Buyers absorbing underneath, target probably will not print |
After 2 to 4 weeks of production data, the P&L gap between RESPECTED and FOUGHT trades is the indicator's actual edge. If the gap is meaningful, this becomes a live entry filter (or at least a Lessons-Learned tag). If it does not separate, it gets deprecated, honestly.
Notion attribution columns (Iceberg_BID_Levels, Iceberg_ASK_Levels) are a later phase. The shipped product is the live overlay.
scsf_GDO_Iceberg_Refill (from GDO_Signals.dll, SCDLLName("GDO Signals")) to your Chart F (NQ tape).DeployVerify_GDO_<date>.csv heartbeat writes once on chart load with the version tag and monitored Inputs.An earlier design used market-by-order depth (Pkg 12) and OrderID persistence. It was built, then abandoned: the depth feed only surfaces deep-book qty ≥ 3 orders and flickers them with no trade semantics, which produced a phantom signal (a bid above a candle high). Icebergs are a trade phenomenon, so detection moved to the trade tape. No Pkg 12 needed.
No stop-cluster detection. That is Bookmap's proprietary moat (self-reported ~80% accuracy), and SC engineering openly calls third-party stop-detection claims unreliable. If you want the stop signal, run Bookmap as a second screen; this indicator does not try to clone an inference layer with weak ground truth.