|
|
@@ -7,6 +7,7 @@ use futures::stream::FuturesUnordered;
|
|
|
use futures::TryStreamExt;
|
|
|
use rust_decimal::Decimal;
|
|
|
use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
use serde_json::{Value};
|
|
|
use tokio::spawn;
|
|
|
use tokio::time::Instant;
|
|
|
@@ -29,6 +30,39 @@ pub struct CoinexSwap {
|
|
|
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 {
|
|
|
+ order_id: i64,
|
|
|
+ market: String,
|
|
|
+ market_type: String,
|
|
|
+ side: String,
|
|
|
+ #[serde(rename = "type")]
|
|
|
+ trade_type: String,
|
|
|
+ amount: String,
|
|
|
+ price: String,
|
|
|
+ unfilled_amount: String,
|
|
|
+ filled_amount: String,
|
|
|
+ filled_value: String,
|
|
|
+ client_id: String,
|
|
|
+ fee: String,
|
|
|
+ fee_ccy: String,
|
|
|
+ maker_fee_rate: String,
|
|
|
+ taker_fee_rate: String,
|
|
|
+ created_at: i64,
|
|
|
+ updated_at: i64,
|
|
|
+}
|
|
|
+
|
|
|
impl CoinexSwap {
|
|
|
pub async fn new(symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> CoinexSwap {
|
|
|
let market = Market::new();
|
|
|
@@ -168,6 +202,40 @@ impl Platform for CoinexSwap {
|
|
|
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 page = 1;
|
|
|
+ loop {
|
|
|
+ let res_data = self.request.finished_order("".to_string(), page, 1000).await;
|
|
|
+ if res_data.code == 200 {
|
|
|
+ let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data.to_string()).unwrap();
|
|
|
+ if trades_info.is_empty(){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ let last_time = (trades_info.last().unwrap().created_at).to_i64().unwrap();
|
|
|
+ data_array.extend(trades_info);
|
|
|
+
|
|
|
+ if last_time < start_time || last_time > end_time {
|
|
|
+ data_array = data_array.iter().filter(|item| {
|
|
|
+ let now_time = item.created_at;
|
|
|
+ now_time > start_time && now_time < end_time
|
|
|
+ }).cloned().collect();
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ page = page + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let mut amount = Decimal::ZERO;
|
|
|
+ for item in data_array.iter() {
|
|
|
+ let filled_value = Decimal::from_str(&item.filled_value).unwrap_or(Decimal::ZERO);
|
|
|
+ amount = filled_value + amount;
|
|
|
+ }
|
|
|
+ Ok(amount)
|
|
|
+ }
|
|
|
+
|
|
|
// 获取市场行情
|
|
|
async fn get_ticker(&mut self) -> Result<Ticker, Error> {
|
|
|
let symbol: String = self.symbol.replace("_", "");
|