diff --git a/nautilus_core/model/src/data/depth.rs b/nautilus_core/model/src/data/depth.rs index a01af7dc3f5e..f29bd509b146 100644 --- a/nautilus_core/model/src/data/depth.rs +++ b/nautilus_core/model/src/data/depth.rs @@ -126,7 +126,7 @@ pub mod stubs { for i in 0..10 { let order = BookOrder::new( - OrderSide::Sell, + OrderSide::Buy, Price::new(price, 2).unwrap(), Quantity::new(quantity, 0).unwrap(), order_id, @@ -146,7 +146,7 @@ pub mod stubs { for i in 0..10 { let order = BookOrder::new( - OrderSide::Buy, + OrderSide::Sell, Price::new(price, 2).unwrap(), Quantity::new(quantity, 0).unwrap(), order_id, diff --git a/nautilus_core/model/src/ffi/orderbook/book.rs b/nautilus_core/model/src/ffi/orderbook/book.rs index 44ff6a47b156..42ea0d43c289 100644 --- a/nautilus_core/model/src/ffi/orderbook/book.rs +++ b/nautilus_core/model/src/ffi/orderbook/book.rs @@ -22,7 +22,10 @@ use nautilus_core::ffi::{cvec::CVec, string::str_to_cstr}; use super::level::Level_API; use crate::{ - data::{delta::OrderBookDelta, order::BookOrder, quote::QuoteTick, trade::TradeTick}, + data::{ + delta::OrderBookDelta, depth::OrderBookDepth10, order::BookOrder, quote::QuoteTick, + trade::TradeTick, + }, enums::{BookType, OrderSide}, identifiers::instrument_id::InstrumentId, orderbook::book::OrderBook, @@ -145,6 +148,11 @@ pub extern "C" fn orderbook_apply_delta(book: &mut OrderBook_API, delta: OrderBo book.apply_delta(delta) } +#[no_mangle] +pub extern "C" fn orderbook_apply_depth(book: &mut OrderBook_API, depth: OrderBookDepth10) { + book.apply_depth(depth) +} + #[no_mangle] pub extern "C" fn orderbook_bids(book: &mut OrderBook_API) -> CVec { book.bids() diff --git a/nautilus_core/model/src/orderbook/book.rs b/nautilus_core/model/src/orderbook/book.rs index 324d4736b8bd..3beefcdfa7de 100644 --- a/nautilus_core/model/src/orderbook/book.rs +++ b/nautilus_core/model/src/orderbook/book.rs @@ -19,7 +19,10 @@ use thiserror::Error; use super::{ladder::BookPrice, level::Level}; use crate::{ - data::{delta::OrderBookDelta, order::BookOrder, quote::QuoteTick, trade::TradeTick}, + data::{ + delta::OrderBookDelta, depth::OrderBookDepth10, order::BookOrder, quote::QuoteTick, + trade::TradeTick, + }, enums::{BookAction, BookType, OrderSide}, identifiers::instrument_id::InstrumentId, orderbook::ladder::Ladder, @@ -164,6 +167,19 @@ impl OrderBook { } } + pub fn apply_depth(&mut self, depth: OrderBookDepth10) { + self.bids.clear(); + self.asks.clear(); + + for order in depth.bids { + self.add(order, depth.ts_event, depth.sequence); + } + + for order in depth.asks { + self.add(order, depth.ts_event, depth.sequence); + } + } + pub fn bids(&self) -> Vec<&Level> { self.bids.levels.values().collect() } @@ -518,7 +534,7 @@ mod tests { use super::*; use crate::{ - data::order::BookOrder, + data::{depth::stubs::stub_depth10, order::BookOrder}, enums::{AggressorSide, OrderSide}, identifiers::{instrument_id::InstrumentId, trade_id::TradeId}, types::{price::Price, quantity::Quantity}, @@ -776,6 +792,20 @@ mod tests { ); } + #[rstest] + fn test_apply_depth(stub_depth10: OrderBookDepth10) { + let depth = stub_depth10; + let instrument_id = InstrumentId::from("AAPL.XNAS"); + let mut book = OrderBook::new(instrument_id, BookType::L2_MBP); + + book.apply_depth(depth); + + assert_eq!(book.best_bid_price().unwrap().as_f64(), 99.00); + assert_eq!(book.best_ask_price().unwrap().as_f64(), 100.00); + assert_eq!(book.best_bid_size().unwrap().as_f64(), 100.0); + assert_eq!(book.best_ask_size().unwrap().as_f64(), 100.0); + } + #[rstest] fn test_update_quote_tick_l1() { let instrument_id = InstrumentId::from("ETHUSDT-PERP.BINANCE"); diff --git a/nautilus_trader/core/includes/model.h b/nautilus_trader/core/includes/model.h index 3e332446e557..ae2c2b77997a 100644 --- a/nautilus_trader/core/includes/model.h +++ b/nautilus_trader/core/includes/model.h @@ -2085,6 +2085,8 @@ void orderbook_clear_asks(struct OrderBook_API *book, uint64_t ts_event, uint64_ void orderbook_apply_delta(struct OrderBook_API *book, struct OrderBookDelta_t delta); +void orderbook_apply_depth(struct OrderBook_API *book, struct OrderBookDepth10 depth); + CVec orderbook_bids(struct OrderBook_API *book); CVec orderbook_asks(struct OrderBook_API *book); diff --git a/nautilus_trader/core/rust/model.pxd b/nautilus_trader/core/rust/model.pxd index 83d307dc2d41..604597372c1c 100644 --- a/nautilus_trader/core/rust/model.pxd +++ b/nautilus_trader/core/rust/model.pxd @@ -1425,6 +1425,8 @@ cdef extern from "../includes/model.h": void orderbook_apply_delta(OrderBook_API *book, OrderBookDelta_t delta); + void orderbook_apply_depth(OrderBook_API *book, OrderBookDepth10 depth); + CVec orderbook_bids(OrderBook_API *book); CVec orderbook_asks(OrderBook_API *book);