Browse Source

BookTicker的格式化完成了

skyffire 6 months ago
parent
commit
78590181ca

+ 17 - 3
src/gate_usdt_swap_data_listener.rs

@@ -79,8 +79,8 @@ pub async fn run_listener(is_shutdown_arc: Arc<AtomicBool>) {
             ws.set_subscribe(vec![
                 // GateSwapSubscribeType::PuFuturesTrades,
                 // GateSwapSubscribeType::PuFuturesCandlesticks,
-                GateSwapSubscribeType::PuFuturesOrderBook,
-                // GateSwapSubscribeType::PuFuturesBookTicker
+                // GateSwapSubscribeType::PuFuturesOrderBook,
+                GateSwapSubscribeType::PuFuturesBookTicker
             ]);
 
             // 建立链接
@@ -110,7 +110,7 @@ pub async fn data_listener(response: ResponseData) {
             let depth_from_handler = ExchangeStructHandler::order_book_handle(ExchangeEnum::GateSwap, &response);
 
             let new_depth: Depth; // 声明 new_depth
-            { // MUL_MAP 的锁作用域开始
+            { // MUL_MAP 的锁作用域开始,处理合约乘数
                 let mul_map_guard = MUL_MAP.lock().await;
                 let multiplier = mul_map_guard.get(&depth_from_handler.symbol)
                     .expect("Multiplier not found for symbol"); // 或者提供一个默认值/错误处理
@@ -140,6 +140,20 @@ pub async fn data_listener(response: ResponseData) {
             manager_instance_guard.add_depth_update(&new_depth)
                 .expect("添加深度信息错误");
         }
+        "futures.book_ticker" => {
+            let mut book_ticker = ExchangeStructHandler::book_ticker_handle(ExchangeEnum::GateSwap, &response);
+
+            { // MUL_MAP 的锁作用域开始,处理合约乘数
+                let mul_map_guard = MUL_MAP.lock().await;
+                let multiplier = mul_map_guard.get(&book_ticker.symbol)
+                    .expect("Multiplier not found for symbol"); // 或者提供一个默认值/错误处理
+
+                book_ticker.ask_amount = book_ticker.ask_amount * (*multiplier);
+                book_ticker.bid_amount = book_ticker.bid_amount * (*multiplier);
+            } // MUL_MAP 的锁在这里释放
+
+            info!(?book_ticker);
+        }
         // 订单流数据
         "futures.trades" => {
             // let mut trades = ExchangeStructHandler::trades_handle(ExchangeEnum::GateSwap, &response);

+ 7 - 4
standard/src/exchange_struct_handler.rs

@@ -4,8 +4,8 @@ use rust_decimal::prelude::FromPrimitive;
 use tracing::{error};
 use exchanges::response_base::ResponseData;
 use crate::exchange::ExchangeEnum;
-use crate::{binance_swap_handle, gate_swap_handle, bybit_swap_handle, bitget_swap_handle, coinex_swap_handle, htx_swap_handle, bingx_swap_handle, mexc_swap_handle, okx_swap_handle, bitmart_swap_handle, kucoin_swap_handle, coinsph_swap_handle, phemex_swap_handle, woo_swap_handle, cointr_swap_handle, gate_spot_handle, ForceOrder};
-use crate::{Record, Ticker, Trade, Depth};
+use crate::{binance_swap_handle, gate_swap_handle, bybit_swap_handle, bitget_swap_handle, coinex_swap_handle, htx_swap_handle, bingx_swap_handle, mexc_swap_handle, okx_swap_handle, bitmart_swap_handle, kucoin_swap_handle, coinsph_swap_handle, phemex_swap_handle, woo_swap_handle, cointr_swap_handle, gate_spot_handle, ForceOrder, BookTicker};
+use crate::{Record, Trade, Depth};
 use crate::{Account, OrderBook, Position, SpecialOrder};
 
 #[allow(dead_code)]
@@ -147,9 +147,12 @@ impl ExchangeStructHandler {
             }
         }
     }
-    // 处理Ticker信息
-    pub fn book_ticker_handle(exchange: ExchangeEnum, _res_data: &ResponseData) -> Ticker {
+    // 处理BookTicker信息
+    pub fn book_ticker_handle(exchange: ExchangeEnum, res_data: &ResponseData) -> BookTicker {
         match exchange {
+            ExchangeEnum::GateSwap => {
+                gate_swap_handle::format_book_ticker(&res_data)
+            }
             _ => {
                 error!("未找到该交易所!book_ticker_handle: {:?}", exchange);
                 panic!("未找到该交易所!book_ticker_handle: {:?}", exchange);

+ 15 - 2
standard/src/gate_swap_handle.rs

@@ -4,7 +4,7 @@ use rust_decimal::prelude::FromPrimitive;
 use serde_json::Value;
 use tracing::{error};
 use exchanges::response_base::ResponseData;
-use crate::{Account, OrderBook, Order, Position, PositionModeEnum, SpecialOrder, Trade, Record};
+use crate::{Account, OrderBook, Order, Position, PositionModeEnum, SpecialOrder, Trade, Record, BookTicker};
 
 // 处理账号信息
 pub fn handle_account_info(res_data: &ResponseData, symbol: &String) -> Account {
@@ -184,5 +184,18 @@ pub fn format_trade_items(res_data: &ResponseData) -> Vec<Trade> {
         })
     }
 
-    return trades
+    trades
+}
+
+pub fn format_book_ticker(res_data: &ResponseData) -> BookTicker {
+    let item = &res_data.data;
+
+    BookTicker {
+        timestamp: Decimal::from_i64(item["t"].as_i64().unwrap()).unwrap(),
+        symbol: item["s"].as_str().unwrap().to_string(),
+        ask_price: Decimal::from_str(item["a"].as_str().unwrap().to_string().as_str()).unwrap(),
+        ask_amount: Decimal::from_i64(item["A"].as_i64().unwrap()).unwrap(),
+        bid_price: Decimal::from_str(item["b"].as_str().unwrap().to_string().as_str()).unwrap(),
+        bid_amount: Decimal::from_i64(item["B"].as_i64().unwrap()).unwrap(),
+    }
 }

+ 17 - 0
standard/src/lib.rs

@@ -140,6 +140,23 @@ impl SpecialTrade {
     }
 }
 
+/// BookTicker结构体
+/// - `time(Decimal)`: 深度更新时间戳(ms);
+/// - `symbol(String)`: 币对符号;
+/// - `ask_price(String)`: 卖一价;
+/// - `ask_amount(String)`: 卖一数量;
+/// - `bid_price(String)`: 买一价;
+/// - `bid_amount(String)`: 买一数量;
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct BookTicker {
+    pub timestamp: Decimal,
+    pub symbol: String,
+    pub ask_price: Decimal,
+    pub ask_amount: Decimal,
+    pub bid_price: Decimal,
+    pub bid_amount: Decimal,
+}
+
 /// Depth结构体(市场深度)
 /// - `time(Decimal)`: 深度更新时间戳(ms);
 /// - `symbol(String)`: 币对符号;