Skip to content

Commit 0563ad2

Browse files
committed
hack: warn on zeroed trades from Binance (TODO: figure out what they actually mean and what's the correct action)
1 parent 9af2980 commit 0563ad2

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

v_exchanges/src/binance/ws.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,38 @@ impl ExchangeStream for TradesConnection {
3636
type Item = Trade;
3737

3838
async fn next(&mut self) -> Result<Self::Item, WsError> {
39-
let content_event = self.connection.next().await?;
40-
let trade_event = match self.instrument {
41-
Instrument::Perp => {
42-
let interpreted_response = serde_json::from_value::<TradeEventPerp>(content_event.data).expect("Exchange responded with invalid trade event");
43-
Trade::from(interpreted_response)
39+
loop {
40+
let content_event = self.connection.next().await?;
41+
let trade = match self.instrument {
42+
Instrument::Perp => {
43+
let parsed = serde_json::from_value::<TradeEventPerp>(content_event.data.clone()).expect("Exchange responded with invalid trade event");
44+
Trade::from(parsed)
45+
}
46+
Instrument::Spot | Instrument::Margin => {
47+
let parsed = serde_json::from_value::<TradeEventSpot>(content_event.data.clone()).expect("Exchange responded with invalid trade event");
48+
Trade::from(parsed)
49+
}
50+
_ => unimplemented!(),
51+
};
52+
if trade.price == 0.0 || trade.qty_asset == 0.0 {
53+
warn_zeroed_trade(&content_event);
54+
continue;
4455
}
45-
Instrument::Spot | Instrument::Margin => {
46-
let initial = serde_json::from_value::<TradeEventSpot>(content_event.data).expect("Exchange responded with invalid trade event");
47-
Trade::from(initial)
48-
}
49-
_ => unimplemented!(),
50-
};
51-
Ok(trade_event)
56+
return Ok(trade);
57+
}
5258
}
5359
}
5460

61+
fn warn_zeroed_trade(event: &adapters::generics::ws::ContentEvent) {
62+
tracing::warn!(
63+
raw_json = %event.data,
64+
topic = %event.topic,
65+
event_type = %event.event_type,
66+
event_time = %event.time,
67+
"Binance sent a zero-valued trade, skipping"
68+
);
69+
}
70+
5571
#[serde_as]
5672
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)]
5773
pub struct TradeEventPerp {

0 commit comments

Comments
 (0)