kucoin_spot_export.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. use std::collections::BTreeMap;
  2. use async_trait::async_trait;
  3. use chrono::{FixedOffset, NaiveDateTime, TimeZone};
  4. use serde::{Deserialize, Serialize};
  5. use tracing::warn;
  6. use exchanges::kucoin_spot_rest::KucoinSpotRest;
  7. use standard::exchange::ExchangeEnum;
  8. use standard::utils;
  9. use crate::ExportConnector;
  10. pub struct KucoinSpotExport {
  11. request: KucoinSpotRest,
  12. }
  13. impl KucoinSpotExport {
  14. pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> KucoinSpotExport {
  15. KucoinSpotExport {
  16. request: KucoinSpotRest::new(is_colo, params.clone())
  17. }
  18. }
  19. }
  20. /// TradesSwap
  21. /// - `symbol`: String, 合約編號
  22. /// - `trade_id`: String, 交易編號
  23. /// - `order_id`: String, 訂單編號
  24. /// - `counter_order_id`: String, 對手方訂單Id
  25. /// - `side`: String, 買賣方向
  26. /// - `liquidity`: String,流動性類型 taker or maker
  27. /// - `force_taker`: bool, 是否強製作爲taker處理
  28. /// - `price`: String, 成交價格
  29. /// - `size`: i64, 成交數量
  30. /// - `funds`: String, 成交額
  31. /// - `fee`: String, 交易費用
  32. /// - `fee_currency`: String, 收費幣種
  33. /// - `stop`: String, 止損單類型標記
  34. /// - `fee_rate`: String, 費率
  35. /// - `order_type`: String, 訂單類型
  36. /// - `created_at`: i64, 創建時間
  37. /// - `trade_type`: String, 交易類型: trade, liquidation, ADL or settlement
  38. #[derive(Debug, Deserialize, Serialize)]
  39. #[serde(rename_all = "camelCase")]
  40. struct TradesSpot {
  41. symbol: String,
  42. trade_id: String,
  43. order_id: String,
  44. counter_order_id: String,
  45. side: String,
  46. liquidity: String,
  47. force_taker: bool,
  48. price: String,
  49. size: i64,
  50. funds: String,
  51. fee: String,
  52. fee_rate: String,
  53. fee_currency: String,
  54. stop: String,
  55. #[serde(rename = "type")]
  56. order_type: String,
  57. created_at: i64,
  58. trade_type: String,
  59. }
  60. #[async_trait]
  61. impl ExportConnector for KucoinSpotExport {
  62. async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
  63. let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
  64. let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
  65. let limit_params = if limit > 1000 {
  66. warn!("查询条数最大为1000条,已修改为1000条!");
  67. 1000
  68. } else { limit };
  69. let res_data = self.request.get_fills(symbol_format, "".to_string(), "".to_string(), start_time, end_time, limit_params).await;
  70. if res_data.code == "200" {
  71. let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
  72. let trades_info: Vec<TradesSpot> = serde_json::from_str(&res_data_json["items"].to_string()).unwrap();
  73. let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "订单价格", "订单数量", "成交额", "手续费", "手续费率", "订单类型", "创建时间"];
  74. let mut data_array: Vec<Vec<String>> = Vec::new();
  75. for (index, value) in trades_info.iter().enumerate() {
  76. if index >= data_array.len() {
  77. data_array.push(Vec::new());
  78. }
  79. let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
  80. data_array[index] = vec![
  81. value.trade_id.clone(),
  82. value.order_id.clone(),
  83. value.symbol.clone(),
  84. value.side.clone(),
  85. value.price.clone(),
  86. value.size.to_string(),
  87. value.funds.clone(),
  88. value.fee.clone(),
  89. value.fee_rate.clone(),
  90. value.order_type.clone(),
  91. created_at,
  92. ];
  93. }
  94. global::export_utils::export_excel(header_array, data_array, prefix_name)
  95. } else {
  96. res_data.to_string()
  97. }
  98. }
  99. }