nautilus_binance/common/
consts.rs1use std::{num::NonZeroU32, sync::LazyLock};
19
20use nautilus_model::identifiers::{ClientId, Venue};
21use nautilus_network::ratelimiter::quota::Quota;
22use ustr::Ustr;
23
24use super::enums::{BinanceRateLimitInterval, BinanceRateLimitType};
25
26pub const BINANCE: &str = "BINANCE";
28
29pub static BINANCE_VENUE: LazyLock<Venue> = LazyLock::new(|| Venue::new(Ustr::from(BINANCE)));
31
32pub static BINANCE_CLIENT_ID: LazyLock<ClientId> =
34 LazyLock::new(|| ClientId::new(Ustr::from(BINANCE)));
35
36pub const BINANCE_NAUTILUS_SPOT_BROKER_ID: &str = "TD67BGP9";
40
41pub const BINANCE_NAUTILUS_FUTURES_BROKER_ID: &str = "aHRE4BCj";
45
46pub const BINANCE_SPOT_HTTP_URL: &str = "https://api.binance.com";
48
49pub const BINANCE_FUTURES_USD_HTTP_URL: &str = "https://fapi.binance.com";
51
52pub const BINANCE_FUTURES_COIN_HTTP_URL: &str = "https://dapi.binance.com";
54
55pub const BINANCE_OPTIONS_HTTP_URL: &str = "https://eapi.binance.com";
57
58pub const BINANCE_OPTIONS_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
60
61pub const BINANCE_SPOT_TESTNET_HTTP_URL: &str = "https://testnet.binance.vision";
63
64pub const BINANCE_FUTURES_USD_TESTNET_HTTP_URL: &str = "https://demo-fapi.binance.com";
66
67pub const BINANCE_FUTURES_COIN_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
69
70pub const BINANCE_SPOT_DEMO_HTTP_URL: &str = "https://demo-api.binance.com";
72
73pub const BINANCE_FUTURES_USD_DEMO_HTTP_URL: &str = "https://demo-fapi.binance.com";
75
76pub const BINANCE_FUTURES_COIN_DEMO_HTTP_URL: &str = "https://demo-dapi.binance.com";
78
79pub const BINANCE_SPOT_WS_URL: &str = "wss://stream.binance.com:9443/ws";
81
82pub const BINANCE_FUTURES_USD_WS_URL: &str = "wss://fstream.binance.com/market/ws";
84
85pub const BINANCE_FUTURES_USD_WS_PUBLIC_URL: &str = "wss://fstream.binance.com/public/ws";
87
88pub const BINANCE_FUTURES_USD_WS_PRIVATE_URL: &str = "wss://fstream.binance.com/private/ws";
90
91pub const BINANCE_FUTURES_COIN_WS_URL: &str = "wss://dstream.binance.com/ws";
93
94pub const BINANCE_OPTIONS_WS_URL: &str = "wss://nbstream.binance.com/eoptions";
96
97pub const BINANCE_OPTIONS_TESTNET_WS_URL: &str = "wss://fstream.binancefuture.com/market/ws";
99
100pub const BINANCE_OPTIONS_TESTNET_WS_PUBLIC_URL: &str = "wss://fstream.binancefuture.com/public/ws";
102
103pub const BINANCE_OPTIONS_TESTNET_WS_PRIVATE_URL: &str =
105 "wss://fstream.binancefuture.com/private/ws";
106
107pub const BINANCE_SPOT_SBE_WS_URL: &str = "wss://stream-sbe.binance.com/ws";
109
110pub const BINANCE_SPOT_SBE_WS_API_URL: &str =
112 "wss://ws-api.binance.com:443/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=4";
113
114pub const BINANCE_FUTURES_USD_WS_API_URL: &str = "wss://ws-fapi.binance.com/ws-fapi/v1";
116
117pub const BINANCE_FUTURES_USD_WS_API_TESTNET_URL: &str =
119 "wss://testnet.binancefuture.com/ws-fapi/v1";
120
121pub const BINANCE_SPOT_SBE_WS_API_TESTNET_URL: &str = "wss://ws-api.testnet.binance.vision/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=4";
123
124pub const BINANCE_SPOT_SBE_WS_API_DEMO_URL: &str =
126 "wss://demo-ws-api.binance.com/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=4";
127
128pub const BINANCE_SPOT_TESTNET_WS_URL: &str = "wss://stream.testnet.binance.vision/ws";
130
131pub const BINANCE_SPOT_DEMO_WS_URL: &str = "wss://demo-stream.binance.com/ws";
133
134pub const BINANCE_FUTURES_USD_DEMO_WS_URL: &str = "wss://demo-fstream.binance.com/ws";
136
137pub const BINANCE_FUTURES_COIN_DEMO_WS_URL: &str = "wss://demo-dstream.binance.com/ws";
139
140pub const BINANCE_FUTURES_USD_TESTNET_WS_URL: &str = "wss://fstream.binancefuture.com/ws";
142
143pub const BINANCE_FUTURES_COIN_TESTNET_WS_URL: &str = "wss://dstream.binancefuture.com/ws";
145
146pub const BINANCE_API_KEY_HEADER: &str = "X-MBX-APIKEY";
148
149pub const BINANCE_SPOT_API_PATH: &str = "/api/v3";
151
152pub const BINANCE_FAPI_PATH: &str = "/fapi/v1";
154
155pub const BINANCE_DAPI_PATH: &str = "/dapi/v1";
157
158pub const BINANCE_EAPI_PATH: &str = "/eapi/v1";
160
161#[derive(Clone, Copy, Debug)]
163pub struct BinanceRateLimitQuota {
164 pub rate_limit_type: BinanceRateLimitType,
166 pub interval: BinanceRateLimitInterval,
168 pub interval_num: u32,
170 pub limit: u32,
172}
173
174pub const BINANCE_SPOT_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
179 BinanceRateLimitQuota {
180 rate_limit_type: BinanceRateLimitType::RequestWeight,
181 interval: BinanceRateLimitInterval::Minute,
182 interval_num: 1,
183 limit: 1_200,
184 },
185 BinanceRateLimitQuota {
186 rate_limit_type: BinanceRateLimitType::Orders,
187 interval: BinanceRateLimitInterval::Second,
188 interval_num: 1,
189 limit: 10,
190 },
191 BinanceRateLimitQuota {
192 rate_limit_type: BinanceRateLimitType::Orders,
193 interval: BinanceRateLimitInterval::Day,
194 interval_num: 1,
195 limit: 100_000,
196 },
197];
198
199pub const BINANCE_FAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
204 BinanceRateLimitQuota {
205 rate_limit_type: BinanceRateLimitType::RequestWeight,
206 interval: BinanceRateLimitInterval::Minute,
207 interval_num: 1,
208 limit: 2_400,
209 },
210 BinanceRateLimitQuota {
211 rate_limit_type: BinanceRateLimitType::Orders,
212 interval: BinanceRateLimitInterval::Second,
213 interval_num: 1,
214 limit: 50,
215 },
216 BinanceRateLimitQuota {
217 rate_limit_type: BinanceRateLimitType::Orders,
218 interval: BinanceRateLimitInterval::Minute,
219 interval_num: 1,
220 limit: 1_200,
221 },
222];
223
224pub const BINANCE_DAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
229 BinanceRateLimitQuota {
230 rate_limit_type: BinanceRateLimitType::RequestWeight,
231 interval: BinanceRateLimitInterval::Minute,
232 interval_num: 1,
233 limit: 1_200,
234 },
235 BinanceRateLimitQuota {
236 rate_limit_type: BinanceRateLimitType::Orders,
237 interval: BinanceRateLimitInterval::Second,
238 interval_num: 1,
239 limit: 20,
240 },
241 BinanceRateLimitQuota {
242 rate_limit_type: BinanceRateLimitType::Orders,
243 interval: BinanceRateLimitInterval::Minute,
244 interval_num: 1,
245 limit: 1_200,
246 },
247];
248
249pub const BINANCE_EAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
254 BinanceRateLimitQuota {
255 rate_limit_type: BinanceRateLimitType::RequestWeight,
256 interval: BinanceRateLimitInterval::Minute,
257 interval_num: 1,
258 limit: 3_000,
259 },
260 BinanceRateLimitQuota {
261 rate_limit_type: BinanceRateLimitType::Orders,
262 interval: BinanceRateLimitInterval::Second,
263 interval_num: 1,
264 limit: 5,
265 },
266 BinanceRateLimitQuota {
267 rate_limit_type: BinanceRateLimitType::Orders,
268 interval: BinanceRateLimitInterval::Minute,
269 interval_num: 1,
270 limit: 200,
271 },
272];
273
274pub static BINANCE_WS_SUBSCRIPTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
278 Quota::per_second(NonZeroU32::new(5).expect("non-zero")).expect("valid constant")
279});
280
281pub static BINANCE_WS_CONNECTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
286 Quota::per_second(NonZeroU32::new(1).expect("non-zero")).expect("valid constant")
287});
288
289pub static BINANCE_RATE_LIMIT_KEY_SUBSCRIPTION: LazyLock<[Ustr; 1]> =
291 LazyLock::new(|| [Ustr::from("subscription")]);
292
293pub const BINANCE_GTX_ORDER_REJECT_CODE: i64 = -5022;
297
298pub const BINANCE_NEW_ORDER_REJECTED_CODE: i64 = -2010;
303
304pub const BINANCE_NO_SUCH_ORDER_CODE: i64 = -2013;
306
307pub const BINANCE_UNEXPECTED_RESPONSE_CODE: i64 = -1006;
309
310pub const BINANCE_STATUS_UNKNOWN_CODE: i64 = -1007;
312
313pub const BINANCE_FUTURES_DUAL_SIDE_SYNC_REJECT_CODE: i64 = -4531;
319
320pub const BINANCE_SPOT_POST_ONLY_REJECT_MSG: &str = "Order would immediately match and take.";
324
325pub const BINANCE_BOOK_DEPTHS: [u32; 7] = [5, 10, 20, 50, 100, 500, 1000];
327
328#[cfg(test)]
329mod tests {
330 use rstest::rstest;
331
332 use super::*;
333
334 #[rstest]
335 fn test_venue_error_code_values() {
336 assert_eq!(BINANCE_GTX_ORDER_REJECT_CODE, -5022);
337 assert_eq!(BINANCE_NEW_ORDER_REJECTED_CODE, -2010);
338 assert_eq!(BINANCE_NO_SUCH_ORDER_CODE, -2013);
339 assert_eq!(BINANCE_UNEXPECTED_RESPONSE_CODE, -1006);
340 assert_eq!(BINANCE_STATUS_UNKNOWN_CODE, -1007);
341 assert_eq!(BINANCE_FUTURES_DUAL_SIDE_SYNC_REJECT_CODE, -4531);
342 }
343}