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, 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}