gate_swap_standard.rs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use std::fmt::Debug;
  2. use std::io::{Error, ErrorKind};
  3. use rust_decimal::Decimal;
  4. use rust_decimal::prelude::FromPrimitive;
  5. use serde::{Deserialize, Serialize};
  6. use crate::gate_swap::gate_swap_rest::{get_market, get_trades};
  7. use crate::struct_standard::{Market, Trades};
  8. use crate::utils::utils::format_symbol;
  9. #[derive(Debug, Deserialize, Serialize)]
  10. struct SwapTrades {
  11. id: i64,
  12. contract: String,
  13. create_time: f64,
  14. create_time_ms: f64,
  15. size: Decimal,
  16. price: String,
  17. }
  18. pub(crate) async fn standard_trades(symbol: &str, start_at: &str, end_at: &str, ct_val: Option<Decimal>) -> Result<Vec<Trades>, Error> {
  19. let symbol_fmt = format_symbol(symbol, "_");
  20. let res_data = get_trades(&symbol_fmt, start_at, end_at).await;
  21. if res_data.code == "200" {
  22. let res_data_str = res_data.data;
  23. let mut trades_list: Vec<SwapTrades> = serde_json::from_str(&res_data_str).unwrap();
  24. trades_list.sort_by(|a, b| (a.id).cmp(&b.id));
  25. let result = trades_list.iter().map(|item| {
  26. Trades {
  27. id: item.id.to_string(),
  28. symbol: item.contract.clone(),
  29. create_time: (item.create_time_ms * 1000.0).to_string(),
  30. size: (item.size * ct_val.unwrap_or(Decimal::ONE)).to_string(),
  31. price: item.price.clone(),
  32. }
  33. }).collect();
  34. Ok(result)
  35. } else {
  36. Err(Error::new(ErrorKind::Other, res_data.to_string()))
  37. }
  38. }
  39. #[derive(Debug, Deserialize, Serialize)]
  40. struct SwapMarket {
  41. name: String,
  42. order_price_round: Decimal,
  43. order_size_min: Decimal,
  44. order_size_max: Decimal,
  45. quanto_multiplier: Decimal,
  46. }
  47. pub(crate) async fn standard_market(symbol: &str) -> Result<Market, Error> {
  48. let symbol_fmt = format_symbol(symbol, "_");
  49. let res_data = get_market().await;
  50. if res_data.code == "200" {
  51. let res_data_str = res_data.data;
  52. let market_list: Vec<SwapMarket> = serde_json::from_str(&res_data_str).unwrap();
  53. let market = market_list.iter().find(|item| item.name == symbol_fmt).unwrap();
  54. let name_array: Vec<&str> = market.name.split("_").collect();
  55. let tick_size = market.order_price_round;
  56. let amount_size = market.order_size_min * market.quanto_multiplier;
  57. let min_notional = market.order_size_min * market.quanto_multiplier;
  58. let max_notional = market.order_size_max * market.quanto_multiplier;
  59. let result = Market {
  60. symbol: market.name.clone(),
  61. base_asset: name_array[0].to_string(),
  62. quote_asset: name_array[1].to_string(),
  63. tick_size,
  64. amount_size,
  65. price_precision: Decimal::from_u32(tick_size.scale()).unwrap(),
  66. amount_precision: Decimal::from_u32(amount_size.scale()).unwrap(),
  67. min_qty: market.order_size_min,
  68. max_qty: market.order_size_max,
  69. min_notional,
  70. max_notional,
  71. ct_val: market.quanto_multiplier,
  72. };
  73. Ok(result)
  74. } else {
  75. Err(Error::new(ErrorKind::Other, res_data.to_string()))
  76. }
  77. }