gate_swap_export.rs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. use std::collections::BTreeMap;
  2. use std::str::FromStr;
  3. use async_trait::async_trait;
  4. use chrono::{FixedOffset, NaiveDateTime, TimeZone};
  5. use rust_decimal::Decimal;
  6. use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
  7. use rust_decimal_macros::dec;
  8. use serde::{Deserialize, Serialize};
  9. use tracing::{error, warn};
  10. use exchanges::gate_swap_rest::GateSwapRest;
  11. use standard::utils;
  12. use crate::ExportConnector;
  13. pub struct GateSwapExport {
  14. request: GateSwapRest,
  15. }
  16. impl GateSwapExport {
  17. pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> GateSwapExport {
  18. GateSwapExport {
  19. request: GateSwapRest::new(is_colo, params.clone())
  20. }
  21. }
  22. }
  23. /// TradesSwap
  24. /// - `id`: i64, 成交记录 ID
  25. /// - `create_time`: i64, 成交时间
  26. /// - `contract`: String, 合约标识
  27. /// - `order_id`: String, 成交记录关联订单 ID
  28. /// - `size`: i64, 成交数量
  29. /// - `price`: String, 成交价格
  30. /// - `text`: String, 成交角色, taker - 吃单, maker - 做单
  31. /// - `fee`: String, 订单的自定义信息
  32. /// - `point_fee`: String, 成交手续费
  33. /// - `role`: String, 成交点卡手续费
  34. #[derive(Debug, Deserialize, Serialize)]
  35. struct TradesSwap {
  36. id: i64,
  37. create_time: f64,
  38. contract: String,
  39. order_id: String,
  40. size: i64,
  41. price: String,
  42. text: String,
  43. fee: String,
  44. point_fee: String,
  45. role: String,
  46. }
  47. #[async_trait]
  48. impl ExportConnector for GateSwapExport {
  49. async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
  50. let symbol_array: Vec<&str> = symbol.split("_").collect();
  51. let symbol_format = utils::format_symbol(symbol.clone(), "_");
  52. let limit_params = if limit > 1000 {
  53. warn!("查询条数最大为1000条,已修改为1000条!");
  54. 1000
  55. } else { limit };
  56. let res_data = self.request.my_trades(symbol_array[1].to_lowercase(), symbol_format, limit_params).await;
  57. if start_time > 0 || end_time > 0 { error!("该交易所不支持根据时间查询!") };
  58. if res_data.code == "200" {
  59. let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
  60. let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "成交角色", "成交时间"];
  61. let mut data_array: Vec<Vec<String>> = Vec::new();
  62. for (index, value) in trades_info.iter().enumerate() {
  63. if index >= data_array.len() {
  64. data_array.push(Vec::new());
  65. }
  66. let size = Decimal::from_i64(value.size).unwrap();
  67. let side = if size < Decimal::ZERO { "sell" } else { "buy" };
  68. let created_time = Decimal::from_f64(value.create_time).unwrap() * dec!(1000);
  69. 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 %T").to_string();
  70. let trade_value = Decimal::from_str(&value.price).unwrap() * size.abs();
  71. data_array[index] = vec![
  72. value.id.to_string(),
  73. value.order_id.clone(),
  74. value.contract.clone(),
  75. side.to_string(),
  76. value.price.clone(),
  77. size.abs().to_string(),
  78. trade_value.to_string(),
  79. value.fee.clone(),
  80. value.role.clone(),
  81. created_at,
  82. ];
  83. }
  84. global::export_utils::export_excel(header_array, data_array, prefix_name)
  85. } else {
  86. res_data.to_string()
  87. }
  88. }
  89. }