pub struct OrderBook {
pub expiry: u64,
pub strike: Decimal,
pub option_type: OptionType,
pub symbol: String,
bids: BTreeMap<Decimal, PriceLevel>,
asks: BTreeMap<Decimal, PriceLevel>,
orders: HashMap<u64, OrderMeta>,
pending_events: Vec<OrderBookEvent>,
pub last_bid_snapshot: Vec<(Decimal, Decimal)>,
pub last_ask_snapshot: Vec<(Decimal, Decimal)>,
pub pending_l2_sequence: Option<i64>,
}Expand description
A pure, synchronous limit order book for a single instrument.
All state transitions are deterministic. Events are collected into an
internal buffer and must be drained by the caller via drain_events.
Fields§
§expiry: u64§strike: Decimal§option_type: OptionType§symbol: String§bids: BTreeMap<Decimal, PriceLevel>§asks: BTreeMap<Decimal, PriceLevel>§orders: HashMap<u64, OrderMeta>§pending_events: Vec<OrderBookEvent>Buffered events produced by the last operation.
last_bid_snapshot: Vec<(Decimal, Decimal)>§last_ask_snapshot: Vec<(Decimal, Decimal)>§pending_l2_sequence: Option<i64>Implementations§
Source§impl OrderBook
impl OrderBook
fn remove_order_from_side_at_price( book: &mut BTreeMap<Decimal, PriceLevel>, price_key: Decimal, order_id: u64, ) -> Option<Order>
fn remove_order_from_side_anywhere( book: &mut BTreeMap<Decimal, PriceLevel>, order_id: u64, ) -> Option<Order>
pub fn new(expiry: u64, strike: Decimal, option_type: OptionType) -> Self
pub fn with_symbol( expiry: u64, strike: Decimal, option_type: OptionType, symbol: String, ) -> Self
Sourcepub fn drain_events(&mut self) -> Vec<OrderBookEvent>
pub fn drain_events(&mut self) -> Vec<OrderBookEvent>
Drain all pending events produced by recent operations.
The caller must drain events after each mutation to forward them to downstream consumers. Events are returned in the order they were produced.
pub fn add_order( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, timestamp: u64, )
pub fn set_pending_l2_sequence(&mut self, sequence: i64)
pub fn add_order_with_wallet( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, )
Sourcepub fn add_order_with_metadata(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: Side,
wallet: WalletAddress,
timestamp: u64,
client_id: Option<String>,
mmp_enabled: bool,
original_size: Decimal,
)
pub fn add_order_with_metadata( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, client_id: Option<String>, mmp_enabled: bool, original_size: Decimal, )
Add an order with full metadata (client_id, mmp_enabled, original_size).
Production code paths should prefer this over add_order_with_wallet()
so that metadata survives WAL snapshot round-trips.
Sourcepub fn order_count(&self) -> usize
pub fn order_count(&self) -> usize
O(1) count of live orders in this book.
Sourcepub fn append_order_wallets(&self, out: &mut Vec<(u64, WalletAddress)>)
pub fn append_order_wallets(&self, out: &mut Vec<(u64, WalletAddress)>)
Append lightweight (order_id, wallet) pairs for live orders.
This avoids constructing full OrderRecord values when callers only
need ownership metadata for snapshot fallback paths.
Sourcepub fn get_all_order_ids(&self) -> Vec<u64>
pub fn get_all_order_ids(&self) -> Vec<u64>
Get all order IDs in this orderbook.
pub fn cancel_order(&mut self, order_id: u64) -> Option<Order>
Sourcepub fn cancel_order_for_replay(&mut self, order_id: u64) -> Option<Order>
pub fn cancel_order_for_replay(&mut self, order_id: u64) -> Option<Order>
Recovery-only cancel path.
During replay, the cancel command is authoritative. If a stale snapshot
left an order at the wrong price level, wrong side, or with missing
metadata, scrub that order_id from the book instead of leaving a
ghost order that can cross a newer replayed order.
Sourcepub fn reduce_order_quantity(&mut self, order_id: u64, qty: Decimal) -> bool
pub fn reduce_order_quantity(&mut self, order_id: u64, qty: Decimal) -> bool
Reduce an order’s quantity by qty. If remaining quantity hits zero,
the order is removed from the book. Returns true if the order was
fully consumed (removed), false if partially reduced or not found.
Used during journal replay to apply fills that occurred after the maker’s original command was replayed.
pub fn get_best_bid(&self) -> Option<Decimal>
pub fn get_best_ask(&self) -> Option<Decimal>
Sourcepub fn is_crossed(&self) -> bool
pub fn is_crossed(&self) -> bool
Returns true if the orderbook is in a crossed state (best bid >= best ask).
pub fn get_bid_depth(&self) -> Vec<(Decimal, Decimal)>
pub fn get_ask_depth(&self) -> Vec<(Decimal, Decimal)>
pub fn get_spread(&self) -> Option<Decimal>
pub fn total_bid_volume(&self) -> Decimal
pub fn total_ask_volume(&self) -> Decimal
Sourcepub fn process_order(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: Side,
wallet: WalletAddress,
timestamp: u64,
trade_id: u64,
) -> (MatchResult, bool)
pub fn process_order( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, trade_id: u64, ) -> (MatchResult, bool)
Process an order incrementally – matches one maker order at a time.
Convenience wrapper that stores default metadata. Tests should use this;
production callers should prefer process_order_with_metadata().
Sourcepub fn process_order_with_metadata(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: Side,
wallet: WalletAddress,
timestamp: u64,
trade_id: u64,
client_id: Option<String>,
mmp_enabled: bool,
original_size: Decimal,
) -> (MatchResult, bool)
pub fn process_order_with_metadata( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, trade_id: u64, client_id: Option<String>, mmp_enabled: bool, original_size: Decimal, ) -> (MatchResult, bool)
Process an order incrementally with full metadata.
Returns: (MatchResult, bool)
MatchResult: The result of matching (Fill, SelfTrade, or NoMatch)bool: Whether more matching is possible (true= can call again,false= order complete/rejected/self-trade)
Note: For SelfTrade result, the order is NOT added to the book. The caller must handle cancellation.
Events (fills, L2 updates, orderbook snapshots) are buffered internally.
Call drain_events to retrieve them.
Sourcefn try_match_one_maker(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: &Side,
wallet: &WalletAddress,
timestamp: u64,
trade_id: u64,
) -> MatchResult
fn try_match_one_maker( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: &Side, wallet: &WalletAddress, timestamp: u64, trade_id: u64, ) -> MatchResult
Try to match with one maker order.
Sourcefn try_match_buy(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
wallet: &WalletAddress,
timestamp: u64,
trade_id: u64,
) -> MatchResult
fn try_match_buy( &mut self, order_id: u64, price: Decimal, quantity: Decimal, wallet: &WalletAddress, timestamp: u64, trade_id: u64, ) -> MatchResult
Try to match a buy order with the best ask.
Sourcefn try_match_sell(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
wallet: &WalletAddress,
timestamp: u64,
trade_id: u64,
) -> MatchResult
fn try_match_sell( &mut self, order_id: u64, price: Decimal, quantity: Decimal, wallet: &WalletAddress, timestamp: u64, trade_id: u64, ) -> MatchResult
Try to match a sell order with the best bid.
Sourcefn has_more_liquidity(&self, side: &Side, price: Decimal) -> bool
fn has_more_liquidity(&self, side: &Side, price: Decimal) -> bool
Check if there is more liquidity available at the given price.
Sourcepub fn add_order_to_book_with_events(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: Side,
wallet: WalletAddress,
timestamp: u64,
)
pub fn add_order_to_book_with_events( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, )
Add order to book and emit L2 and orderbook update events.
Sourcepub fn add_order_to_book_with_events_full(
&mut self,
order_id: u64,
price: Decimal,
quantity: Decimal,
side: Side,
wallet: WalletAddress,
timestamp: u64,
client_id: Option<String>,
mmp_enabled: bool,
original_size: Decimal,
)
pub fn add_order_to_book_with_events_full( &mut self, order_id: u64, price: Decimal, quantity: Decimal, side: Side, wallet: WalletAddress, timestamp: u64, client_id: Option<String>, mmp_enabled: bool, original_size: Decimal, )
Add order to book with full metadata and emit L2/orderbook update events.
Production code paths should prefer this over add_order_to_book_with_events()
so that metadata survives WAL snapshot round-trips.
fn emit_events(&mut self, fills: &[Fill], timestamp: u64)
pub fn get_orderbook_snapshot( &self, ) -> (Vec<(Decimal, Decimal)>, Vec<(Decimal, Decimal)>)
Sourcepub fn sync_l2_snapshot_baseline(&mut self)
pub fn sync_l2_snapshot_baseline(&mut self)
Sync the L2 snapshot baseline to the current orderbook state.
Must be called after journal replay so that subsequent L2 diffs are computed against the replayed state, not against an empty book.
Sourcepub fn emit_orderbook_events(&mut self, timestamp: u64)
pub fn emit_orderbook_events(&mut self, timestamp: u64)
Emit L2 and orderbook update events after a modification (cancel, etc.) Call this after modifying the orderbook when you need to notify subscribers.
pub fn compute_l2_updates( &self, current_bids: &[(Decimal, Decimal)], current_asks: &[(Decimal, Decimal)], ) -> L2UpdateSet
pub fn has_open_orders(&self) -> bool
Sourcepub fn get_all_orders(&self) -> Vec<OrderRecord>
pub fn get_all_orders(&self) -> Vec<OrderRecord>
Get all orders as a snapshot for persistence.
Sourcepub fn restore_from_orders(&mut self, orders: Vec<OrderRecord>)
pub fn restore_from_orders(&mut self, orders: Vec<OrderRecord>)
Restore orderbook from a list of orders.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for OrderBook
impl RefUnwindSafe for OrderBook
impl Send for OrderBook
impl Sync for OrderBook
impl Unpin for OrderBook
impl UnsafeUnpin for OrderBook
impl UnwindSafe for OrderBook
Blanket Implementations§
§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
§fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read more§fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
ALL modifier for aggregate functions Read more§fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
§fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoSql for T
impl<T> IntoSql for T
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.