|
@@ -7,6 +7,7 @@ use futures::stream::FuturesUnordered;
|
|
|
use futures::TryStreamExt;
|
|
use futures::TryStreamExt;
|
|
|
use rust_decimal::Decimal;
|
|
use rust_decimal::Decimal;
|
|
|
use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
use serde_json::{json, Value};
|
|
use serde_json::{json, Value};
|
|
|
use tokio::spawn;
|
|
use tokio::spawn;
|
|
|
use tokio::time::Instant;
|
|
use tokio::time::Instant;
|
|
@@ -28,6 +29,31 @@ pub struct GateSwap {
|
|
|
error_sender: Sender<Error>,
|
|
error_sender: Sender<Error>,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/// TradesSwap
|
|
|
|
|
+/// - `id`: i64, 成交记录 ID
|
|
|
|
|
+/// - `create_time`: i64, 成交时间
|
|
|
|
|
+/// - `contract`: String, 合约标识
|
|
|
|
|
+/// - `order_id`: String, 成交记录关联订单 ID
|
|
|
|
|
+/// - `size`: i64, 成交数量
|
|
|
|
|
+/// - `price`: String, 成交价格
|
|
|
|
|
+/// - `text`: String, 成交角色, taker - 吃单, maker - 做单
|
|
|
|
|
+/// - `fee`: String, 订单的自定义信息
|
|
|
|
|
+/// - `point_fee`: String, 成交手续费
|
|
|
|
|
+/// - `role`: String, 成交点卡手续费
|
|
|
|
|
+#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
|
|
|
+struct TradesSwap {
|
|
|
|
|
+ id: i64,
|
|
|
|
|
+ create_time: f64,
|
|
|
|
|
+ contract: String,
|
|
|
|
|
+ order_id: String,
|
|
|
|
|
+ size: i64,
|
|
|
|
|
+ price: String,
|
|
|
|
|
+ text: String,
|
|
|
|
|
+ fee: String,
|
|
|
|
|
+ point_fee: String,
|
|
|
|
|
+ role: String,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
impl GateSwap {
|
|
impl GateSwap {
|
|
|
pub async fn new(symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> GateSwap {
|
|
pub async fn new(symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> GateSwap {
|
|
|
let market = Market::new();
|
|
let market = Market::new();
|
|
@@ -151,6 +177,39 @@ impl Platform for GateSwap {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ 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();
|
|
|
|
|
+ loop {
|
|
|
|
|
+ let res_data = self.request.my_trades("usdt".to_string(), "".to_string(), 1000, last_id.clone()).await;
|
|
|
|
|
+ if res_data.code == 200 {
|
|
|
|
|
+ let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data.to_string()).unwrap();
|
|
|
|
|
+ if trades_info.len() == 0 {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ let last_time = (trades_info.last().unwrap().create_time * 1000.0).to_i64().unwrap();
|
|
|
|
|
+ last_id = trades_info.last().unwrap().id.to_string();
|
|
|
|
|
+ // 写入存储数组中
|
|
|
|
|
+ data_array.extend(trades_info);
|
|
|
|
|
+ // 当最后一个时间戳小于开始时间或者大于结束时间,则跳出循环
|
|
|
|
|
+ if last_time < start_time || last_time > end_time {
|
|
|
|
|
+ data_array = data_array.iter().filter(|item| {
|
|
|
|
|
+ (item.create_time*1000.0).to_i64().unwrap_or(0) > start_time
|
|
|
|
|
+ }).cloned().collect();
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ let mut amount = Decimal::ZERO;
|
|
|
|
|
+ for item in data_array.iter() {
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+ Ok(amount)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 获取市场行情
|
|
// 获取市场行情
|
|
|
async fn get_ticker(&mut self) -> Result<Ticker, Error> {
|
|
async fn get_ticker(&mut self) -> Result<Ticker, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|