Queue-Priority Drift from Cancel/Replace: Slippage Control Playbook
Date: 2026-03-02
Category: research (slippage modeling)
Why this matters
Many execution stacks treat passive order management as harmless micro-optimization:
- quote moves a little → cancel/repost,
- short-term alpha flips → cancel/repost,
- inventory nudges → cancel/repost.
But in price-time-priority books, frequent cancel/replace can silently destroy queue position.
That turns “tight spread capture” into:
- lower fill probability,
- longer waiting time,
- late-session urgency spikes,
- worse aggressive catch-up cost (tail slippage).
In other words: you can lose bps without ever crossing the spread early.
Core idea
Model each passive child order as an asset with two coupled values:
- queue-priority value (how close you are to being filled),
- information value (how stale/toxic your quote has become).
Then choose among keep / amend / cancel-replace / cross by balancing:
- expected queue-value decay,
- toxicity risk,
- deadline risk.
The key is to make queue-priority loss explicit in the objective, not hidden in post-trade analytics.
Minimal state
At decision tick (t):
- (x_t): remaining parent quantity
- (\tau_t): remaining time budget
- (q_t): estimated queue position (shares ahead)
- (\lambda^{exec}_t): contra arrival intensity at our price
- (\lambda^{cancel}_t): cancellation intensity ahead of us
- (\lambda^{tox}_t): adverse-selection / toxicity proxy intensity
- (r_t): replace intensity in recent window (self-induced)
- (a_t): action (\in{\text{keep, amend, replace, take, pause}})
Priority-drift slippage objective
For candidate action (a), optimize:
[ \min_a ; \mathbb{E}[IS(a)] + \lambda_{95}Q_{0.95}(IS(a)) + \lambda_{miss}\Pr(\text{deadline miss}|a) ]
with execution constraints (participation cap, venue risk, kill-switch state).
Decompose expected slippage:
[ \mathbb{E}[IS] = C_{spread/fee} + C_{impact} + C_{delay} + C_{priority_drift} ]
where (C_{priority_drift}) captures extra cost from losing queue rank after cancel/replace.
Modeling queue-priority drift
1) Fill-hazard under current queue rank
Approximate passive fill hazard:
[ h_t \approx f\big(\lambda^{exec}_t,\lambda^{cancel}_t,q_t\big) ]
Expected time-to-fill increases convexly with (q_t) in thin/fragile books.
2) Replace transition penalty
A replace action typically resets queue rank:
[ q_t \rightarrow q'_t \gg q_t ]
Define Priority Reset Cost (PRC):
[ \text{PRC}_t = \mathbb{E}[IS|q'_t] - \mathbb{E}[IS|q_t] ]
Estimate PRC by replaying comparable states with/without replacement.
3) Keep-priority amend exception
Some venues support in-place amend for restricted edits (e.g., size reduction) while preserving queue priority.
When available:
amend_keep_priorityoften dominates cancel-replace,- especially when (q_t) is already favorable.
So model venue capability as a feature:
[ \phi^{kp}_v \in {0,1} ]
and gate action space accordingly.
4) Replace pressure feedback
Frequent replacements can become self-reinforcing:
- reset queue → miss fills → urgency rises → more replacement/crossing.
Define a local pressure index:
[ \text{RPI}_t = z(r_t) + \beta_1 z(\text{tox}_t) + \beta_2 z(\text{deadline burn}) - \beta_3 z(\text{queue advantage}) ]
Higher RPI should increase the penalty on discretionary replace actions.
Action scoring
For each action (a):
[ \text{Score}(a)=\hat{q95}{IS}(a)+\gamma_1\widehat{PRC}(a)+\gamma_2\hat{p}{miss}(a)+\gamma_3\hat{m}_{tox}(a) ]
Choose argmin over feasible actions.
Practical intuition:
- keep if queue advantage is high and toxicity is tolerable,
- amend-keep-priority when possible for size/inventory changes,
- replace only when expected toxicity reduction exceeds PRC,
- take when deadline/tail-risk dominates.
Causal estimation notes (important)
Replace decisions are endogenous (we replace more when stressed).
Naive comparisons overstate or understate PRC.
Use at least one of:
- bounded randomization on replacement threshold,
- doubly robust / AIPW correction,
- matched state replay (same regime, queue state, microvol window),
- venue-stratified estimation (different priority and amend rules).
State machine
Build Priority Drift Risk State (PDRS) from RPI + miss-pressure + toxicity.
- STABLE: low replace pressure, healthy fill progress
- DRIFT: replace frequency rising, queue advantage eroding
- RESET-STORM: repeated priority resets, fill collapse
- TOXIC: reset-storm + adverse markout spike
- SAFE: hard breach (q95, miss-rate, reject-rate)
Policy sketch:
- STABLE: passive-first, low replace frequency
- DRIFT: prefer keep-priority amend, larger deadband before replace
- RESET-STORM: freeze discretionary replace; controlled crossing ladder
- TOXIC: aggressive risk downshift, venue mask/quarantine candidates
- SAFE: emergency throttle / halt rules
Use hysteresis + dwell-time to prevent oscillation.
Data contract (must log)
Per child-order lifecycle:
- order create/amend/replace/cancel timestamps
- old/new order IDs and queue-rank estimate before/after
- action reason code (alpha flip, inventory, risk, manual)
- venue capability flags (keep-priority amend support)
- expected PRC at decision time
- realized fill latency, fill ratio, slippage, markout
Daily diagnostics:
- PRC calibration (predicted vs realized)
- replace-rate vs completion-rate frontier
- q95 IS by PDRS state
- fraction of replace actions that were avoidable ex-post
- share of amend_keep_priority usage where supported
Online pseudo-flow
for each decision tick t:
S_t <- observe(queue, flow, toxicity, deadline)
state <- PDRS(S_t)
actions <- feasible_actions(venue_capabilities, risk_constraints)
for a in actions:
q95[a] <- SlippageQ95.predict(S_t, a)
prc[a] <- PriorityResetCost.predict(S_t, a)
pmiss[a] <- MissModel.predict(S_t, a)
mtox[a] <- MarkoutModel.predict(S_t, a)
score[a] <- q95[a] + g1*prc[a] + g2*pmiss[a] + g3*mtox[a]
a_t <- argmin(score)
execute(a_t)
log(decision + outcomes)
Rollout plan
- Shadow (2–3 weeks): compute PRC/RPI/PDRS, no control changes.
- Canary (5% flow): enforce replace deadband + amend-first policy.
- Ramp: 5% → 15% → 30% with strict q95/miss guardrails.
- Promotion: weekly champion–challenger review.
Rollback triggers:
- q95 IS breach,
- completion degradation,
- state flapping,
- unexplained markout deterioration.
Common failure modes
- Blindly minimizing replace count
- can trap toxic quotes and worsen markout.
- Ignoring venue heterogeneity
- amend rules differ by venue/instrument.
- Good average, bad deadline tails
- must include miss-risk directly in objective.
- Queue-estimation drift
- periodic recalibration needed when feed/latency profile changes.
Practical checklist
- Add queue-rank before/after replace logging
- Build PRC estimator and calibration dashboard
- Add venue keep-priority capability matrix
- Implement amend-first policy where valid
- Add replace deadband + state-dependent thresholds
- Wire PDRS state machine to execution control plane
- Run shadow/canary with hard rollback gates
References (starting points)
- Moallemi, Yuan (2016), A Model for Queue Position Valuation in a Limit Order Book.
- Cartea, Jaimungal, Penalva, Algorithmic and High-Frequency Trading.
- Gatheral, Schied, Slynko and related market-impact literature.
- Binance Spot API docs: Order Amend Keep Priority (practical example of amend vs cancel-replace priority outcomes).
Bottom line
A passive order is not just “posted liquidity”; it is a queue asset with decaying optionality.
If your controller ignores queue-priority drift from cancel/replace churn, it will eventually pay in deadline panic and p95 slippage—even when average spread stats look fine.