nautilus_execution/matching_engine/
adapter.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use 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}