vike
Market making

Quote emission

The one shared tick step both lanes drive — its stages in order, what each one consumes, the two gates only a re-price consults, and the hold that must never be silent.

crates/vike-mm/src/quote.rs is "the maker's QUOTE-EMISSION unit — the one shared tick step both Strategy lanes drive". SpreadMaker::requote "is the pipeline: own-filter the public book → price (A-S layer or the pure QuoteStyle placement) → reward-band clamp → inventory-skew the sizes → flow-toxicity widen/cut → per-side breaker suppression → LADDER or SINGLE placement. The STAGE ORDER is semantic (each stage consumes the previous stage's (price, size)), and every stage's 'off ⇒ byte-identical' contract is stated inline at the stage that owns it." It "stays ONE straight-line function rather than a guard-stage pipeline: this crate runs on the p99 core thread, and inline is what makes the neutral-reduction argument checkable by reading."

The two lanes

Both are in crates/vike-mm/src/strategy_impl.rs. on_quote_tick builds a one-level-per-side BookView from the touch, on the grid "LEARNED from the L2 book lane (learned_book_tick) when one has been seen, else the configured tick_size param". on_order_book builds a view from the top depth_levels + 2 levels of the L2Book — "enough to index the Depth level AND still expose a genuine best after filtration removes our own top-of-book level" — and stamps the tick with the mount's now. ts everywhere is "the triggering event's EVENT ts (quote/book), never wall-clock."

The stages

(1) Own-filter. Only when filter_own is set. "Two filtration backends behind the ONE filter_own gate: the opt-in OwnOrderBook ladder … when it is mounted, else the original single-snapshot pair". On the default path the raw book is borrowed with no clone. Both backends are on quote styles.

(2) Price. The signed inventory is read once from HftBroker::position. If A-S state is present, AsState::price produces the pair (and advances σ̂²); otherwise BookView::priced applies the selected QuoteStyle. A None means "no valid two-sided quote (book lacks a side / A-S pinned at a wall) — hold the current resting orders untouched this tick".

(2b) Reward clamp. With a positive reward weight, clamp_into_band pulls the pair into the venue's reward band, scored off the book midpoint, "not the A-S reservation the candidate is centred on". It is skipped inside the A-S blackout: "the maker quotes at the walls (A-S widest) and must NOT be reward-clamped back into the band — that would farm rewards straight into the resolution vol spike." See liquidity rewards.

(3) Sizes. skew_multipliers shapes qty per side from inventory versus target — "neutral params yield (1.0, 1.0)". (3b) bumps each side up to the reward min_size, never down. See inventory skew.

(3c) Toxicity. With a non-zero ToxicityParams bag and a reading in hand, the toxic side is pushed further from mid by flow · widen · half — half being this tick's (ask_px − bid_px)/2, "captured BEFORE any widen so both sides scale off the SAME base spread" — and its size cut by (1 − flow · size_cut).max(0). (3c-i) synthesizes the reading from OFI when no external one has ever arrived; short-term alpha has the conditions.

(4) Suppression. A side is suppressed while ts < suppressed_until with the breaker enabled, or when the toxicity cut drove its size to 0 while the guard is active. That second clause is deliberately guard-scoped: on the default path "a side can reach 0 only via an extreme inventory skew whose long-standing place-at-zero behavior is preserved".

(5) Placement. An active ladder (levels >= 2) rests N rungs per side from this tick's pair; otherwise the single-order tail runs, bid first then ask. Switching modes retires the other mode's orders first (retire_single_order, retire_ladder_orders), each "a guarded no-op" when there is nothing to retire. Rungs are on ladder quoting.

One side, three arms

requote_single_side is the collapsed per-side tail, keyed by the tag "bid" or "ask":

  • Suppressed: pull the resting quote with cancel_tagged, "recording a CENSORED own outcome for the OwnFillFit κ MLE BEFORE the resting snapshot / placement clock is cleared."
  • Not resting: submit_limit_tagged.
  • Resting: modify_tagged in place, "additionally gated by the order-refresh TOLERANCE (refresh_skips) and the reward min-order-age hold (reward_moas_holds): a target that barely moved leaves the resting order — and its queue position — untouched, sending nothing."

The header is explicit that the two gates "are reachable ONLY from the re-price arm: a place or a pull is never gated." refresh_skips answers false at once when no tolerance is configured, when nothing is resting, or when the side is stale — a fill has invalidated a snapshot that "is the maker's INTENDED quote but the venue-side remainder is smaller, so the comparison would wrongly read 'no change' and the partial-fill size top-up would be lost." reward_moas_holds short-circuits the same way, "so a safety re-price (a mid that ran the quote out of the band) always fires." The arithmetic behind the first gate is on refresh tolerance. Every arm updates that side's SideState and mirrors its verb into the own-order ladder when one is mounted.

The hold that speaks

An unpriced tick is announced on the edge, not swallowed

requote's early return on None "was the maker's one wholly silent hold". SpreadMaker::note_no_quote now warns once when a hold episode opens — "maker HOLDING: the book priced no two-sided quote … Zero levels on a side means the FEED is not delivering that side — check the venue subscription before touching the maker's tuning" — and note_quote_resumed warns once when it closes. The no_quote_holding field doc carries the incident: a maker "can hold forever with orders:0, fault:null and an empty journal, which is exactly the state prod2 sat in on 2026-08-17 across ~112k summary seq while its bybit market-data socket carried keepalives and no orderbook.50 data." The fee-floor warn could not speak, "because AsState::price returns at fair_value(view)? BEFORE reaching it".

When the break-even refusal is the cause, note_no_quote says nothing and does not latch: AsState::note_fee_floor "has already announced the hold with the two numbers that make it actionable, and it announces its own recovery." Both warns are edge-triggered because the requote is the vike-core hot fold, whose rule is "instrument per-order boundaries and fault transitions only."

On this page