nautilus_bybit/python/
mod.rs1pub mod enums;
19pub mod http;
20pub mod params;
21pub mod types;
22pub mod urls;
23pub mod websocket;
24
25use nautilus_core::python::to_pyvalue_err;
26use nautilus_model::enums::BarAggregation;
27use pyo3::prelude::*;
28
29use crate::common::{
30 consts::BYBIT_NAUTILUS_BROKER_ID,
31 parse::{bar_spec_to_bybit_interval, extract_raw_symbol},
32 symbol::BybitSymbol,
33};
34
35#[pyfunction]
42#[pyo3(name = "bybit_extract_raw_symbol")]
43fn py_bybit_extract_raw_symbol(symbol: &str) -> &str {
44 extract_raw_symbol(symbol)
45}
46
47#[pyfunction]
53#[pyo3(name = "bybit_bar_spec_to_interval")]
54fn py_bybit_bar_spec_to_interval(aggregation: u8, step: u64) -> PyResult<String> {
55 let aggregation = BarAggregation::from_repr(aggregation as usize).ok_or_else(|| {
56 pyo3::exceptions::PyValueError::new_err(format!(
57 "Invalid BarAggregation value: {aggregation}"
58 ))
59 })?;
60 let interval = bar_spec_to_bybit_interval(aggregation, step).map_err(to_pyvalue_err)?;
61 Ok(interval.to_string())
62}
63
64#[pyfunction]
76#[pyo3(name = "bybit_product_type_from_symbol")]
77fn py_bybit_product_type_from_symbol(
78 symbol: &str,
79) -> PyResult<crate::common::enums::BybitProductType> {
80 let bybit_symbol = BybitSymbol::new(symbol).map_err(to_pyvalue_err)?;
81 Ok(bybit_symbol.product_type())
82}
83
84#[pymodule]
90#[rustfmt::skip]
91pub fn bybit(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
92 m.add(stringify!(BYBIT_NAUTILUS_BROKER_ID), BYBIT_NAUTILUS_BROKER_ID)?;
93 m.add_class::<crate::common::enums::BybitAccountType>()?;
94 m.add_class::<crate::common::enums::BybitCancelType>()?;
95 m.add_class::<crate::common::enums::BybitEnvironment>()?;
96 m.add_class::<crate::common::enums::BybitMarginAction>()?;
97 m.add_class::<crate::common::enums::BybitMarginMode>()?;
98 m.add_class::<crate::common::enums::BybitOpenOnly>()?;
99 m.add_class::<crate::common::enums::BybitOrderFilter>()?;
100 m.add_class::<crate::common::enums::BybitOrderSide>()?;
101 m.add_class::<crate::common::enums::BybitOrderStatus>()?;
102 m.add_class::<crate::common::enums::BybitOrderType>()?;
103 m.add_class::<crate::common::enums::BybitPositionMode>()?;
104 m.add_class::<crate::common::enums::BybitProductType>()?;
105 m.add_class::<crate::common::enums::BybitStopOrderType>()?;
106 m.add_class::<crate::common::enums::BybitTimeInForce>()?;
107 m.add_class::<crate::common::enums::BybitTpSlMode>()?;
108 m.add_class::<crate::common::enums::BybitTriggerDirection>()?;
109 m.add_class::<crate::common::enums::BybitTriggerType>()?;
110 m.add_class::<crate::http::client::BybitHttpClient>()?;
111 m.add_class::<crate::http::client::BybitRawHttpClient>()?;
112 m.add_class::<crate::http::models::BybitServerTime>()?;
113 m.add_class::<crate::http::models::BybitOrder>()?;
114 m.add_class::<crate::http::models::BybitOrderCursorList>()?;
115 m.add_class::<crate::http::models::BybitTickerData>()?;
116 m.add_class::<crate::common::types::BybitMarginBorrowResult>()?;
117 m.add_class::<crate::common::types::BybitMarginRepayResult>()?;
118 m.add_class::<crate::common::types::BybitMarginStatusResult>()?;
119 m.add_class::<crate::websocket::client::BybitWebSocketClient>()?;
120 m.add_class::<crate::websocket::messages::BybitWebSocketError>()?;
121 m.add_class::<params::BybitWsPlaceOrderParams>()?;
122 m.add_class::<params::BybitWsAmendOrderParams>()?;
123 m.add_class::<params::BybitWsCancelOrderParams>()?;
124 m.add_class::<params::BybitTickersParams>()?;
125 m.add_function(wrap_pyfunction!(urls::py_get_bybit_http_base_url, m)?)?;
126 m.add_function(wrap_pyfunction!(urls::py_get_bybit_ws_url_public, m)?)?;
127 m.add_function(wrap_pyfunction!(urls::py_get_bybit_ws_url_private, m)?)?;
128 m.add_function(wrap_pyfunction!(urls::py_get_bybit_ws_url_trade, m)?)?;
129 m.add_function(wrap_pyfunction!(py_bybit_extract_raw_symbol, m)?)?;
130 m.add_function(wrap_pyfunction!(py_bybit_bar_spec_to_interval, m)?)?;
131 m.add_function(wrap_pyfunction!(py_bybit_product_type_from_symbol, m)?)?;
132 Ok(())
133}