|
|
@@ -0,0 +1,82 @@
|
|
|
+use std::fmt::Debug;
|
|
|
+use std::io::{Error, ErrorKind};
|
|
|
+use std::str::FromStr;
|
|
|
+use rust_decimal::Decimal;
|
|
|
+use rust_decimal::prelude::FromPrimitive;
|
|
|
+use rust_decimal_macros::dec;
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
+use crate::swap_bitget::bitget_swap_rest::{get_market, get_trades};
|
|
|
+use crate::struct_standard::{Market, Trades};
|
|
|
+use crate::utils::utils::format_symbol;
|
|
|
+
|
|
|
+#[derive(Debug, Deserialize, Serialize)]
|
|
|
+#[serde(rename_all = "camelCase")]
|
|
|
+struct BitGetResponse {
|
|
|
+ code: String,
|
|
|
+ msg: String,
|
|
|
+ request_time: String,
|
|
|
+ data: String,
|
|
|
+}
|
|
|
+
|
|
|
+pub(crate) async fn standard_trades(symbol: &str, start_at: &str, end_at: &str, ct_val: Option<Decimal>) -> Result<Vec<Trades>, Error> {
|
|
|
+ let symbol_fmt = format_symbol(symbol, "_");
|
|
|
+ let res_data = get_trades(&symbol_fmt, start_at, end_at).await;
|
|
|
+ if res_data.code == "200" {
|
|
|
+ let res_data_data: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
|
|
|
+ let mut trades_list = res_data_data["data"].as_array().unwrap_or(&vec![]).clone();
|
|
|
+ trades_list.sort_by(|a, b| (Decimal::from_str(a[0].as_str().unwrap()).unwrap()).cmp(&Decimal::from_str(b[0].as_str().unwrap()).unwrap()));
|
|
|
+ let result = trades_list.iter().map(|item| {
|
|
|
+ Trades {
|
|
|
+ id: item[0].as_str().unwrap().to_string(),
|
|
|
+ data_type: "ticker_bybit".to_string(),
|
|
|
+ symbol: symbol.to_uppercase().to_string(),
|
|
|
+ create_time: item[1].as_str().unwrap().to_string(),
|
|
|
+ size: (Decimal::from_str(item[2].as_str().unwrap()).unwrap() * ct_val.unwrap_or(Decimal::ONE)).to_string(),
|
|
|
+ price: item[3].as_str().unwrap().to_string(),
|
|
|
+ side: if Decimal::from_str(item[3].as_str().unwrap()).unwrap() > dec!(0) { "BUY".to_string() } else { "SELL".to_string() },
|
|
|
+ is_effect: true,
|
|
|
+ }
|
|
|
+ }).collect();
|
|
|
+ Ok(result)
|
|
|
+ } else {
|
|
|
+ Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(Debug, Deserialize, Serialize)]
|
|
|
+#[serde(rename_all = "camelCase")]
|
|
|
+struct SwapMarket {
|
|
|
+ symbol: String,
|
|
|
+ base_coin: String,
|
|
|
+ quote_coin: String,
|
|
|
+ price_place: Decimal,
|
|
|
+ volume_place: Decimal,
|
|
|
+}
|
|
|
+
|
|
|
+pub(crate) async fn standard_market(symbol: &str) -> Result<Market, Error> {
|
|
|
+ let symbol_fmt = format_symbol(symbol, "");
|
|
|
+ let res_data = get_market(&symbol_fmt).await;
|
|
|
+ if res_data.code == "200" {
|
|
|
+ let res_data_data: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
|
|
|
+ let market_list: Vec<SwapMarket> = serde_json::from_str(&res_data_data["data"].to_string()).unwrap();
|
|
|
+ let market = market_list.iter().find(|item| item.symbol == symbol_fmt).unwrap();
|
|
|
+
|
|
|
+ let result = Market {
|
|
|
+ symbol: market.symbol.clone(),
|
|
|
+ base_asset: market.base_coin.clone(),
|
|
|
+ quote_asset: market.quote_coin.clone(),
|
|
|
+ tick_size: market.price_place,
|
|
|
+ amount_size: market.volume_place,
|
|
|
+ price_precision: Decimal::from_u32(market.price_place.scale()).unwrap(),
|
|
|
+ amount_precision: Decimal::from_u32(market.volume_place.scale()).unwrap(),
|
|
|
+ min_qty: Decimal::NEGATIVE_ONE,
|
|
|
+ max_qty: Decimal::NEGATIVE_ONE,
|
|
|
+ min_notional: Decimal::NEGATIVE_ONE,
|
|
|
+ max_notional: Decimal::NEGATIVE_ONE,
|
|
|
+ ct_val: Decimal::ONE,
|
|
|
+ };
|
|
|
+ Ok(result)
|
|
|
+ } else {
|
|
|
+ Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
|
+ }
|
|
|
+}
|