rusty_feeder/exchange/binance/futures/data/
kline.rs1use rust_decimal::Decimal;
7use rust_decimal_macros::dec;
8use serde::{Deserialize, Serialize};
9use smartstring::alias::String;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13#[repr(align(16))] pub struct KlineMessage {
15 #[serde(rename = "e")]
17 pub event_type: String,
18
19 #[serde(rename = "E")]
21 pub event_time: u64,
22
23 #[serde(rename = "s")]
25 pub symbol: String,
26
27 #[serde(rename = "k")]
29 pub kline: KlineData,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct KlineData {
35 #[serde(rename = "t")]
37 pub start_time: u64,
38
39 #[serde(rename = "T")]
41 pub close_time: u64,
42
43 #[serde(rename = "s")]
45 pub symbol: String,
46
47 #[serde(rename = "i")]
49 pub interval: String,
50
51 #[serde(rename = "f")]
53 pub first_trade_id: u64,
54
55 #[serde(rename = "L")]
57 pub last_trade_id: u64,
58
59 #[serde(rename = "o")]
61 pub open: String,
62
63 #[serde(rename = "c")]
65 pub close: String,
66
67 #[serde(rename = "h")]
69 pub high: String,
70
71 #[serde(rename = "l")]
73 pub low: String,
74
75 #[serde(rename = "v")]
77 pub volume: String,
78
79 #[serde(rename = "n")]
81 pub number_of_trades: u64,
82
83 #[serde(rename = "x")]
85 pub is_closed: bool,
86
87 #[serde(rename = "q")]
89 pub quote_volume: String,
90
91 #[serde(rename = "V")]
93 pub taker_buy_volume: String,
94
95 #[serde(rename = "Q")]
97 pub taker_buy_quote_volume: String,
98
99 #[serde(rename = "B", default)]
101 pub ignore: String,
102}
103
104#[derive(Debug, Clone)]
106#[repr(align(16))] pub struct ParsedKlineData {
108 pub symbol: String,
110
111 pub interval: String,
113
114 pub start_time: u64,
116
117 pub close_time: u64,
119
120 pub open: Decimal,
122
123 pub high: Decimal,
125
126 pub low: Decimal,
128
129 pub close: Decimal,
131
132 pub volume: Decimal,
134
135 pub number_of_trades: u64,
137
138 pub is_closed: bool,
140
141 pub quote_volume: Decimal,
143
144 pub event_time: u64,
146}
147
148impl From<KlineMessage> for ParsedKlineData {
149 fn from(msg: KlineMessage) -> Self {
150 ParsedKlineData {
151 symbol: msg.symbol,
152 interval: msg.kline.interval,
153 start_time: msg.kline.start_time,
154 close_time: msg.kline.close_time,
155 open: msg.kline.open.parse().unwrap_or(dec!(0)),
156 high: msg.kline.high.parse().unwrap_or(dec!(0)),
157 low: msg.kline.low.parse().unwrap_or(dec!(0)),
158 close: msg.kline.close.parse().unwrap_or(dec!(0)),
159 volume: msg.kline.volume.parse().unwrap_or(dec!(0)),
160 number_of_trades: msg.kline.number_of_trades,
161 is_closed: msg.kline.is_closed,
162 quote_volume: msg.kline.quote_volume.parse().unwrap_or(dec!(0)),
163 event_time: msg.event_time,
164 }
165 }
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
170#[repr(align(16))] pub struct ContinuousKlineMessage {
172 #[serde(rename = "e")]
174 pub event_type: String,
175
176 #[serde(rename = "E")]
178 pub event_time: u64,
179
180 #[serde(rename = "ps")]
182 pub pair: String,
183
184 #[serde(rename = "ct")]
186 pub contract_type: String,
187
188 #[serde(rename = "k")]
190 pub kline: ContinuousKlineData,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct ContinuousKlineData {
196 #[serde(rename = "t")]
198 pub start_time: u64,
199
200 #[serde(rename = "T")]
202 pub close_time: u64,
203
204 #[serde(rename = "ps")]
206 pub pair: String,
207
208 #[serde(rename = "ct")]
210 pub contract_type: String,
211
212 #[serde(rename = "i")]
214 pub interval: String,
215
216 #[serde(rename = "f")]
218 pub first_trade_id: i64,
219
220 #[serde(rename = "L")]
222 pub last_trade_id: i64,
223
224 #[serde(rename = "o")]
226 pub open: String,
227
228 #[serde(rename = "c")]
230 pub close: String,
231
232 #[serde(rename = "h")]
234 pub high: String,
235
236 #[serde(rename = "l")]
238 pub low: String,
239
240 #[serde(rename = "v")]
242 pub volume: String,
243
244 #[serde(rename = "n")]
246 pub number_of_trades: u64,
247
248 #[serde(rename = "x")]
250 pub is_closed: bool,
251
252 #[serde(rename = "q")]
254 pub quote_volume: String,
255}
256
257#[derive(Debug, Clone)]
259#[repr(align(16))] pub struct ParsedContinuousKlineData {
261 pub pair: String,
263
264 pub contract_type: String,
266
267 pub interval: String,
269
270 pub start_time: u64,
272
273 pub close_time: u64,
275
276 pub open: Decimal,
278
279 pub high: Decimal,
281
282 pub low: Decimal,
284
285 pub close: Decimal,
287
288 pub volume: Decimal,
290
291 pub number_of_trades: u64,
293
294 pub is_closed: bool,
296
297 pub quote_volume: Decimal,
299
300 pub event_time: u64,
302}
303
304impl From<ContinuousKlineMessage> for ParsedContinuousKlineData {
305 fn from(msg: ContinuousKlineMessage) -> Self {
306 ParsedContinuousKlineData {
307 pair: msg.pair,
308 contract_type: msg.contract_type,
309 interval: msg.kline.interval,
310 start_time: msg.kline.start_time,
311 close_time: msg.kline.close_time,
312 open: msg.kline.open.parse().unwrap_or(dec!(0)),
313 high: msg.kline.high.parse().unwrap_or(dec!(0)),
314 low: msg.kline.low.parse().unwrap_or(dec!(0)),
315 close: msg.kline.close.parse().unwrap_or(dec!(0)),
316 volume: msg.kline.volume.parse().unwrap_or(dec!(0)),
317 number_of_trades: msg.kline.number_of_trades,
318 is_closed: msg.kline.is_closed,
319 quote_volume: msg.kline.quote_volume.parse().unwrap_or(dec!(0)),
320 event_time: msg.event_time,
321 }
322 }
323}