rusty_common/constants/
mod.rs1use rust_decimal::Decimal;
7use rust_decimal_macros::dec;
8
9pub mod coinbase;
12
13pub use coinbase::Environment as CoinbaseEnvironment;
15
16pub mod time {
18 pub const NANOSECOND: i64 = 1;
20
21 pub const MICROSECOND: i64 = 1_000;
23
24 pub const MILLISECOND: i64 = 1_000_000;
26
27 pub const SECOND: i64 = 1_000_000_000;
29
30 pub const MINUTE: i64 = 60 * SECOND;
32
33 pub const HOUR: i64 = 60 * MINUTE;
35
36 pub const DAY: i64 = 24 * HOUR;
38}
39
40pub mod network {
42 pub const DEFAULT_HTTP_TIMEOUT_SECS: u64 = 30;
44
45 pub const DEFAULT_WS_PING_INTERVAL_SECS: u64 = 30;
47
48 pub const DEFAULT_WS_PONG_TIMEOUT_SECS: u64 = 10;
50
51 pub const MAX_RECONNECT_ATTEMPTS: u32 = 10;
53
54 pub const BASE_RECONNECT_DELAY_MS: u64 = 1000;
56
57 pub const MAX_RECONNECT_DELAY_MS: u64 = 60_000;
59}
60
61pub mod trading {
63 use super::*;
64 use crate::const_fn_candidates::{const_max_u64, percent_to_bps};
65
66 pub const MIN_ORDER_SIZE: Decimal = dec!(0.001);
68
69 pub const MAX_ORDER_SIZE: Decimal = dec!(10000);
71
72 pub const DEFAULT_MAKER_FEE_RATE: Decimal = dec!(0.001);
74
75 pub const DEFAULT_TAKER_FEE_RATE: Decimal = dec!(0.001);
77
78 pub const MAX_OPEN_ORDERS_PER_SYMBOL: usize = 100;
80
81 pub const MAX_POSITION_PCT: Decimal = dec!(0.9);
83
84 pub const MAKER_FEE_BPS: u64 = percent_to_bps(10); pub const TAKER_FEE_BPS: u64 = percent_to_bps(10); pub const HIGH_FEE_BPS: u64 = percent_to_bps(25); pub const MAX_LEVERAGE: u64 = 10;
93 pub const DEFAULT_STOP_LOSS_BPS: u64 = percent_to_bps(200); pub const DEFAULT_TAKE_PROFIT_BPS: u64 = percent_to_bps(300); #[inline]
100 #[must_use]
101 pub const fn calculate_fee_bps(fee_percent: u64) -> u64 {
102 percent_to_bps(fee_percent)
103 }
104
105 #[inline]
106 #[must_use]
107 pub const fn max_position_size(account_balance: u64, max_risk_percent: u64) -> u64 {
109 (account_balance * max_risk_percent) / 100
110 }
111
112 #[inline]
113 #[must_use]
114 pub const fn optimal_order_count(total_size: u64, min_order_size: u64) -> usize {
116 if min_order_size == 0 {
117 return 1;
118 }
119 const_max_u64(1, total_size / min_order_size) as usize
120 }
121
122 #[inline]
123 #[must_use]
124 pub const fn risk_adjusted_size(base_size: u64, risk_factor: u64) -> u64 {
126 (base_size * risk_factor) / 10000
128 }
129}
130
131pub mod rate_limit {
133 pub const DEFAULT_WINDOW_SECS: u64 = 60;
135
136 pub const DEFAULT_MAX_REQUESTS: u32 = 1200;
138
139 pub const HEADER_LIMIT: &str = "X-RateLimit-Limit";
141 pub const HEADER_REMAINING: &str = "X-RateLimit-Remaining";
143 pub const HEADER_RESET: &str = "X-RateLimit-Reset";
145}
146
147pub mod buffer {
149 use crate::const_fn_candidates::{
150 buffer_size_power_of_two, cache_aligned_size, simd_aligned_size,
151 };
152
153 pub const DEFAULT_CHANNEL_SIZE: usize = 1024;
155
156 pub const MARKET_DATA_CHANNEL_SIZE: usize = 10_000;
158
159 pub const ORDER_EVENT_CHANNEL_SIZE: usize = 1_000;
161
162 pub const DEFAULT_SMART_STRING_BUFFER_SIZE: usize = 256;
164
165 pub const WS_SMALL_BUFFER_SIZE: usize = 4 * 1024; pub const WS_MEDIUM_BUFFER_SIZE: usize = 16 * 1024; pub const WS_LARGE_BUFFER_SIZE: usize = 64 * 1024; pub const WS_XLARGE_BUFFER_SIZE: usize = 1024 * 1024; pub const SIMD_ALIGNED_64: usize = simd_aligned_size(64);
176 pub const SIMD_ALIGNED_128: usize = simd_aligned_size(128);
178 pub const SIMD_ALIGNED_256: usize = simd_aligned_size(256);
180
181 pub const CACHE_ALIGNED_SMALL: usize = cache_aligned_size(32);
183 pub const CACHE_ALIGNED_MEDIUM: usize = cache_aligned_size(128);
185 pub const CACHE_ALIGNED_LARGE: usize = cache_aligned_size(512);
187
188 pub const POW2_BUFFER_SMALL: usize = buffer_size_power_of_two(100);
190 pub const POW2_BUFFER_MEDIUM: usize = buffer_size_power_of_two(500);
192 pub const POW2_BUFFER_LARGE: usize = buffer_size_power_of_two(2000);
194
195 #[inline]
197 #[must_use]
198 pub const fn optimal_channel_size(expected_throughput: usize) -> usize {
199 buffer_size_power_of_two(expected_throughput * 2)
201 }
202
203 #[inline]
204 #[must_use]
205 pub const fn websocket_buffer_size(message_count: usize, avg_message_size: usize) -> usize {
207 let total_size = message_count * avg_message_size;
208 total_size + (total_size / 4)
210 }
211}
212
213pub mod exchange {
215 pub mod binance {
217 pub const MAX_SYMBOLS_PER_WS: usize = 1024;
219
220 pub const LISTEN_KEY_VALIDITY_MINS: u64 = 60;
222 }
223
224 pub mod bybit {
226 pub const MAX_SUBSCRIPTIONS_PER_WS: usize = 1000;
228 }
229
230 pub mod upbit {
232 pub const MAX_MARKETS_PER_SUB: usize = 100;
234 }
235
236 pub mod bithumb {
238 pub const MAX_SYMBOLS_PER_REQUEST: usize = 50;
240 }
241}