01The claim
A thin book does not just make entries harder. It quietly inverts your risk controls: the stop-loss, the most familiar safety device in trading, becomes a loss engine when it executes as a market order into depth that is not there. Our worst single day was not a bad thesis. It was a correct stop decision executed at full size into an empty book.
Around that one loud loss ran a quiet one: resting quotes that only fill when filling is bad. This piece walks both mechanisms with the real numbers, then the guards that came out of them. Nothing here is hypothetical; every rule maps to a line item we paid for.
02The numbers, honestly
[Skeleton: lay out the scoreboard before any theory, so the reader knows this is a post-mortem and not a pitch. Small table here.]
Working notes · from the live book
- The blind maker tier closed 68 round trips at a 29% win rate for −$219. Decomposed: stops −$217.85, take-profits +$9.85. A second blind variant added 25 trips for −$19. Geopolitics alone accounted for −$191 of blind making.
- The worst single day lost −$171, with the direct cause on record: a thin-book exit sweep, including a 762-share dump into depth that absorbed a fraction of it.
- At its peak, exposure to a single theme reached 58% of bankroll, assembled by sizing bumps that individually looked small.
- While that happened, the venue's account page showed −$37 against a real equity drawdown of −$187: the account-PnL API lags hourly, and the bot's own ledger trusted it.
- Execution quality underneath: 15,639 failed exit attempts and roughly 11,728 balance errors per minute-window logged before cancel/exit handling was made idempotent and non-fatal.
03The maker edge that wasn't there
[Skeleton: the mechanism of the slow bleed. Why a resting bid's booked edge is fiction until the fill is measured.]
Working notes · from the live book
-
The naive maker loop: rest a BUY at best bid, set fair value to the mid, book
edge = 0.3 × halfSpread + rebate. The 0.3 haircut was an unbacked constant standing in for a cost nobody had measured. -
A resting bid does not fill at a random instant. It fills when someone chooses
to sell into it, which skews toward informed sellers and falling prices. That is
adverse selection: conditional on the fill, fair value sits below the mid you
measured.
E[mid | filled] < bid. -
The phantom-edge algebra: with
fair = mid, Kelly at the bid ishalfSpread / (1 − bid), positive always, for every market, at any spread. The formula finds edge everywhere because the half-spread is exactly what adverse selection takes back. - Survival math at the configured defaults: the rebate on a $0.50 share is about $0.0005–0.00075 per share; the stop tolerance was $0.02. One adverse stop-out erased 27–40 rebate captures. A 29% win rate is not bad luck against that ratio; it is the expected shape.
04Case studies from the bad run
Three incidents, each with the fix it forced. All from the same live account, June 2026.
Case 1: The 762-share dump
A stop fired on an oversized position and the exit went out as a full-size taker order. The book was thin; the order walked the bid ladder down and kept walking it across ticks. That single episode is most of the −$171 day. The fix is a staged, depth-aware exit: each tick sells only what the book absorbs within a slippage budget, anchored to the episode start so it cannot chase the book down, with hard caps per order, per episode, and per tick, and an explicit preference to hold when depth is absent. A single exit that would by itself breach the daily loss limit now halts entries and waits for the operator instead of executing.
Lesson: a stop-loss is a liquidity demand. If the liquidity is not there, the stop is not risk reduction; it is a donation.
Case 2: Selling the leg the other one needed
The book held matched YES + NO inventory, a position that redeems for $1 with certainty at resolution. The exit logic treated each leg as ordinary inventory, so a stop sold one leg of the box into the same thin book and converted a guaranteed redemption into a naked directional loss. The rule that came out of it: matched both-sides inventory is settlement inventory. It is frozen away from stops, take-profits, and sweeps; only the excess above the matched amount trades.
Lesson: classify positions by what guarantees their value, then make the guarantee unbreakable by your own automation.
Case 3: The account that lied by $150
The dashboard read −$37 while real equity was down −$187, because the venue's account-PnL endpoint lags by up to an hour and the bot treated it as truth. The rebuild: an append-only ledger of actual fills from the exchange is the ground truth; local state reconciles against it continuously; equity divergence past a threshold forces a re-sync and flags an incident; PnL is bucketed (realized, unrealized, fees, rebates, resolution) so no single flattering number hides the bleed. And a small honesty rule with outsized value: never log "sold" unless an order was actually placed.
Lesson: a trading system needs one source of truth and it is the venue's fill record, not any PnL summary, including the venue's own.
05Measuring adverse selection: markout
[Skeleton: the defensive instrument. Define markout, show the gating loop, note that most retail makers never measure it.]
Working notes · from the live book
- Markout: the mid-price move in the N seconds after your fill, signed so that negative means the market moved against you. A market whose fills are followed, on average, by adverse moves has toxic flow; the spread capture there is fictional and the rebate will not cover it.
- Implementation that sufficed: EWMA of per-fill markout, kept per market and per category, a minimum sample count before judging, and a toxicity threshold past which the bot simply stops quoting that market. Toxicity memory persists across restarts within the day, so a reload cannot forget who was running it over.
- Computable entirely from data already streaming (the book and your own fills). No new feed, no latency requirement. Most retail makers never measure it.
- The exit-quality ledger cut the other way too: we cut losers well but strangled winners. Entries in the 0.35–0.50 band left +$0.319 per share on the table and 70% of them eventually won; entries at or above 0.75 all won yet still left +$0.172 per share unclaimed. Below 0.35 the early exits genuinely saved money (6% eventually won). Exit asymmetry followed: scalp caps stay for weak longshots, confident referenced positions ride.
06Sizing that respects the exit
[Skeleton: sizing errors compound microstructure errors. Every fix here is about asking "can I get out?" before getting in.]
Working notes · from the live book
- "Can I exit this size within budget?" became a pre-entry gate, not an exit-time discovery: the bid side must absorb at least half the intended size within the stop's slippage budget, and the real price impact of walking the book for your clip is charged against the edge before entry. Too thin to leave means too thin to enter.
- Kelly with a point-estimate fair value over-bets by construction (the growth penalty scales with the variance of your fair estimate). Fix: shrink fair toward the market mid in proportion to reference confidence. The market's price is itself a forecast; ignoring it was the blind tier's core sin.
- The venue minimum was a silent multiplier: the CLOB rejects orders under 5 shares, and the old code bumped any sub-minimum Kelly intent up to 5. A 1-share intent became a 5x over-bet on the thinnest edges. Now the bump is allowed only within a tolerance of the Kelly intent; past it, skip the trade entirely.
- Hard exposure caps enforced after all sizing adjustments, because two separate "small" bumps assembled the 58% concentration: per outcome 10%, per market 25%, per category 30%, total deployed 20% of bankroll, re-checked every tick with over-cap add-on orders cancelled automatically.
- Strategies carry an expectancy record and disable themselves: after a minimum trip count, a tier running below the loss threshold per trip stops trading until its numbers recover. The blind maker at roughly −$3 per trip is exactly what this gate exists to catch. Catastrophic halts are sticky and clear only on explicit operator resume.
07A thin-book survival checklist
What we would institutionalize on any desk quoting these venues. Every line is a receipt.
- Book maker edge only from measured fills. A resting order has no edge until markout says the flow it attracts is benign.
- Gate quoting on toxicity per market and per category, with a sample floor, and stop quoting where the EWMA turns adverse.
- Make "can I exit this size within the slippage budget?" a pre-entry condition: absorbable fraction and price impact, walked on the real book.
- Execute stops as staged, depth-capped exits anchored to the episode start. Holding beats dumping into a gap; a stop that cannot fill within budget is an alert, not an order.
- Freeze matched both-sides inventory away from all exit logic. Settlement inventory redeems; it is never stopped, never half-sold.
- Enforce exposure caps after every sizing adjustment, including venue minimums and incentive-driven bumps, and cancel over-cap add-ons continuously.
- Give every strategy an expectancy record and the ability to disable itself; make catastrophic halts sticky until a human resumes.
- Treat the venue's fill record as the only truth. Reconcile continuously, bucket PnL so no summary number can flatter, and never record an exit that did not place.
08Open questions
- Expectancy is still bucketed per strategy; the useful cuts (spread regime, time to resolution, liquidity band, fill type) need more closed trips before they say anything.
- A correlation haircut on Kelly for same-cluster positions; category caps are the blunt proxy standing in for real covariance treatment.
- The live maker fill-rate haircut: paper fills on trade-through with a queue penalty, but the honest number needs a measured live pilot.
- Whether a structurally thin market is ever worth quoting at all once measured toxicity and reward income are netted, or whether thin books are purely a taker's hunting ground.