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_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
37#[derive(Debug)]
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: Rc<RefCell<dyn Clock>>,
53 cache: Rc<RefCell<Cache>>,
54 config: OrderMatchingEngineConfig,
55 ) -> Self {
56 let engine = Rc::new(RefCell::new(OrderMatchingEngine::new(
57 instrument,
58 raw_id,
59 fill_model,
60 fee_model,
61 book_type,
62 oms_type,
63 account_type,
64 clock,
65 cache,
66 config,
67 )));
68
69 Self::initialize_fill_order_handler(engine.clone());
70 Self::initialize_fill_market_order_handler(engine.clone());
71 Self::initialize_trigger_stop_order_handler(engine.clone());
72
73 Self { engine }
74 }
75
76 fn initialize_fill_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
77 let handler = ShareableFillLimitOrderHandler(
78 FillLimitOrderHandlerAny::OrderMatchingEngine(engine.clone()),
79 );
80 engine
81 .borrow_mut()
82 .core
83 .set_fill_limit_order_handler(handler);
84 }
85
86 fn initialize_fill_market_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
87 let handler = ShareableFillMarketOrderHandler(
88 FillMarketOrderHandlerAny::OrderMatchingEngine(engine.clone()),
89 );
90 engine
91 .borrow_mut()
92 .core
93 .set_fill_market_order_handler(handler);
94 }
95
96 fn initialize_trigger_stop_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
97 let handler = ShareableTriggerStopOrderHandler(
98 TriggerStopOrderHandlerAny::OrderMatchingEngine(engine.clone()),
99 );
100 engine
101 .borrow_mut()
102 .core
103 .set_trigger_stop_order_handler(handler);
104 }
105
106 #[must_use]
107 pub fn get_engine(&self) -> Ref<OrderMatchingEngine> {
108 self.engine.borrow()
109 }
110
111 #[must_use]
112 pub fn get_engine_mut(&self) -> RefMut<OrderMatchingEngine> {
113 self.engine.borrow_mut()
114 }
115}