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