Cross-Venue Self-Trade-Prevention Semantics Normalization Slippage Playbook
Date: 2026-03-11
Category: knowledge (execution / slippage modeling)
Why this matters
Most desks already track STP/SMP events, but many still model them as a single binary flag (stp_triggered = 1).
That loses real money because STP semantics differ by venue, and each mode creates a different slippage path:
- canceling resting flow destroys queue priority,
- canceling incoming flow increases completion delay,
- decrement modes fragment residuals and cause urgency bursts later.
If you trade across multiple venues, your model needs a canonical STP language before you can measure and control the true tax.
What exchanges actually do (short map)
CME Globex (SMP)
- Uses SMP ID (iLink2 tag 7928 / iLink3 tag 2362) + instruction tag 8000.
- If instruction is absent, default is effectively resting-side cancel behavior.
- CME states SMP check does not add latency because all orders are checked in-engine.
Operational implication: do not assume all cancel events are “random churn”; many are deterministic SMP outcomes tied to tag policy.
Coinbase Exchange (STP)
- Taker order STP instruction takes precedence.
- Modes include
dc,co,cn,cb:dcdecrement/cancel,cocancel oldest,cncancel newest,cbcancel both.
Operational implication: same strategy can produce very different queue-loss patterns depending on taker-side flag choice.
Binance Spot (STP)
- Taker mode generally determines outcome (
EXPIRE_TAKER,EXPIRE_MAKER,EXPIRE_BOTH,DECREMENT; plus venue-specificTRANSFER). - Provides explicit prevented-match telemetry (
preventedMatchId, prevented quantity,EXPIRED_IN_MATCH).
Operational implication: Binance-style prevented-match streams are valuable for building high-quality labels and can guide schema design on venues with poorer observability.
Canonical normalization layer (required)
Map venue-specific modes into a canonical event type:
CANCEL_RESTINGCANCEL_INCOMINGCANCEL_BOTHDECREMENTTRANSFER_DECREMENT(if supported)
Also normalize actor role at trigger time:
AGGRESSOR_POLICYRESTING_POLICYDEFAULT_POLICY
And lifecycle consequence:
QUEUE_RESETCOMPLETION_DELAYRESIDUAL_FRAGMENTATION
Without this three-part normalization, cross-venue TCA is mostly apples vs oranges.
Slippage decomposition with STP semantics
Define implementation shortfall per child as:
[ C_i = C^{spread}_i + C^{impact}_i + C^{timing}_i + C^{stp}_i ]
where STP tax is mode-conditioned:
[ C^{stp}i = \sum_m \pi{i,m},\mathbb{E}[C\mid m, r_i, x_i] ]
- (m): canonical STP mode,
- (r_i): role context (incoming/resting-dominant),
- (x_i): regime features (spread state, volatility burst, queue depth, urgency).
This separates a pure STP branch cost from generic market impact.
Metrics that survive cross-venue differences
1) Prevented Notional Rate (PNR)
[ PNR = \frac{\sum \text{prevented_qty}\times\text{ref_px}}{\sum \text{submitted_qty}\times\text{ref_px}} ]
2) Queue Priority Loss Rate (QPLR)
Fraction of STP events causing effective queue reset on intended passive inventory.
3) STP Delay-to-Completion (SDC)
[ SDC = E[t_{complete}\mid STP] - E[t_{complete}\mid no\ STP] ]
Matched by symbol, time bucket, urgency class.
4) Mode-Specific Tail Uplift (MSTU)
[ MSTU_m = Q_{95}(C\mid m) - Q_{95}(C\mid no\ STP) ]
Tail view is essential; mean cost can look fine while p95 gets worse.
Feature set for production model
- Canonical STP mode + venue native mode
- Trigger side (incoming/resting) and strategy lineage pair
- Estimated queue position before/after event
- Re-entry latency, amend success latency, cancel burst context
- Microprice drift and short-horizon volatility around trigger
- Parent urgency (remaining qty, schedule gap, hard deadline)
- Venue regime flags (open/close/event window)
Use quantile models (q50/q90/q95) instead of mean-only regression.
Data contract (minimum)
Per child/order lifecycle:
- identity:
parent_id,child_id,strategy_id,symbol,venue - timing:
decision_ts,send_ts,ack_ts,cancel_ts,fill_ts - STP fields:
stp_key_or_id(e.g., CME 2362 / Coinbase stp flag / Binance mode)stp_mode_raw,stp_mode_canonicalstp_event_flag,prevented_qty,prevented_match_idstp_instruction_source(explicit/default)
- state: spread, depth, imbalance, queue estimate, urgency snapshot
- outcomes: completion time, realized shortfall bps, markouts
If you cannot join STP fields to realized shortfall at child level, you cannot estimate STP tax correctly.
Control policy (simple and effective)
- If
Q95(C | CANCEL_RESTING)breaches tail budget, reduce policies that repeatedly kill resting queue (mode governance + strategy netting). - If
SDCdominates, avoid overusingCANCEL_INCOMINGin urgent slices. - If
DECREMENTfragmentation rises, increase minimum effective child size and tighten re-slice cadence. - Apply venue-specific defaults explicitly; never rely on undocumented/exchange-default behavior for production.
Rollout plan
- Schema first (1 week): canonical STP mapping + validated joins.
- Shadow attribution (1-2 weeks): compute
C^stponly, no routing change. - Canary controls (5-10% flow): enable mode-aware policy guardrails.
- Scale-up: expand by liquidity buckets with hard rollback triggers on p95 and completion misses.
Rollback triggers (example):
- p95 shortfall regression > 5 bps for 2 consecutive windows,
- completion miss increase > 1.0pp,
- unexplained jump in prevented-notional concentration.
Research notes / references
- CME FAQ: Globex Self-Match Prevention (tags, defaults, latency note, usage constraints)
https://www.cmegroup.com/solutions/market-access/globex/trade-on-globex/faq-self-match.html - Coinbase Exchange Matching Engine (STP precedence +
dc/co/cn/cb)
https://docs.cdp.coinbase.com/exchange/concepts/matching-engine - Binance STP FAQ (mode set + prevented-match telemetry)
https://developers.binance.com/docs/binance-spot-api-docs/faqs/stp_faq - Databento: SMP as microstructure signal / atomic-event discussion
https://databento.com/blog/self-match-prevention
Bottom line
Treating STP as one boolean feature underprices slippage.
For multi-venue execution, you need:
- semantic normalization,
- mode-specific tail attribution,
- policy controls tied to queue loss vs completion delay trade-offs.
That turns STP from “compliance plumbing noise” into a controllable execution-risk budget.