rusty_feeder/exchange/binance/spot/data/
trade.rs

1//! Trade message types for Binance Spot WebSocket API
2//!
3//! This module provides optimized data structures for processing
4//! trade messages from Binance Spot WebSocket streams.
5
6use rust_decimal::Decimal;
7use rust_decimal_macros::dec;
8use serde::{Deserialize, Serialize};
9use smartstring::alias::String;
10
11/// Trade message from Binance Spot WebSocket
12#[derive(Debug, Clone, Serialize, Deserialize)]
13#[repr(align(16))] // Align for better memory access
14pub struct TradeMessage {
15    /// Event type
16    #[serde(rename = "e")]
17    pub event_type: String,
18
19    /// Event time
20    #[serde(rename = "E")]
21    pub event_time: u64,
22
23    /// Symbol
24    #[serde(rename = "s")]
25    pub symbol: String,
26
27    /// Trade ID
28    #[serde(rename = "t")]
29    pub trade_id: u64,
30
31    /// Price
32    #[serde(rename = "p")]
33    pub price: String,
34
35    /// Quantity
36    #[serde(rename = "q")]
37    pub quantity: String,
38
39    /// Buyer order ID
40    #[serde(rename = "b", default)]
41    pub buyer_order_id: Option<u64>,
42
43    /// Seller order ID
44    #[serde(rename = "a", default)]
45    pub seller_order_id: Option<u64>,
46
47    /// Trade time
48    #[serde(rename = "T")]
49    pub trade_time: u64,
50
51    /// Is the buyer the market maker?
52    #[serde(rename = "m")]
53    pub is_buyer_market_maker: bool,
54
55    /// Ignore
56    #[serde(rename = "M", default)]
57    pub ignore: bool,
58}
59
60/// Parsed trade data with Decimal values
61#[derive(Debug, Clone)]
62#[repr(align(16))] // Align for better memory access
63pub struct ParsedTradeData {
64    /// Symbol
65    pub symbol: String,
66
67    /// Trade ID
68    pub trade_id: u64,
69
70    /// Price
71    pub price: Decimal,
72
73    /// Quantity
74    pub quantity: Decimal,
75
76    /// Buy or sell side
77    pub is_buyer_market_maker: bool,
78
79    /// Trade timestamp
80    pub trade_time: u64,
81
82    /// Event timestamp (when message was generated)
83    pub event_time: u64,
84}
85
86impl From<TradeMessage> for ParsedTradeData {
87    fn from(msg: TradeMessage) -> Self {
88        ParsedTradeData {
89            symbol: msg.symbol,
90            trade_id: msg.trade_id,
91            price: msg.price.parse().unwrap_or(dec!(0)),
92            quantity: msg.quantity.parse().unwrap_or(dec!(0)),
93            is_buyer_market_maker: msg.is_buyer_market_maker,
94            trade_time: msg.trade_time,
95            event_time: msg.event_time,
96        }
97    }
98}