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