Jelajahi Sumber

修复gate交易量统计bug

gate的成交接口返回的成交数量是张数,实际数量得乘以ct_val
JiahengHe 8 bulan lalu
induk
melakukan
f3e13e7d78

+ 7 - 1
standard/src/binance_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::BTreeMap;
+use std::collections::{BTreeMap, HashMap};
 use std::io::{Error, ErrorKind};
 use std::result::Result;
 use std::str::FromStr;
@@ -190,6 +190,12 @@ impl Platform for BinanceSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol_format = utils::format_symbol(self.symbol.clone(), "");
         let res_data = self.request.get_exchange_info().await;

+ 7 - 1
standard/src/bitget_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use exchanges::bitget_swap_rest::BitgetSwapRest;
 use std::io::{Error, ErrorKind};
 use tokio::sync::mpsc::Sender;
@@ -237,6 +237,12 @@ impl Platform for BitgetSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         self.get_market_symbol(self.symbol.clone()).await
     }

+ 7 - 1
standard/src/bybit_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use std::io::{Error, ErrorKind};
 use std::str::FromStr;
 use tokio::sync::mpsc::Sender;
@@ -231,6 +231,12 @@ impl Platform for BybitSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol = self.symbol_uppercase.clone();
         let res_data = self.request.get_instruments_info(symbol.clone()).await;

+ 7 - 1
standard/src/coinex_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use std::io::{Error, ErrorKind};
 use std::str::FromStr;
 use tokio::sync::mpsc::Sender;
@@ -295,6 +295,12 @@ impl Platform for CoinexSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let symbol = format!("{}{}", symbol_array[0], symbol_array[1]);

+ 29 - 2
standard/src/gate_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use std::io::{Error, ErrorKind};
 use std::str::FromStr;
 use tokio::sync::mpsc::Sender;
@@ -181,6 +181,12 @@ impl Platform for GateSwap {
     async fn get_trade_amount(&mut self, start_time: i64, end_time: i64) -> Result<Decimal, Error> {
         let mut data_array = vec![];
         let mut last_id = "".to_string();
+        // 查询币对的ct_val值,用于交易数量与实际币量的转换比例
+        let ct_val_map = self.get_market_ct_val_map().await.unwrap_or_else(|error| {
+            error!("GateSwap:获取币对ct_val失败!error={}", error);
+            HashMap::new()
+        });
+        info!("ct_val_map={:?}", ct_val_map);
         loop {
             let res_data = self.request.my_trades("usdt".to_string(), "".to_string(), 1000, last_id.clone()).await;
             if res_data.code == 200 {
@@ -203,9 +209,12 @@ impl Platform for GateSwap {
         }
         let mut amount = Decimal::ZERO;
         for item in data_array.iter() {
+            let ct_val = ct_val_map.get(&item.contract).unwrap_or(&Decimal::ONE);
             let filled_price = Decimal::from_str(&item.price).unwrap_or(Decimal::ZERO);
             let filled_size = Decimal::from_i64(item.size.abs()).unwrap_or(Decimal::ZERO);
-            amount = filled_size * filled_price + amount;
+            // 实际成交量 = 成交接口成交数量 * ct_val
+            let real_filled_size = filled_size * ct_val;
+            amount = real_filled_size * filled_price + amount;
         }
         Ok(amount)
     }
@@ -270,6 +279,24 @@ impl Platform for GateSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let symbol_array: Vec<&str> = self.symbol.split("_").collect();
+        let res_data = self.request.get_market_details(symbol_array[1].to_string().to_lowercase()).await;
+
+        if res_data.code == 200 {
+            let mut ct_val_map = HashMap::new();
+            let res_data_json = res_data.data.as_array().unwrap();
+            for item in res_data_json.iter() {
+                let name = item["name"].as_str().unwrap();
+                let ct_val = Decimal::from_str(item["quanto_multiplier"].as_str().unwrap()).unwrap();
+                ct_val_map.insert(name.to_string(), ct_val);
+            }
+            Ok(ct_val_map)
+        } else {
+            Err(Error::new(ErrorKind::Other, res_data.to_string()))
+        }
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.get_market_details(symbol_array[1].to_string().to_lowercase()).await;

+ 7 - 1
standard/src/htx_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use exchanges::htx_swap_rest::HtxSwapRest;
 use std::io::{Error, ErrorKind};
 use tokio::sync::mpsc::Sender;
@@ -208,6 +208,12 @@ impl Platform for HtxSwap {
         Ok(result)
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         self.get_market_symbol(self.symbol.clone()).await
     }

+ 7 - 1
standard/src/kucoin_swap.rs

@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, HashMap};
 use std::io::{Error, ErrorKind};
 use std::str::FromStr;
 use tokio::sync::mpsc::Sender;
@@ -198,6 +198,12 @@ impl Platform for KucoinSwap {
         }
     }
 
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error> {
+        let ct_val_map = HashMap::new();
+        // 所有ct_val为1
+        Ok(ct_val_map)
+    }
+
     async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
         let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));

+ 2 - 0
standard/src/lib.rs

@@ -542,6 +542,8 @@ pub trait Platform {
     async fn get_ticker(&mut self) -> Result<Ticker, Error>;
     // 获取市场行情自定义交易对
     async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error>;
+    // 获取所有币对的ct_val映射
+    async fn get_market_ct_val_map(&mut self) -> Result<HashMap<String, Decimal>, Error>;
     // 查询所有的市场信息
     async fn get_market(&mut self) -> Result<Market, Error>;
     // 查询所有的市场信息自定义交易对