|
|
@@ -0,0 +1,84 @@
|
|
|
+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::{ToPrimitive};
|
|
|
+use serde_json::Value::Null;
|
|
|
+use tracing::{warn};
|
|
|
+use exchanges::bitget_swap_rest::BitgetSwapRest;
|
|
|
+use standard::utils;
|
|
|
+use crate::ExportConnector;
|
|
|
+
|
|
|
+pub struct BitgetSwapExport {
|
|
|
+ request: BitgetSwapRest,
|
|
|
+}
|
|
|
+
|
|
|
+impl BitgetSwapExport {
|
|
|
+ pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> BitgetSwapExport {
|
|
|
+ BitgetSwapExport {
|
|
|
+ request: BitgetSwapRest::new(is_colo, params.clone())
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[async_trait]
|
|
|
+impl ExportConnector for BitgetSwapExport {
|
|
|
+ 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 > 100 {
|
|
|
+ warn!("查询条数最大为100条,已修改为100条!");
|
|
|
+ 100
|
|
|
+ } else { limit };
|
|
|
+ let mut last_id = "".to_string();
|
|
|
+ let mut data_array = vec![];
|
|
|
+ loop {
|
|
|
+ let res_data = self.request.get_histories(symbol_format.clone(), 100, last_id.clone()).await;
|
|
|
+ if res_data.code == 200 {
|
|
|
+ if res_data.data["endId"] == Null { break; }
|
|
|
+ last_id = res_data.data["endId"].as_str().unwrap().to_string();
|
|
|
+ let trades_info = res_data.data["fillList"].as_array().unwrap();
|
|
|
+ for value in trades_info.iter() {
|
|
|
+ let id = value["tradeId"].as_str().unwrap();
|
|
|
+ let order_id = value["orderId"].as_str().unwrap();
|
|
|
+ let symbol = value["symbol"].as_str().unwrap();
|
|
|
+ let side = value["side"].as_str().unwrap();
|
|
|
+ let price = value["price"].as_str().unwrap();
|
|
|
+ let size = Decimal::from_str(value["baseVolume"].as_str().unwrap()).unwrap();
|
|
|
+ let created_time = Decimal::from_str(value["cTime"].as_str().unwrap()).unwrap();
|
|
|
+ let trade_value = Decimal::from_str(price).unwrap() * size.abs();
|
|
|
+ let fee = value["feeDetail"][0]["totalFee"].as_str().unwrap();
|
|
|
+ let profit = value["profit"].as_str().unwrap();
|
|
|
+ let role = value["tradeScope"].as_str().unwrap();
|
|
|
+ let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(created_time.to_i64().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
|
|
|
+
|
|
|
+ data_array.push(vec![
|
|
|
+ id.to_string(),
|
|
|
+ order_id.to_string(),
|
|
|
+ symbol.to_string(),
|
|
|
+ side.to_string(),
|
|
|
+ price.to_string(),
|
|
|
+ size.abs().to_string(),
|
|
|
+ trade_value.to_string(),
|
|
|
+ fee.to_string(),
|
|
|
+ profit.to_string(),
|
|
|
+ role.to_string(),
|
|
|
+ created_at,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ let last_time = (trades_info.last().unwrap()["cTime"].as_str().unwrap().parse::<i64>().unwrap() * 1000).to_i64().unwrap();
|
|
|
+ if last_time < start_time {
|
|
|
+ data_array = data_array.iter().filter(|item| {
|
|
|
+ NaiveDateTime::parse_from_str(item.last().unwrap(), "%Y-%m-%d %H:%M:%S%.3f")
|
|
|
+ .unwrap()
|
|
|
+ .timestamp_millis() > start_time
|
|
|
+ }).cloned().collect();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "利润", "成交角色", "成交时间"];
|
|
|
+ global::export_utils::export_excel(header_array, data_array, prefix_name)
|
|
|
+ }
|
|
|
+}
|