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_US_SPOT_HTTP_URL: &str = "https://api.binance.us";
51
52pub const BINANCE_FUTURES_USD_HTTP_URL: &str = "https://fapi.binance.com";
54
55pub const BINANCE_FUTURES_COIN_HTTP_URL: &str = "https://dapi.binance.com";
57
58pub const BINANCE_WS_HEARTBEAT_SECS: u64 = 20;
63
64pub const BINANCE_OPTIONS_HTTP_URL: &str = "https://eapi.binance.com";
66
67pub const BINANCE_OPTIONS_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
69
70pub const BINANCE_SPOT_TESTNET_HTTP_URL: &str = "https://testnet.binance.vision";
72
73pub const BINANCE_FUTURES_USD_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
75
76pub const BINANCE_FUTURES_COIN_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
78
79pub const BINANCE_SPOT_DEMO_HTTP_URL: &str = "https://demo-api.binance.com";
81
82pub const BINANCE_FUTURES_USD_DEMO_HTTP_URL: &str = "https://demo-fapi.binance.com";
84
85pub const BINANCE_FUTURES_COIN_DEMO_HTTP_URL: &str = "https://demo-dapi.binance.com";
87
88pub const BINANCE_SPOT_WS_URL: &str = "wss://stream.binance.com:9443/ws";
90
91pub const BINANCE_US_SPOT_WS_URL: &str = "wss://stream.binance.us:9443/ws";
93
94pub const BINANCE_US_SPOT_USER_WS_URL: &str = "wss://stream.binance.us:443";
96
97pub const BINANCE_FUTURES_USD_WS_URL: &str = "wss://fstream.binance.com/market/ws";
99
100pub const BINANCE_FUTURES_USD_WS_PUBLIC_URL: &str = "wss://fstream.binance.com/public/ws";
102
103pub const BINANCE_FUTURES_USD_WS_PRIVATE_URL: &str = "wss://fstream.binance.com/private/ws";
105
106pub const BINANCE_FUTURES_COIN_WS_URL: &str = "wss://dstream.binance.com/ws";
108
109pub const BINANCE_OPTIONS_WS_URL: &str = "wss://nbstream.binance.com/eoptions";
111
112pub const BINANCE_OPTIONS_TESTNET_WS_URL: &str = "wss://fstream.binancefuture.com/market/ws";
114
115pub const BINANCE_OPTIONS_TESTNET_WS_PUBLIC_URL: &str = "wss://fstream.binancefuture.com/public/ws";
117
118pub const BINANCE_OPTIONS_TESTNET_WS_PRIVATE_URL: &str =
120 "wss://fstream.binancefuture.com/private/ws";
121
122pub const BINANCE_SPOT_SBE_WS_URL: &str = "wss://stream-sbe.binance.com/ws";
124
125pub const BINANCE_SPOT_SBE_WS_API_URL: &str =
127 "wss://ws-api.binance.com:443/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=5";
128
129pub const BINANCE_FUTURES_USD_WS_API_URL: &str = "wss://ws-fapi.binance.com/ws-fapi/v1";
131
132pub const BINANCE_FUTURES_USD_WS_API_TESTNET_URL: &str =
134 "wss://testnet.binancefuture.com/ws-fapi/v1";
135
136pub const BINANCE_SPOT_SBE_WS_API_TESTNET_URL: &str = "wss://ws-api.testnet.binance.vision/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=5";
138
139pub const BINANCE_SPOT_SBE_WS_API_DEMO_URL: &str =
141 "wss://demo-ws-api.binance.com/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=5";
142
143pub const BINANCE_SPOT_TESTNET_WS_URL: &str = "wss://stream.testnet.binance.vision/ws";
145
146pub const BINANCE_SPOT_DEMO_WS_URL: &str = "wss://demo-stream.binance.com/ws";
148
149pub const BINANCE_FUTURES_USD_DEMO_WS_URL: &str = "wss://demo-fstream.binance.com/ws";
151
152pub const BINANCE_FUTURES_COIN_DEMO_WS_URL: &str = "wss://demo-dstream.binance.com/ws";
154
155pub const BINANCE_FUTURES_USD_TESTNET_WS_URL: &str = "wss://fstream.binancefuture.com/ws";
157
158pub const BINANCE_FUTURES_COIN_TESTNET_WS_URL: &str = "wss://dstream.binancefuture.com/ws";
160
161pub const BINANCE_API_KEY_HEADER: &str = "X-MBX-APIKEY";
163
164pub const BINANCE_SPOT_API_PATH: &str = "/api/v3";
166
167pub const BINANCE_FAPI_PATH: &str = "/fapi/v1";
169
170pub const BINANCE_DAPI_PATH: &str = "/dapi/v1";
172
173pub const BINANCE_EAPI_PATH: &str = "/eapi/v1";
175
176pub const BINANCE_SAPI_PATH: &str = "/sapi/v1";
178
179#[derive(Clone, Copy, Debug)]
181pub struct BinanceRateLimitQuota {
182 pub rate_limit_type: BinanceRateLimitType,
184 pub interval: BinanceRateLimitInterval,
186 pub interval_num: u32,
188 pub limit: u32,
190}
191
192pub const BINANCE_SPOT_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
197 BinanceRateLimitQuota {
198 rate_limit_type: BinanceRateLimitType::RequestWeight,
199 interval: BinanceRateLimitInterval::Minute,
200 interval_num: 1,
201 limit: 1_200,
202 },
203 BinanceRateLimitQuota {
204 rate_limit_type: BinanceRateLimitType::Orders,
205 interval: BinanceRateLimitInterval::Second,
206 interval_num: 1,
207 limit: 10,
208 },
209 BinanceRateLimitQuota {
210 rate_limit_type: BinanceRateLimitType::Orders,
211 interval: BinanceRateLimitInterval::Day,
212 interval_num: 1,
213 limit: 100_000,
214 },
215];
216
217pub const BINANCE_FAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
222 BinanceRateLimitQuota {
223 rate_limit_type: BinanceRateLimitType::RequestWeight,
224 interval: BinanceRateLimitInterval::Minute,
225 interval_num: 1,
226 limit: 2_400,
227 },
228 BinanceRateLimitQuota {
229 rate_limit_type: BinanceRateLimitType::Orders,
230 interval: BinanceRateLimitInterval::Second,
231 interval_num: 10,
232 limit: 300,
233 },
234 BinanceRateLimitQuota {
235 rate_limit_type: BinanceRateLimitType::Orders,
236 interval: BinanceRateLimitInterval::Minute,
237 interval_num: 1,
238 limit: 1_200,
239 },
240];
241
242pub const BINANCE_DAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
247 BinanceRateLimitQuota {
248 rate_limit_type: BinanceRateLimitType::RequestWeight,
249 interval: BinanceRateLimitInterval::Minute,
250 interval_num: 1,
251 limit: 2_400,
252 },
253 BinanceRateLimitQuota {
254 rate_limit_type: BinanceRateLimitType::Orders,
255 interval: BinanceRateLimitInterval::Second,
256 interval_num: 10,
257 limit: 300,
258 },
259 BinanceRateLimitQuota {
260 rate_limit_type: BinanceRateLimitType::Orders,
261 interval: BinanceRateLimitInterval::Minute,
262 interval_num: 1,
263 limit: 1_200,
264 },
265];
266
267pub const BINANCE_EAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
272 BinanceRateLimitQuota {
273 rate_limit_type: BinanceRateLimitType::RequestWeight,
274 interval: BinanceRateLimitInterval::Minute,
275 interval_num: 1,
276 limit: 3_000,
277 },
278 BinanceRateLimitQuota {
279 rate_limit_type: BinanceRateLimitType::Orders,
280 interval: BinanceRateLimitInterval::Second,
281 interval_num: 1,
282 limit: 5,
283 },
284 BinanceRateLimitQuota {
285 rate_limit_type: BinanceRateLimitType::Orders,
286 interval: BinanceRateLimitInterval::Minute,
287 interval_num: 1,
288 limit: 200,
289 },
290];
291
292pub static BINANCE_WS_SUBSCRIPTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
296 Quota::per_second(NonZeroU32::new(5).expect("non-zero")).expect("valid constant")
297});
298
299pub static BINANCE_WS_CONNECTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
304 Quota::per_second(NonZeroU32::new(1).expect("non-zero")).expect("valid constant")
305});
306
307pub static BINANCE_RATE_LIMIT_KEY_SUBSCRIPTION: LazyLock<[Ustr; 1]> =
309 LazyLock::new(|| [Ustr::from("subscription")]);
310
311pub const BINANCE_GTX_ORDER_REJECT_CODE: i64 = -5022;
315
316pub const BINANCE_NEW_ORDER_REJECTED_CODE: i64 = -2010;
321
322pub const BINANCE_NO_SUCH_ORDER_CODE: i64 = -2013;
324
325pub const BINANCE_UNEXPECTED_RESPONSE_CODE: i64 = -1006;
327
328pub const BINANCE_STATUS_UNKNOWN_CODE: i64 = -1007;
330
331pub const BINANCE_FUTURES_DUAL_SIDE_SYNC_REJECT_CODE: i64 = -4531;
337
338pub const BINANCE_SPOT_POST_ONLY_REJECT_MSG: &str = "Order would immediately match and take.";
342
343pub const BINANCE_BOOK_DEPTHS: [u32; 7] = [5, 10, 20, 50, 100, 500, 1000];
345
346#[cfg(test)]
347mod tests {
348 use rstest::rstest;
349
350 use super::*;
351
352 #[rstest]
353 fn test_venue_error_code_values() {
354 assert_eq!(BINANCE_GTX_ORDER_REJECT_CODE, -5022);
355 assert_eq!(BINANCE_NEW_ORDER_REJECTED_CODE, -2010);
356 assert_eq!(BINANCE_NO_SUCH_ORDER_CODE, -2013);
357 assert_eq!(BINANCE_UNEXPECTED_RESPONSE_CODE, -1006);
358 assert_eq!(BINANCE_STATUS_UNKNOWN_CODE, -1007);
359 assert_eq!(BINANCE_FUTURES_DUAL_SIDE_SYNC_REJECT_CODE, -4531);
360 }
361
362 #[rstest]
363 #[case(BINANCE_SPOT_SBE_WS_API_URL)]
364 #[case(BINANCE_SPOT_SBE_WS_API_TESTNET_URL)]
365 #[case(BINANCE_SPOT_SBE_WS_API_DEMO_URL)]
366 fn test_spot_sbe_ws_api_urls_use_current_schema(#[case] url: &str) {
367 assert!(url.ends_with("sbeSchemaId=3&sbeSchemaVersion=5"));
368 }
369}