Skip to main content

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