nautilus_binance/futures/websocket/
messages.rs1use nautilus_model::{
21 data::{Data, OrderBookDeltas},
22 instruments::InstrumentAny,
23};
24use nautilus_network::websocket::WebSocketClient;
25use serde::{Deserialize, Serialize};
26use ustr::Ustr;
27
28use crate::{
29 common::enums::{
30 BinanceFuturesOrderType, BinanceOrderStatus, BinanceSide, BinanceTimeInForce,
31 BinanceWsMethod,
32 },
33 http::query::BinanceKlineInterval,
34};
35
36#[derive(Debug, Clone)]
38pub enum NautilusFuturesWsMessage {
39 Data(Vec<Data>),
41 Deltas(OrderBookDeltas),
43 Instrument(Box<InstrumentAny>),
45 Error(BinanceFuturesWsErrorMsg),
47 RawJson(serde_json::Value),
49 Reconnected,
51}
52
53#[derive(Debug, Clone)]
55pub struct BinanceFuturesWsErrorMsg {
56 pub code: i64,
58 pub msg: String,
60}
61
62#[derive(Debug)]
64#[allow(
65 clippy::large_enum_variant,
66 reason = "Commands are ephemeral and immediately consumed"
67)]
68pub enum BinanceFuturesHandlerCommand {
69 SetClient(WebSocketClient),
71 Disconnect,
73 InitializeInstruments(Vec<InstrumentAny>),
75 UpdateInstrument(InstrumentAny),
77 Subscribe { streams: Vec<String> },
79 Unsubscribe { streams: Vec<String> },
81}
82
83#[derive(Debug, Clone, Deserialize)]
89pub struct BinanceFuturesAggTradeMsg {
90 #[serde(rename = "e")]
92 pub event_type: String,
93 #[serde(rename = "E")]
95 pub event_time: i64,
96 #[serde(rename = "s")]
98 pub symbol: Ustr,
99 #[serde(rename = "a")]
101 pub agg_trade_id: u64,
102 #[serde(rename = "p")]
104 pub price: String,
105 #[serde(rename = "q")]
107 pub quantity: String,
108 #[serde(rename = "f")]
110 pub first_trade_id: u64,
111 #[serde(rename = "l")]
113 pub last_trade_id: u64,
114 #[serde(rename = "T")]
116 pub trade_time: i64,
117 #[serde(rename = "m")]
119 pub is_buyer_maker: bool,
120}
121
122#[derive(Debug, Clone, Deserialize)]
124pub struct BinanceFuturesTradeMsg {
125 #[serde(rename = "e")]
127 pub event_type: String,
128 #[serde(rename = "E")]
130 pub event_time: i64,
131 #[serde(rename = "s")]
133 pub symbol: Ustr,
134 #[serde(rename = "t")]
136 pub trade_id: u64,
137 #[serde(rename = "p")]
139 pub price: String,
140 #[serde(rename = "q")]
142 pub quantity: String,
143 #[serde(rename = "T")]
145 pub trade_time: i64,
146 #[serde(rename = "m")]
148 pub is_buyer_maker: bool,
149}
150
151#[derive(Debug, Clone, Deserialize)]
153pub struct BinanceFuturesDepthUpdateMsg {
154 #[serde(rename = "e")]
156 pub event_type: String,
157 #[serde(rename = "E")]
159 pub event_time: i64,
160 #[serde(rename = "T")]
162 pub transaction_time: i64,
163 #[serde(rename = "s")]
165 pub symbol: Ustr,
166 #[serde(rename = "U")]
168 pub first_update_id: u64,
169 #[serde(rename = "u")]
171 pub final_update_id: u64,
172 #[serde(rename = "pu")]
174 pub prev_final_update_id: u64,
175 #[serde(rename = "b")]
177 pub bids: Vec<[String; 2]>,
178 #[serde(rename = "a")]
180 pub asks: Vec<[String; 2]>,
181}
182
183#[derive(Debug, Clone, Deserialize)]
185pub struct BinanceFuturesMarkPriceMsg {
186 #[serde(rename = "e")]
188 pub event_type: String,
189 #[serde(rename = "E")]
191 pub event_time: i64,
192 #[serde(rename = "s")]
194 pub symbol: Ustr,
195 #[serde(rename = "p")]
197 pub mark_price: String,
198 #[serde(rename = "i")]
200 pub index_price: String,
201 #[serde(rename = "P")]
203 pub estimated_settle_price: String,
204 #[serde(rename = "r")]
206 pub funding_rate: String,
207 #[serde(rename = "T")]
209 pub next_funding_time: i64,
210}
211
212#[derive(Debug, Clone, Deserialize)]
214pub struct BinanceFuturesBookTickerMsg {
215 #[serde(rename = "e")]
217 pub event_type: String,
218 #[serde(rename = "u")]
220 pub update_id: u64,
221 #[serde(rename = "E")]
223 pub event_time: i64,
224 #[serde(rename = "T")]
226 pub transaction_time: i64,
227 #[serde(rename = "s")]
229 pub symbol: Ustr,
230 #[serde(rename = "b")]
232 pub best_bid_price: String,
233 #[serde(rename = "B")]
235 pub best_bid_qty: String,
236 #[serde(rename = "a")]
238 pub best_ask_price: String,
239 #[serde(rename = "A")]
241 pub best_ask_qty: String,
242}
243
244#[derive(Debug, Clone, Deserialize)]
246pub struct BinanceFuturesKlineMsg {
247 #[serde(rename = "e")]
249 pub event_type: String,
250 #[serde(rename = "E")]
252 pub event_time: i64,
253 #[serde(rename = "s")]
255 pub symbol: Ustr,
256 #[serde(rename = "k")]
258 pub kline: BinanceFuturesKlineData,
259}
260
261#[derive(Debug, Clone, Deserialize)]
263pub struct BinanceFuturesKlineData {
264 #[serde(rename = "t")]
266 pub start_time: i64,
267 #[serde(rename = "T")]
269 pub close_time: i64,
270 #[serde(rename = "s")]
272 pub symbol: Ustr,
273 #[serde(rename = "i")]
275 pub interval: BinanceKlineInterval,
276 #[serde(rename = "f")]
278 pub first_trade_id: i64,
279 #[serde(rename = "L")]
281 pub last_trade_id: i64,
282 #[serde(rename = "o")]
284 pub open: String,
285 #[serde(rename = "c")]
287 pub close: String,
288 #[serde(rename = "h")]
290 pub high: String,
291 #[serde(rename = "l")]
293 pub low: String,
294 #[serde(rename = "v")]
296 pub volume: String,
297 #[serde(rename = "n")]
299 pub num_trades: i64,
300 #[serde(rename = "x")]
302 pub is_closed: bool,
303 #[serde(rename = "q")]
305 pub quote_volume: String,
306 #[serde(rename = "V")]
308 pub taker_buy_volume: String,
309 #[serde(rename = "Q")]
311 pub taker_buy_quote_volume: String,
312}
313
314#[derive(Debug, Clone, Deserialize)]
316pub struct BinanceFuturesLiquidationMsg {
317 #[serde(rename = "e")]
319 pub event_type: String,
320 #[serde(rename = "E")]
322 pub event_time: i64,
323 #[serde(rename = "o")]
325 pub order: BinanceFuturesLiquidationOrder,
326}
327
328#[derive(Debug, Clone, Deserialize)]
330pub struct BinanceFuturesLiquidationOrder {
331 #[serde(rename = "s")]
333 pub symbol: Ustr,
334 #[serde(rename = "S")]
336 pub side: BinanceSide,
337 #[serde(rename = "o")]
339 pub order_type: BinanceFuturesOrderType,
340 #[serde(rename = "f")]
342 pub time_in_force: BinanceTimeInForce,
343 #[serde(rename = "q")]
345 pub original_qty: String,
346 #[serde(rename = "p")]
348 pub price: String,
349 #[serde(rename = "ap")]
351 pub average_price: String,
352 #[serde(rename = "X")]
354 pub status: BinanceOrderStatus,
355 #[serde(rename = "l")]
357 pub last_filled_qty: String,
358 #[serde(rename = "z")]
360 pub accumulated_qty: String,
361 #[serde(rename = "T")]
363 pub trade_time: i64,
364}
365
366#[derive(Debug, Clone, Serialize)]
372pub struct BinanceFuturesWsSubscribeRequest {
373 pub method: BinanceWsMethod,
375 pub params: Vec<String>,
377 pub id: u64,
379}
380
381#[derive(Debug, Clone, Deserialize)]
383pub struct BinanceFuturesWsSubscribeResponse {
384 pub result: Option<serde_json::Value>,
386 pub id: u64,
388}
389
390#[derive(Debug, Clone, Deserialize)]
392pub struct BinanceFuturesWsErrorResponse {
393 pub code: i64,
395 pub msg: String,
397 pub id: Option<u64>,
399}