1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
mod exchanges;
mod msg;
mod order;
pub use msg::*;
pub use order::Order;
pub use crypto_market_type::MarketType;
use serde_json::Result;
pub fn parse_trade(exchange: &str, market_type: MarketType, msg: &str) -> Result<Vec<TradeMsg>> {
match exchange {
"binance" => exchanges::binance::parse_trade(market_type, msg),
"bitfinex" => exchanges::bitfinex::parse_trade(market_type, msg),
"bitget" => exchanges::bitget::parse_trade(market_type, msg),
"bithumb" => exchanges::bithumb::parse_trade(market_type, msg),
"bitmex" => exchanges::bitmex::parse_trade(market_type, msg),
"bitstamp" => exchanges::bitstamp::parse_trade(market_type, msg),
"bitz" => exchanges::bitz::parse_trade(market_type, msg),
"bybit" => exchanges::bybit::parse_trade(market_type, msg),
"coinbase_pro" => exchanges::coinbase_pro::parse_trade(market_type, msg),
"deribit" => exchanges::deribit::parse_trade(market_type, msg),
"ftx" => exchanges::ftx::parse_trade(market_type, msg),
"gate" => exchanges::gate::parse_trade(market_type, msg),
"huobi" => exchanges::huobi::parse_trade(market_type, msg),
"kraken" => exchanges::kraken::parse_trade(market_type, msg),
"kucoin" => exchanges::kucoin::parse_trade(market_type, msg),
"mxc" => exchanges::mxc::parse_trade(market_type, msg),
"okex" => exchanges::okex::parse_trade(market_type, msg),
"zbg" => exchanges::zbg::parse_trade(market_type, msg),
_ => panic!("Unknown exchange {}", exchange),
}
}
pub fn parse_l2(
exchange: &str,
market_type: MarketType,
msg: &str,
timestamp: Option<i64>,
) -> Result<Vec<OrderBookMsg>> {
let ret = match exchange {
"binance" => exchanges::binance::parse_l2(market_type, msg),
"bitfinex" => exchanges::bitfinex::parse_l2(
market_type,
msg,
timestamp.expect("Bitfinex orderbook messages doesn't have timestamp"),
),
"bitget" => exchanges::bitget::parse_l2(market_type, msg),
"bithumb" => exchanges::bithumb::parse_l2(market_type, msg),
"bitmex" => exchanges::bitmex::parse_l2(
market_type,
msg,
timestamp.expect("BitMEX orderbook messages don't have timestamp"),
),
"bitstamp" => exchanges::bitstamp::parse_l2(market_type, msg),
"bitz" => exchanges::bitz::parse_l2(market_type, msg),
"bybit" => exchanges::bybit::parse_l2(market_type, msg),
"coinbase_pro" => exchanges::coinbase_pro::parse_l2(market_type, msg, timestamp),
"deribit" => exchanges::deribit::parse_l2(market_type, msg),
"ftx" => exchanges::ftx::parse_l2(market_type, msg),
"gate" => exchanges::gate::parse_l2(market_type, msg, timestamp),
"huobi" => exchanges::huobi::parse_l2(market_type, msg),
"kraken" => exchanges::kraken::parse_l2(market_type, msg),
"kucoin" => exchanges::kucoin::parse_l2(market_type, msg),
"mxc" => exchanges::mxc::parse_l2(market_type, msg, timestamp),
"okex" => exchanges::okex::parse_l2(market_type, msg),
"zbg" => exchanges::zbg::parse_l2(market_type, msg),
_ => panic!("Unknown exchange {}", exchange),
};
match ret {
Ok(mut orderbooks) => {
for orderbook in orderbooks.iter_mut() {
if orderbook.snapshot {
orderbook
.asks
.sort_by(|a, b| a.price.partial_cmp(&b.price).unwrap());
orderbook
.bids
.sort_by(|a, b| b.price.partial_cmp(&a.price).unwrap());
}
}
Ok(orderbooks)
}
Err(_) => ret,
}
}
pub fn parse_funding_rate(
exchange: &str,
market_type: MarketType,
msg: &str,
) -> Result<Vec<FundingRateMsg>> {
let func = match exchange {
"binance" => exchanges::binance::parse_funding_rate,
"bitget" => exchanges::bitget::parse_funding_rate,
"bitmex" => exchanges::bitmex::parse_funding_rate,
"huobi" => exchanges::huobi::parse_funding_rate,
"okex" => exchanges::okex::parse_funding_rate,
_ => panic!("{} does NOT have perpetual swap market", exchange),
};
func(market_type, msg)
}