nautilus_execution/matching_engine/
adapter.rs1use std::{
17 cell::{Ref, RefCell, RefMut},
18 rc::Rc,
19};
20
21use nautilus_common::{cache::Cache, msgbus::MessageBus};
22use nautilus_core::AtomicTime;
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
38pub struct OrderEngineAdapter {
39 engine: Rc<RefCell<OrderMatchingEngine>>,
40}
41
42impl OrderEngineAdapter {
43 #[allow(clippy::too_many_arguments)]
44 pub fn new(
45 instrument: InstrumentAny,
46 raw_id: u32,
47 fill_model: FillModel,
48 fee_model: FeeModelAny,
49 book_type: BookType,
50 oms_type: OmsType,
51 account_type: AccountType,
52 clock: &'static AtomicTime,
53 msgbus: Rc<RefCell<MessageBus>>,
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 msgbus,
67 cache,
68 config,
69 )));
70
71 Self::initialize_fill_order_handler(engine.clone());
72 Self::initialize_fill_market_order_handler(engine.clone());
73 Self::initialize_trigger_stop_order_handler(engine.clone());
74
75 Self { engine }
76 }
77
78 fn initialize_fill_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
79 let handler = ShareableFillLimitOrderHandler(
80 FillLimitOrderHandlerAny::OrderMatchingEngine(engine.clone()),
81 );
82 engine
83 .borrow_mut()
84 .core
85 .set_fill_limit_order_handler(handler);
86 }
87
88 fn initialize_fill_market_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
89 let handler = ShareableFillMarketOrderHandler(
90 FillMarketOrderHandlerAny::OrderMatchingEngine(engine.clone()),
91 );
92 engine
93 .borrow_mut()
94 .core
95 .set_fill_market_order_handler(handler);
96 }
97
98 fn initialize_trigger_stop_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
99 let handler = ShareableTriggerStopOrderHandler(
100 TriggerStopOrderHandlerAny::OrderMatchingEngine(engine.clone()),
101 );
102 engine
103 .borrow_mut()
104 .core
105 .set_trigger_stop_order_handler(handler);
106 }
107
108 #[must_use]
109 pub fn get_engine(&self) -> Ref<OrderMatchingEngine> {
110 self.engine.borrow()
111 }
112
113 #[must_use]
114 pub fn get_engine_mut(&self) -> RefMut<OrderMatchingEngine> {
115 self.engine.borrow_mut()
116 }
117}