nautilus_model/python/
mod.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
16#![allow(clippy::missing_errors_doc)] // Allow missing errors docs for Python modules at this stage
17
18//! Python bindings from [PyO3](https://pyo3.rs).
19
20use pyo3::prelude::*;
21
22pub mod account;
23pub mod common;
24pub mod data;
25pub mod enums;
26pub mod events;
27pub mod identifiers;
28pub mod instruments;
29pub mod macros;
30pub mod orderbook;
31pub mod orders;
32pub mod position;
33pub mod types;
34
35/// Loaded as nautilus_pyo3.model
36///
37/// # Errors
38///
39/// Returns a `PyErr` if registering any module components fails.
40#[pymodule]
41pub fn model(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
42    // Types
43    m.add("HIGH_PRECISION", crate::types::fixed::HIGH_PRECISION_MODE)?;
44    m.add("FIXED_SCALAR", crate::types::fixed::FIXED_SCALAR)?;
45    m.add("FIXED_PRECISION", crate::types::fixed::FIXED_PRECISION)?;
46    m.add("PRECISION_BYTES", crate::types::fixed::PRECISION_BYTES)?;
47    m.add_class::<crate::types::currency::Currency>()?;
48    m.add_class::<crate::types::money::Money>()?;
49    m.add_class::<crate::types::price::Price>()?;
50    m.add_class::<crate::types::quantity::Quantity>()?;
51    m.add_class::<crate::types::balance::AccountBalance>()?;
52    m.add_class::<crate::types::balance::MarginBalance>()?;
53    // Data
54    m.add_function(wrap_pyfunction!(data::drop_cvec_pycapsule, m)?)?;
55    m.add_class::<crate::data::DataType>()?;
56    m.add_class::<crate::data::bar::BarSpecification>()?;
57    m.add_class::<crate::data::bar::BarType>()?;
58    m.add_class::<crate::data::bar::Bar>()?;
59    m.add_class::<crate::data::bet::Bet>()?;
60    m.add_class::<crate::data::bet::BetPosition>()?;
61    m.add_class::<crate::data::order::BookOrder>()?;
62    m.add_class::<crate::data::prices::MarkPriceUpdate>()?;
63    m.add_class::<crate::data::prices::IndexPriceUpdate>()?;
64    m.add_class::<crate::data::delta::OrderBookDelta>()?;
65    m.add_class::<crate::data::deltas::OrderBookDeltas>()?;
66    m.add_class::<crate::data::depth::OrderBookDepth10>()?;
67    m.add_class::<crate::data::greeks::BlackScholesGreeksResult>()?;
68    m.add_class::<crate::data::greeks::ImplyVolAndGreeksResult>()?;
69    m.add_class::<crate::data::quote::QuoteTick>()?;
70    m.add_class::<crate::data::status::InstrumentStatus>()?;
71    m.add_class::<crate::data::trade::TradeTick>()?;
72    m.add_function(wrap_pyfunction!(
73        crate::python::data::greeks::py_black_scholes_greeks,
74        m
75    )?)?;
76    m.add_function(wrap_pyfunction!(
77        crate::python::data::greeks::py_imply_vol,
78        m
79    )?)?;
80    m.add_function(wrap_pyfunction!(
81        crate::python::data::greeks::py_imply_vol_and_greeks,
82        m
83    )?)?;
84    // Enums
85    m.add_class::<crate::enums::AccountType>()?;
86    m.add_class::<crate::enums::AggregationSource>()?;
87    m.add_class::<crate::enums::AggressorSide>()?;
88    m.add_class::<crate::enums::AssetClass>()?;
89    m.add_class::<crate::enums::InstrumentClass>()?;
90    m.add_class::<crate::enums::BarAggregation>()?;
91    m.add_class::<crate::enums::BetSide>()?;
92    m.add_class::<crate::enums::BookAction>()?;
93    m.add_class::<crate::enums::BookType>()?;
94    m.add_class::<crate::enums::ContingencyType>()?;
95    m.add_class::<crate::enums::CurrencyType>()?;
96    m.add_class::<crate::enums::InstrumentCloseType>()?;
97    m.add_class::<crate::enums::LiquiditySide>()?;
98    m.add_class::<crate::enums::MarketStatus>()?;
99    m.add_class::<crate::enums::MarketStatusAction>()?;
100    m.add_class::<crate::enums::OmsType>()?;
101    m.add_class::<crate::enums::OptionKind>()?;
102    m.add_class::<crate::enums::OrderSide>()?;
103    m.add_class::<crate::enums::OrderStatus>()?;
104    m.add_class::<crate::enums::OrderType>()?;
105    m.add_class::<crate::enums::PositionSide>()?;
106    m.add_class::<crate::enums::PriceType>()?;
107    m.add_class::<crate::enums::TimeInForce>()?;
108    m.add_class::<crate::enums::TradingState>()?;
109    m.add_class::<crate::enums::TrailingOffsetType>()?;
110    m.add_class::<crate::enums::TriggerType>()?;
111    // Identifiers
112    m.add_class::<crate::identifiers::AccountId>()?;
113    m.add_class::<crate::identifiers::ClientId>()?;
114    m.add_class::<crate::identifiers::ClientOrderId>()?;
115    m.add_class::<crate::identifiers::ComponentId>()?;
116    m.add_class::<crate::identifiers::ExecAlgorithmId>()?;
117    m.add_class::<crate::identifiers::InstrumentId>()?;
118    m.add_class::<crate::identifiers::OrderListId>()?;
119    m.add_class::<crate::identifiers::PositionId>()?;
120    m.add_class::<crate::identifiers::StrategyId>()?;
121    m.add_class::<crate::identifiers::Symbol>()?;
122    m.add_class::<crate::identifiers::TradeId>()?;
123    m.add_class::<crate::identifiers::TraderId>()?;
124    m.add_class::<crate::identifiers::Venue>()?;
125    m.add_class::<crate::identifiers::VenueOrderId>()?;
126    // Orders
127    m.add_class::<crate::orders::LimitOrder>()?;
128    m.add_class::<crate::orders::LimitIfTouchedOrder>()?;
129    m.add_class::<crate::orders::MarketOrder>()?;
130    m.add_class::<crate::orders::MarketToLimitOrder>()?;
131    m.add_class::<crate::orders::StopLimitOrder>()?;
132    m.add_class::<crate::orders::StopMarketOrder>()?;
133    m.add_class::<crate::orders::TrailingStopLimitOrder>()?;
134    m.add_class::<crate::orders::TrailingStopMarketOrder>()?;
135    // Position
136    m.add_class::<crate::position::Position>()?;
137    // Instruments
138    m.add_class::<crate::instruments::BettingInstrument>()?;
139    m.add_class::<crate::instruments::BinaryOption>()?;
140    m.add_class::<crate::instruments::CryptoFuture>()?;
141    m.add_class::<crate::instruments::CryptoOption>()?;
142    m.add_class::<crate::instruments::CryptoPerpetual>()?;
143    m.add_class::<crate::instruments::CurrencyPair>()?;
144    m.add_class::<crate::instruments::Equity>()?;
145    m.add_class::<crate::instruments::FuturesContract>()?;
146    m.add_class::<crate::instruments::FuturesSpread>()?;
147    m.add_class::<crate::instruments::OptionContract>()?;
148    m.add_class::<crate::instruments::OptionSpread>()?;
149    m.add_class::<crate::instruments::SyntheticInstrument>()?;
150    // Order book
151    m.add_class::<crate::orderbook::book::OrderBook>()?;
152    m.add_class::<crate::orderbook::level::BookLevel>()?;
153    m.add_function(wrap_pyfunction!(
154        crate::python::orderbook::book::py_update_book_with_quote_tick,
155        m
156    )?)?;
157    m.add_function(wrap_pyfunction!(
158        crate::python::orderbook::book::py_update_book_with_trade_tick,
159        m
160    )?)?;
161    m.add_class::<crate::orderbook::own::OwnOrderBook>()?;
162    m.add_class::<crate::orderbook::own::OwnBookOrder>()?;
163    // Events
164    m.add_class::<crate::events::AccountState>()?;
165    m.add_class::<crate::events::OrderDenied>()?;
166    m.add_class::<crate::events::OrderFilled>()?;
167    m.add_class::<crate::events::OrderInitialized>()?;
168    m.add_class::<crate::events::OrderRejected>()?;
169    m.add_class::<crate::events::OrderTriggered>()?;
170    m.add_class::<crate::events::OrderSubmitted>()?;
171    m.add_class::<crate::events::OrderEmulated>()?;
172    m.add_class::<crate::events::OrderReleased>()?;
173    m.add_class::<crate::events::OrderUpdated>()?;
174    m.add_class::<crate::events::OrderPendingUpdate>()?;
175    m.add_class::<crate::events::OrderPendingCancel>()?;
176    m.add_class::<crate::events::OrderModifyRejected>()?;
177    m.add_class::<crate::events::OrderAccepted>()?;
178    m.add_class::<crate::events::OrderCancelRejected>()?;
179    m.add_class::<crate::events::OrderCanceled>()?;
180    m.add_class::<crate::events::OrderExpired>()?;
181    m.add_class::<crate::events::OrderSnapshot>()?;
182    m.add_class::<crate::events::PositionSnapshot>()?;
183    // Accounts
184    m.add_class::<crate::accounts::CashAccount>()?;
185    m.add_class::<crate::accounts::MarginAccount>()?;
186    m.add_function(wrap_pyfunction!(
187        crate::python::account::transformer::cash_account_from_account_events,
188        m
189    )?)?;
190    m.add_function(wrap_pyfunction!(
191        crate::python::account::transformer::margin_account_from_account_events,
192        m
193    )?)?;
194    m.add_function(wrap_pyfunction!(
195        crate::python::data::bet::py_calc_bets_pnl,
196        m
197    )?)?;
198    m.add_function(wrap_pyfunction!(
199        crate::python::data::bet::py_probability_to_bet,
200        m
201    )?)?;
202    m.add_function(wrap_pyfunction!(
203        crate::python::data::bet::py_inverse_probability_to_bet,
204        m
205    )?)?;
206    Ok(())
207}