Skip to main content

nautilus_execution/python/
config.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 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
16//! Python bindings for execution engine and order emulator configuration.
17
18use nautilus_core::python::to_pyvalue_err;
19use nautilus_model::identifiers::ClientId;
20use pyo3::{PyResult, pymethods};
21
22use crate::{engine::config::ExecutionEngineConfig, order_emulator::config::OrderEmulatorConfig};
23
24#[pyo3_stub_gen::derive::gen_stub_pymethods]
25#[pymethods]
26impl ExecutionEngineConfig {
27    /// Configuration for `ExecutionEngine` instances.
28    #[new]
29    #[expect(clippy::too_many_arguments)]
30    #[pyo3(signature = (
31        load_cache = None,
32        manage_own_order_books = None,
33        snapshot_orders = None,
34        snapshot_positions = None,
35        snapshot_positions_interval_secs = None,
36        carry_replay_events_on_reopen = None,
37        allow_overfills = None,
38        external_clients = None,
39        purge_closed_orders_interval_mins = None,
40        purge_closed_orders_buffer_mins = None,
41        purge_closed_positions_interval_mins = None,
42        purge_closed_positions_buffer_mins = None,
43        purge_account_events_interval_mins = None,
44        purge_account_events_lookback_mins = None,
45        purge_from_database = None,
46        debug = None,
47    ))]
48    fn py_new(
49        load_cache: Option<bool>,
50        manage_own_order_books: Option<bool>,
51        snapshot_orders: Option<bool>,
52        snapshot_positions: Option<bool>,
53        snapshot_positions_interval_secs: Option<f64>,
54        carry_replay_events_on_reopen: Option<bool>,
55        allow_overfills: Option<bool>,
56        external_clients: Option<Vec<ClientId>>,
57        purge_closed_orders_interval_mins: Option<u32>,
58        purge_closed_orders_buffer_mins: Option<u32>,
59        purge_closed_positions_interval_mins: Option<u32>,
60        purge_closed_positions_buffer_mins: Option<u32>,
61        purge_account_events_interval_mins: Option<u32>,
62        purge_account_events_lookback_mins: Option<u32>,
63        purge_from_database: Option<bool>,
64        debug: Option<bool>,
65    ) -> PyResult<Self> {
66        Self::builder()
67            .maybe_load_cache(load_cache)
68            .maybe_manage_own_order_books(manage_own_order_books)
69            .maybe_snapshot_orders(snapshot_orders)
70            .maybe_snapshot_positions(snapshot_positions)
71            .maybe_snapshot_positions_interval_secs(snapshot_positions_interval_secs)
72            .maybe_carry_replay_events_on_reopen(carry_replay_events_on_reopen)
73            .maybe_allow_overfills(allow_overfills)
74            .maybe_external_clients(external_clients)
75            .maybe_purge_closed_orders_interval_mins(purge_closed_orders_interval_mins)
76            .maybe_purge_closed_orders_buffer_mins(purge_closed_orders_buffer_mins)
77            .maybe_purge_closed_positions_interval_mins(purge_closed_positions_interval_mins)
78            .maybe_purge_closed_positions_buffer_mins(purge_closed_positions_buffer_mins)
79            .maybe_purge_account_events_interval_mins(purge_account_events_interval_mins)
80            .maybe_purge_account_events_lookback_mins(purge_account_events_lookback_mins)
81            .maybe_purge_from_database(purge_from_database)
82            .maybe_debug(debug)
83            .build()
84            .map_err(to_pyvalue_err)
85    }
86
87    #[getter]
88    #[pyo3(name = "load_cache")]
89    const fn py_load_cache(&self) -> bool {
90        self.load_cache
91    }
92
93    #[getter]
94    #[pyo3(name = "manage_own_order_books")]
95    const fn py_manage_own_order_books(&self) -> bool {
96        self.manage_own_order_books
97    }
98
99    #[getter]
100    #[pyo3(name = "snapshot_orders")]
101    const fn py_snapshot_orders(&self) -> bool {
102        self.snapshot_orders
103    }
104
105    #[getter]
106    #[pyo3(name = "snapshot_positions")]
107    const fn py_snapshot_positions(&self) -> bool {
108        self.snapshot_positions
109    }
110
111    #[getter]
112    #[pyo3(name = "snapshot_positions_interval_secs")]
113    const fn py_snapshot_positions_interval_secs(&self) -> Option<f64> {
114        self.snapshot_positions_interval_secs
115    }
116
117    #[getter]
118    #[pyo3(name = "carry_replay_events_on_reopen")]
119    const fn py_carry_replay_events_on_reopen(&self) -> bool {
120        self.carry_replay_events_on_reopen
121    }
122
123    #[getter]
124    #[pyo3(name = "allow_overfills")]
125    const fn py_allow_overfills(&self) -> bool {
126        self.allow_overfills
127    }
128
129    #[getter]
130    #[pyo3(name = "external_clients")]
131    fn py_external_clients(&self) -> Option<Vec<ClientId>> {
132        self.external_clients.clone()
133    }
134
135    #[getter]
136    #[pyo3(name = "purge_closed_orders_interval_mins")]
137    const fn py_purge_closed_orders_interval_mins(&self) -> Option<u32> {
138        self.purge_closed_orders_interval_mins
139    }
140
141    #[getter]
142    #[pyo3(name = "purge_closed_orders_buffer_mins")]
143    const fn py_purge_closed_orders_buffer_mins(&self) -> Option<u32> {
144        self.purge_closed_orders_buffer_mins
145    }
146
147    #[getter]
148    #[pyo3(name = "purge_closed_positions_interval_mins")]
149    const fn py_purge_closed_positions_interval_mins(&self) -> Option<u32> {
150        self.purge_closed_positions_interval_mins
151    }
152
153    #[getter]
154    #[pyo3(name = "purge_closed_positions_buffer_mins")]
155    const fn py_purge_closed_positions_buffer_mins(&self) -> Option<u32> {
156        self.purge_closed_positions_buffer_mins
157    }
158
159    #[getter]
160    #[pyo3(name = "purge_account_events_interval_mins")]
161    const fn py_purge_account_events_interval_mins(&self) -> Option<u32> {
162        self.purge_account_events_interval_mins
163    }
164
165    #[getter]
166    #[pyo3(name = "purge_account_events_lookback_mins")]
167    const fn py_purge_account_events_lookback_mins(&self) -> Option<u32> {
168        self.purge_account_events_lookback_mins
169    }
170
171    #[getter]
172    #[pyo3(name = "purge_from_database")]
173    const fn py_purge_from_database(&self) -> bool {
174        self.purge_from_database
175    }
176
177    #[getter]
178    #[pyo3(name = "debug")]
179    const fn py_debug(&self) -> bool {
180        self.debug
181    }
182
183    fn __repr__(&self) -> String {
184        format!("{self:?}")
185    }
186
187    fn __str__(&self) -> String {
188        format!("{self:?}")
189    }
190}
191
192#[pymethods]
193#[pyo3_stub_gen::derive::gen_stub_pymethods]
194impl OrderEmulatorConfig {
195    /// Configuration for `OrderEmulator` instances.
196    #[new]
197    #[pyo3(signature = (debug = None))]
198    fn py_new(debug: Option<bool>) -> Self {
199        Self::builder().maybe_debug(debug).build()
200    }
201
202    #[getter]
203    #[pyo3(name = "debug")]
204    const fn py_debug(&self) -> bool {
205        self.debug
206    }
207
208    fn __repr__(&self) -> String {
209        format!("{self:?}")
210    }
211
212    fn __str__(&self) -> String {
213        format!("{self:?}")
214    }
215}