|
|
@@ -0,0 +1,108 @@
|
|
|
+use std::collections::BTreeMap;
|
|
|
+use std::str::FromStr;
|
|
|
+use async_trait::async_trait;
|
|
|
+use chrono::{FixedOffset, NaiveDateTime, TimeZone};
|
|
|
+use rust_decimal::Decimal;
|
|
|
+use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
|
+use rust_decimal_macros::dec;
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
+use tracing::{trace, warn};
|
|
|
+use exchanges::coinex_swap_rest::CoinexSwapRest;
|
|
|
+use standard::utils;
|
|
|
+use crate::ExportConnector;
|
|
|
+
|
|
|
+pub struct CoinexSwapExport {
|
|
|
+ request: CoinexSwapRest,
|
|
|
+}
|
|
|
+
|
|
|
+impl CoinexSwapExport {
|
|
|
+ pub async fn new(_is_colo: bool, params: BTreeMap<String, String>) -> CoinexSwapExport {
|
|
|
+ CoinexSwapExport {
|
|
|
+ request: CoinexSwapRest::new(params.clone())
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/// 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, 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,
|
|
|
+}
|
|
|
+
|
|
|
+#[async_trait]
|
|
|
+impl ExportConnector for CoinexSwapExport {
|
|
|
+ async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
|
|
|
+ let symbol_format = utils::format_symbol(symbol.clone(), "");
|
|
|
+ let limit_params = if limit > 1000 {
|
|
|
+ warn!("查询条数最大为1000条,已修改为1000条!");
|
|
|
+ 1000
|
|
|
+ } else { limit };
|
|
|
+ let mut data_array = vec![];
|
|
|
+ let mut page = 1;
|
|
|
+ loop {
|
|
|
+ let res_data = self.request.finished_order(symbol_format.clone(), page, limit_params).await;
|
|
|
+ if res_data.code == 200 {
|
|
|
+ let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data.to_string()).unwrap();
|
|
|
+ for value in trades_info.iter() {
|
|
|
+ let size = Decimal::from_str(&value.amount).unwrap();
|
|
|
+ let create_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
|
|
|
+ let update_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.updated_at).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
|
|
|
+ data_array.push(vec![
|
|
|
+ value.client_id.clone(),
|
|
|
+ value.order_id.to_string(),
|
|
|
+ value.market.clone(),
|
|
|
+ value.side.clone(),
|
|
|
+ value.price.clone(),
|
|
|
+ size.abs().to_string(),
|
|
|
+ value.filled_value.clone(),
|
|
|
+ value.fee.clone(),
|
|
|
+ create_time,
|
|
|
+ update_time,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ let last_time = (trades_info.last().unwrap().created_at).to_i64().unwrap();
|
|
|
+ if last_time < start_time {
|
|
|
+ data_array = data_array.iter().filter(|item| {
|
|
|
+ let last_time = NaiveDateTime::parse_from_str(item.last().unwrap(), "%Y-%m-%d %H:%M:%S%.3f")
|
|
|
+ .unwrap()
|
|
|
+ .timestamp_millis();
|
|
|
+ last_time > start_time && last_time < end_time
|
|
|
+ }).cloned().collect();
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ page = page + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "创建时间", "成交时间"];
|
|
|
+ let data_array_rev: Vec<Vec<String>> = data_array.iter().rev().cloned().collect();
|
|
|
+ global::export_utils::export_excel(header_array, data_array_rev, prefix_name)
|
|
|
+ }
|
|
|
+}
|