nautilus_execution/matching_engine/
adapter.rs1use std::{
17 cell::{Ref, RefCell, RefMut},
18 rc::Rc,
19};
20
21use nautilus_common::{cache::Cache, clock::Clock};
22use nautilus_core::WeakCell;
23use nautilus_model::{
24 enums::{AccountType, BookType, OmsType},
25 instruments::InstrumentAny,
26};
27
28use crate::{
29 matching_core::handlers::{
30 FillLimitOrderHandlerAny, FillMarketOrderHandlerAny, ShareableFillLimitOrderHandler,
31 ShareableFillMarketOrderHandler, ShareableTriggerStopOrderHandler,
32 TriggerStopOrderHandlerAny,
33 },
34 matching_engine::{config::OrderMatchingEngineConfig, engine::OrderMatchingEngine},
35 models::{fee::FeeModelAny, fill::FillModel},
36};
37
38#[derive(Debug)]
39pub struct OrderEngineAdapter {
40 engine: Rc<RefCell<OrderMatchingEngine>>,
41}
42
43impl OrderEngineAdapter {
44 #[allow(clippy::too_many_arguments)]
45 pub fn new(
46 instrument: InstrumentAny,
47 raw_id: u32,
48 fill_model: FillModel,
49 fee_model: FeeModelAny,
50 book_type: BookType,
51 oms_type: OmsType,
52 account_type: AccountType,
53 clock: Rc<RefCell<dyn Clock>>,
54 cache: Rc<RefCell<Cache>>,
55 config: OrderMatchingEngineConfig,
56 ) -> Self {
57 let engine = Rc::new(RefCell::new(OrderMatchingEngine::new(
58 instrument,
59 raw_id,
60 fill_model,
61 fee_model,
62 book_type,
63 oms_type,
64 account_type,
65 clock,
66 cache,
67 config,
68 )));
69
70 Self::initialize_fill_order_handler(engine.clone());
71 Self::initialize_fill_market_order_handler(engine.clone());
72 Self::initialize_trigger_stop_order_handler(engine.clone());
73
74 Self { engine }
75 }
76
77 fn initialize_fill_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
78 let handler = ShareableFillLimitOrderHandler(
79 FillLimitOrderHandlerAny::OrderMatchingEngine(WeakCell::from(Rc::downgrade(&engine))),
80 );
81 engine
82 .borrow_mut()
83 .core
84 .set_fill_limit_order_handler(handler);
85 }
86
87 fn initialize_fill_market_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
88 let handler = ShareableFillMarketOrderHandler(
89 FillMarketOrderHandlerAny::OrderMatchingEngine(WeakCell::from(Rc::downgrade(&engine))),
90 );
91 engine
92 .borrow_mut()
93 .core
94 .set_fill_market_order_handler(handler);
95 }
96
97 fn initialize_trigger_stop_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
98 let handler = ShareableTriggerStopOrderHandler(
99 TriggerStopOrderHandlerAny::OrderMatchingEngine(WeakCell::from(Rc::downgrade(&engine))),
100 );
101 engine
102 .borrow_mut()
103 .core
104 .set_trigger_stop_order_handler(handler);
105 }
106
107 #[must_use]
108 pub fn get_engine(&self) -> Ref<'_, OrderMatchingEngine> {
109 self.engine.borrow()
110 }
111
112 #[must_use]
113 pub fn get_engine_mut(&self) -> RefMut<'_, OrderMatchingEngine> {
114 self.engine.borrow_mut()
115 }
116}