Skip to main content

nautilus_bitmex/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 BitMEX configuration.
17
18use nautilus_model::identifiers::AccountId;
19use pyo3::prelude::*;
20
21use crate::config::{BitmexDataClientConfig, BitmexExecClientConfig};
22
23#[pymethods]
24impl BitmexDataClientConfig {
25    #[new]
26    #[pyo3(signature = (
27        api_key = None,
28        api_secret = None,
29        base_url_http = None,
30        base_url_ws = None,
31        http_proxy_url = None,
32        http_timeout_secs = None,
33        max_retries = None,
34        retry_delay_initial_ms = None,
35        retry_delay_max_ms = None,
36        heartbeat_interval_secs = None,
37        recv_window_ms = None,
38        active_only = None,
39        update_instruments_interval_mins = None,
40        use_testnet = None,
41        max_requests_per_second = None,
42        max_requests_per_minute = None,
43    ))]
44    #[allow(clippy::too_many_arguments)]
45    fn py_new(
46        api_key: Option<String>,
47        api_secret: Option<String>,
48        base_url_http: Option<String>,
49        base_url_ws: Option<String>,
50        http_proxy_url: Option<String>,
51        http_timeout_secs: Option<u64>,
52        max_retries: Option<u32>,
53        retry_delay_initial_ms: Option<u64>,
54        retry_delay_max_ms: Option<u64>,
55        heartbeat_interval_secs: Option<u64>,
56        recv_window_ms: Option<u64>,
57        active_only: Option<bool>,
58        update_instruments_interval_mins: Option<u64>,
59        use_testnet: Option<bool>,
60        max_requests_per_second: Option<u32>,
61        max_requests_per_minute: Option<u32>,
62    ) -> Self {
63        let defaults = Self::default();
64        Self {
65            api_key,
66            api_secret,
67            base_url_http,
68            base_url_ws,
69            http_proxy_url,
70            ws_proxy_url: None,
71            http_timeout_secs: http_timeout_secs.or(defaults.http_timeout_secs),
72            max_retries: max_retries.or(defaults.max_retries),
73            retry_delay_initial_ms: retry_delay_initial_ms.or(defaults.retry_delay_initial_ms),
74            retry_delay_max_ms: retry_delay_max_ms.or(defaults.retry_delay_max_ms),
75            heartbeat_interval_secs,
76            recv_window_ms: recv_window_ms.or(defaults.recv_window_ms),
77            active_only: active_only.unwrap_or(defaults.active_only),
78            update_instruments_interval_mins,
79            use_testnet: use_testnet.unwrap_or(defaults.use_testnet),
80            max_requests_per_second: max_requests_per_second.or(defaults.max_requests_per_second),
81            max_requests_per_minute: max_requests_per_minute.or(defaults.max_requests_per_minute),
82        }
83    }
84
85    fn __repr__(&self) -> String {
86        format!("{self:?}")
87    }
88}
89
90#[pymethods]
91impl BitmexExecClientConfig {
92    #[new]
93    #[pyo3(signature = (
94        api_key = None,
95        api_secret = None,
96        base_url_http = None,
97        base_url_ws = None,
98        http_proxy_url = None,
99        http_timeout_secs = None,
100        max_retries = None,
101        retry_delay_initial_ms = None,
102        retry_delay_max_ms = None,
103        heartbeat_interval_secs = None,
104        recv_window_ms = None,
105        active_only = None,
106        use_testnet = None,
107        account_id = None,
108        max_requests_per_second = None,
109        max_requests_per_minute = None,
110        submitter_pool_size = None,
111        canceller_pool_size = None,
112        submitter_proxy_urls = None,
113        canceller_proxy_urls = None,
114        deadmans_switch_timeout_secs = None,
115    ))]
116    #[allow(clippy::too_many_arguments)]
117    fn py_new(
118        api_key: Option<String>,
119        api_secret: Option<String>,
120        base_url_http: Option<String>,
121        base_url_ws: Option<String>,
122        http_proxy_url: Option<String>,
123        http_timeout_secs: Option<u64>,
124        max_retries: Option<u32>,
125        retry_delay_initial_ms: Option<u64>,
126        retry_delay_max_ms: Option<u64>,
127        heartbeat_interval_secs: Option<u64>,
128        recv_window_ms: Option<u64>,
129        active_only: Option<bool>,
130        use_testnet: Option<bool>,
131        account_id: Option<AccountId>,
132        max_requests_per_second: Option<u32>,
133        max_requests_per_minute: Option<u32>,
134        submitter_pool_size: Option<usize>,
135        canceller_pool_size: Option<usize>,
136        submitter_proxy_urls: Option<Vec<String>>,
137        canceller_proxy_urls: Option<Vec<String>>,
138        deadmans_switch_timeout_secs: Option<u64>,
139    ) -> Self {
140        let defaults = Self::default();
141        Self {
142            api_key,
143            api_secret,
144            base_url_http,
145            base_url_ws,
146            http_proxy_url,
147            ws_proxy_url: None,
148            http_timeout_secs: http_timeout_secs.or(defaults.http_timeout_secs),
149            max_retries: max_retries.or(defaults.max_retries),
150            retry_delay_initial_ms: retry_delay_initial_ms.or(defaults.retry_delay_initial_ms),
151            retry_delay_max_ms: retry_delay_max_ms.or(defaults.retry_delay_max_ms),
152            heartbeat_interval_secs: heartbeat_interval_secs.or(defaults.heartbeat_interval_secs),
153            recv_window_ms: recv_window_ms.or(defaults.recv_window_ms),
154            active_only: active_only.unwrap_or(defaults.active_only),
155            use_testnet: use_testnet.unwrap_or(defaults.use_testnet),
156            account_id,
157            max_requests_per_second: max_requests_per_second.or(defaults.max_requests_per_second),
158            max_requests_per_minute: max_requests_per_minute.or(defaults.max_requests_per_minute),
159            submitter_pool_size,
160            canceller_pool_size,
161            submitter_proxy_urls,
162            canceller_proxy_urls,
163            deadmans_switch_timeout_secs,
164        }
165    }
166
167    fn __repr__(&self) -> String {
168        format!("{self:?}")
169    }
170}