pub struct OrderBookL1 {
pub last_update_time: DateTime<Utc>,
pub best_bid: Option<Level>,
pub best_ask: Option<Level>,
}Expand description
Normalised Barter OrderBookL1 snapshot containing the latest best bid and ask.
Fields§
§last_update_time: DateTime<Utc>The instant this book state describes — the venue’s own, where the venue publishes one.
§Producer obligation
A producer must set this to the same instant it puts in the wrapping
MarketEvent::time_exchange, and it should
come from the venue rather than from a local or aggregator clock.
Downstream state orders L1 updates on this field, not on the event’s, so the two must not disagree. A producer that lets them diverge gets no error and no log: a staleness guard keyed on this field can reject legitimately newer updates and freeze the held book.
§Not every in-tree producer has a venue instant to use
The “should” above is not a “must”, because some venues publish no book timestamp:
- Binance Spot
bookTickercarries{u, s, b, B, a, A}and no time field, soBinanceOrderBookL1falls back to the host clock at deserialisation. (Binance USD-M futures does sendT, and that path uses it.) - IBKR quotes are assembled from separate bid/ask/size ticks, which carry no per-tick
venue instant, so
exchange::ibkr(behind theibkrfeature, hence no link) stamps the assembly time.
Both fill the field from a local clock, and both keep it consistent with time_exchange as
required above. Consumers must therefore not rank this field against a tick timestamp
from another source — a trade’s time_exchange, say — since the gap between them is
milliseconds and the comparison would be decided by skew rather than by the market. Ranking
it against a coarser instant, such as a candle’s close_time, is sound while the gap stays
well above the skew. DefaultInstrumentMarketData::price in the rustrade crate does
exactly that, and documents where the margin runs out.
best_bid: Option<Level>§best_ask: Option<Level>Implementations§
Source§impl OrderBookL1
impl OrderBookL1
Source§impl OrderBookL1
impl OrderBookL1
Sourcepub fn mid_price(&self) -> Option<Decimal>
pub fn mid_price(&self) -> Option<Decimal>
Calculate the mid-price by taking the average of the best bid and ask prices.
See Docs: https://www.quantstart.com/articles/high-frequency-trading-ii-limit-order-book
Sourcepub fn volume_weighed_mid_price(&self) -> Option<Decimal>
pub fn volume_weighed_mid_price(&self) -> Option<Decimal>
Calculate the volume weighted mid-price (micro-price), weighing the best bid and ask prices with their associated amount.
None when either side is absent, and when both sides carry a zero amount — a feed that
publishes prices without sizes produces exactly that book, and the weighting is undefined for
it. Fall back to mid_price when a price is needed regardless of size.
See Docs: https://www.quantstart.com/articles/high-frequency-trading-ii-limit-order-book
Trait Implementations§
Source§impl Clone for OrderBookL1
impl Clone for OrderBookL1
Source§impl Debug for OrderBookL1
impl Debug for OrderBookL1
Source§impl Default for OrderBookL1
impl Default for OrderBookL1
Source§impl<'de> Deserialize<'de> for OrderBookL1
impl<'de> Deserialize<'de> for OrderBookL1
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for OrderBookL1
Source§impl From<AlpacaQuote> for OrderBookL1
The quote as a top-of-book, stamped with the quote’s own time.
impl From<AlpacaQuote> for OrderBookL1
The quote as a top-of-book, stamped with the quote’s own time.
The book is the feed’s, not the market’s: IEX quotes are IEX’s own top of book, SIP quotes are the NBBO, and crypto quotes are Alpaca’s crypto venue.
§A zero price is absent
Every Alpaca quote carries a price for both sides, so a side with nothing quoted on it can only
arrive as a zero price. A zero-priced level would assert someone will trade at zero,
and a mid-price averaged against it is wrong in a way nothing downstream can detect. So a zero
price maps to None, the rule the Binance and London Strategic Edge L1 decoders follow. A zero
size at a real price is kept: the price is still a quote.
Source§fn from(quote: AlpacaQuote) -> Self
fn from(quote: AlpacaQuote) -> Self
Source§impl From<OrderBookL1> for DataKind
impl From<OrderBookL1> for DataKind
Source§fn from(value: OrderBookL1) -> Self
fn from(value: OrderBookL1) -> Self
Source§impl Hash for OrderBookL1
impl Hash for OrderBookL1
Source§impl Ord for OrderBookL1
impl Ord for OrderBookL1
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for OrderBookL1
impl PartialEq for OrderBookL1
Source§impl PartialOrd for OrderBookL1
impl PartialOrd for OrderBookL1
Source§impl Serialize for OrderBookL1
impl Serialize for OrderBookL1
impl StructuralPartialEq for OrderBookL1
Auto Trait Implementations§
impl Freeze for OrderBookL1
impl RefUnwindSafe for OrderBookL1
impl Send for OrderBookL1
impl Sync for OrderBookL1
impl Unpin for OrderBookL1
impl UnsafeUnpin for OrderBookL1
impl UnwindSafe for OrderBookL1
Blanket Implementations§
Source§impl<T> AttachedTransformer<()> for T
impl<T> AttachedTransformer<()> for T
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,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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 moreimpl<T> JsonSchemaMaybe for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.