|
|
@@ -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;
|