|
|
@@ -1,113 +1,98 @@
|
|
|
-// use std::str::FromStr;
|
|
|
-// use rust_decimal::Decimal;
|
|
|
-// use rust_decimal_macros::dec;
|
|
|
-// use serde_json::json;
|
|
|
-// use tokio::time::Instant;
|
|
|
-// use tracing::trace;
|
|
|
-// use exchanges::response_base::ResponseData;
|
|
|
-// use global::trace_stack::TraceStack;
|
|
|
-// use crate::{Account, MarketOrder, Order, SpecialDepth, SpecialOrder, SpecialTicker};
|
|
|
-// use crate::exchange::ExchangeEnum;
|
|
|
-// use crate::handle_info::HandleSwapInfo;
|
|
|
-//
|
|
|
-// // 处理账号信息
|
|
|
-// pub fn handle_account_info(res_data: ResponseData, symbol: String) -> Account {
|
|
|
-// let symbol_upper = symbol.to_uppercase();
|
|
|
-// let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
|
|
|
-// let res_data_str = res_data.data;
|
|
|
-// let res_data_json: Vec<serde_json::Value> = serde_json::from_str(&res_data_str).unwrap();
|
|
|
-// let balance_info_default = json!({"available":"0","coin": symbol_array[1],"frozen":"0","limitAvailable":"0","locked":"0","uTime":"0"});
|
|
|
-// let balance_info = res_data_json.iter().find(|&item| item["coin"].as_str().unwrap() == symbol_array[1]).unwrap_or(&balance_info_default);
|
|
|
-// let stocks_info_default = json!({"available":"0","coin": symbol_array[0],"frozen":"0","limitAvailable":"0","locked":"0","uTime":"0"});
|
|
|
-// let stocks_info = res_data_json.iter().find(|&item| item["coin"].as_str().unwrap() == symbol_array[0]).unwrap_or(&stocks_info_default);
|
|
|
-// format_account_info(balance_info.clone(), stocks_info.clone())
|
|
|
-// }
|
|
|
-//
|
|
|
-// pub fn format_account_info(balance_data: serde_json::Value, stocks_data: serde_json::Value) -> Account {
|
|
|
-// let balance_coin = balance_data["coin"].as_str().unwrap().to_string().to_uppercase();
|
|
|
-// let available_balance = Decimal::from_str(balance_data["available"].as_str().unwrap()).unwrap();
|
|
|
-// let frozen_balance = Decimal::from_str(balance_data["frozen"].as_str().unwrap()).unwrap();
|
|
|
-// let balance = available_balance + frozen_balance;
|
|
|
-//
|
|
|
-// let stocks_coin = stocks_data["coin"].as_str().unwrap().to_string().to_uppercase();
|
|
|
-// let available_stocks = Decimal::from_str(stocks_data["available"].as_str().unwrap()).unwrap();
|
|
|
-// let frozen_stocks = Decimal::from_str(stocks_data["frozen"].as_str().unwrap()).unwrap();
|
|
|
-// let stocks = available_stocks + frozen_stocks;
|
|
|
-//
|
|
|
-// Account {
|
|
|
-// coin: format!("{}_{}", stocks_coin, balance_coin),
|
|
|
-// balance,
|
|
|
-// available_balance,
|
|
|
-// frozen_balance,
|
|
|
-// stocks,
|
|
|
-// available_stocks,
|
|
|
-// frozen_stocks,
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 处理order信息
|
|
|
-// pub fn handle_order(res_data: ResponseData, ct_val: Decimal) -> SpecialOrder {
|
|
|
-// let res_data_str = res_data.data;
|
|
|
-// let res_data_json: Vec<serde_json::Value> = serde_json::from_str(&*res_data_str).unwrap();
|
|
|
-// let mut order_info = Vec::new();
|
|
|
-// for item in res_data_json.iter() {
|
|
|
-// order_info.push(format_order_item(item.clone(), ct_val));
|
|
|
-// }
|
|
|
-// trace!(?order_info);
|
|
|
-// SpecialOrder {
|
|
|
-// name: res_data.label,
|
|
|
-// order: order_info,
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 处理订单信息
|
|
|
-// pub fn format_order_item(order: serde_json::Value, ct_val: Decimal) -> Order {
|
|
|
-// let price = Decimal::from_str(order["price"].as_str().unwrap_or(order["priceAvg"].as_str().unwrap())).unwrap();
|
|
|
-// let size = Decimal::from_str(order["size"].as_str().unwrap()).unwrap();
|
|
|
-// let status = order["status"].as_str().unwrap_or("");
|
|
|
-// let acc_base_volume = Decimal::from_str(order["accBaseVolume"].as_str().unwrap()).unwrap();
|
|
|
-//
|
|
|
-// let avg_price = Decimal::from_str(order["priceAvg"].as_str().unwrap()).unwrap();
|
|
|
-//
|
|
|
-// let amount = size * ct_val;
|
|
|
-// let deal_amount = acc_base_volume * ct_val;
|
|
|
-// let custom_status = if ["filled", "cancelled"].contains(&status) {
|
|
|
-// "REMOVE".to_string()
|
|
|
-// } else if ["init", "live", "new", "partially_filled"].contains(&status) {
|
|
|
-// "NEW".to_string()
|
|
|
-// } else {
|
|
|
-// "NULL".to_string()
|
|
|
-// };
|
|
|
-// Order {
|
|
|
-// id: order["orderId"].as_str().unwrap().to_string(),
|
|
|
-// custom_id: order["clientOid"].as_str().unwrap().to_string(),
|
|
|
-// price,
|
|
|
-// amount,
|
|
|
-// deal_amount,
|
|
|
-// avg_price,
|
|
|
-// status: custom_status,
|
|
|
-// order_type: order["orderType"].as_str().unwrap().to_string(),
|
|
|
-// trace_stack: TraceStack::new(0, Instant::now()).on_special("89 bitget_spot_handle".to_string()),
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 处理特殊深度数据
|
|
|
+use std::str::FromStr;
|
|
|
+use rust_decimal::Decimal;
|
|
|
+use tokio::time::Instant;
|
|
|
+use exchanges::response_base::ResponseData;
|
|
|
+use global::trace_stack::TraceStack;
|
|
|
+use crate::{Account, MarketOrder, Order, SpecialOrder};
|
|
|
+
|
|
|
+// 处理账号信息
|
|
|
+pub fn handle_account_info(response: &ResponseData, _symbol: &String) -> Account {
|
|
|
+ let mut rst = Account::new();
|
|
|
+
|
|
|
+ for data in response.data.as_array().unwrap() {
|
|
|
+ if data["marginCoin"].as_str().unwrap() != "USDT" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // 格式化account信息
|
|
|
+ let mut account = Account {
|
|
|
+ coin: data["marginCoin"].to_string(),
|
|
|
+ balance: Decimal::from_str(data["accountEquity"].as_str().unwrap()).unwrap(),
|
|
|
+ available_balance: Decimal::from_str(data["available"].as_str().unwrap()).unwrap(),
|
|
|
+ frozen_balance: Default::default(),
|
|
|
+ stocks: Default::default(),
|
|
|
+ available_stocks: Default::default(),
|
|
|
+ frozen_stocks: Default::default(),
|
|
|
+ };
|
|
|
+ account.frozen_balance = account.balance - account.available_balance;
|
|
|
+
|
|
|
+ rst = account
|
|
|
+ }
|
|
|
+
|
|
|
+ return rst;
|
|
|
+}
|
|
|
+
|
|
|
+// 处理order信息
|
|
|
+pub fn handle_order(res_data: ResponseData, ct_val: Decimal) -> SpecialOrder {
|
|
|
+ let res_data_json = res_data.data.as_array().unwrap();
|
|
|
+ let mut order_info = Vec::new();
|
|
|
+ for item in res_data_json.iter() {
|
|
|
+ order_info.push(format_order_item(item.clone(), ct_val));
|
|
|
+ }
|
|
|
+ SpecialOrder {
|
|
|
+ name: res_data.label,
|
|
|
+ order: order_info,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 处理订单信息
|
|
|
+pub fn format_order_item(order: serde_json::Value, ct_val: Decimal) -> Order {
|
|
|
+ let price = Decimal::from_str(order["price"].as_str().unwrap_or(order["priceAvg"].as_str().unwrap())).unwrap();
|
|
|
+ let size = Decimal::from_str(order["size"].as_str().unwrap()).unwrap();
|
|
|
+ let status = order["status"].as_str().unwrap_or("");
|
|
|
+ let acc_base_volume = Decimal::from_str(order["accBaseVolume"].as_str().unwrap()).unwrap();
|
|
|
+
|
|
|
+ let avg_price = Decimal::from_str(order["priceAvg"].as_str().unwrap()).unwrap();
|
|
|
+
|
|
|
+ let amount = size * ct_val;
|
|
|
+ let deal_amount = acc_base_volume * ct_val;
|
|
|
+ let custom_status = if ["filled", "cancelled"].contains(&status) {
|
|
|
+ "REMOVE".to_string()
|
|
|
+ } else if ["init", "live", "new", "partially_filled"].contains(&status) {
|
|
|
+ "NEW".to_string()
|
|
|
+ } else {
|
|
|
+ "NULL".to_string()
|
|
|
+ };
|
|
|
+ Order {
|
|
|
+ id: order["orderId"].as_str().unwrap().to_string(),
|
|
|
+ custom_id: order["clientOid"].as_str().unwrap().to_string(),
|
|
|
+ price,
|
|
|
+ amount,
|
|
|
+ deal_amount,
|
|
|
+ avg_price,
|
|
|
+ status: custom_status,
|
|
|
+ order_type: order["orderType"].as_str().unwrap().to_string(),
|
|
|
+ trace_stack: TraceStack::new(0, Instant::now()).on_special("84 bitget_swap_handle".to_string()),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 格式化深度信息
|
|
|
+pub fn format_depth_items(value: serde_json::Value) -> Vec<MarketOrder> {
|
|
|
+ let mut depth_items: Vec<MarketOrder> = vec![];
|
|
|
+ for value in value.as_array().unwrap() {
|
|
|
+ depth_items.push(MarketOrder {
|
|
|
+ price: Decimal::from_str(value[0].as_str().unwrap()).unwrap(),
|
|
|
+ amount: Decimal::from_str(value[1].as_str().unwrap()).unwrap(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return depth_items;
|
|
|
+}
|
|
|
+
|
|
|
+// 处理特殊深度数据
|
|
|
// pub fn handle_special_depth(res_data: ResponseData) -> SpecialDepth {
|
|
|
-// HandleSwapInfo::handle_special_depth(ExchangeEnum::BitgetSpot, res_data)
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 格式化深度信息
|
|
|
-// pub fn format_depth_items(value: serde_json::Value) -> Vec<MarketOrder> {
|
|
|
-// let mut depth_items: Vec<MarketOrder> = vec![];
|
|
|
-// for value in value.as_array().unwrap() {
|
|
|
-// depth_items.push(MarketOrder {
|
|
|
-// price: Decimal::from_str(value[0].as_str().unwrap()).unwrap(),
|
|
|
-// amount: Decimal::from_str(value[1].as_str().unwrap()).unwrap(),
|
|
|
-// })
|
|
|
-// }
|
|
|
-// return depth_items;
|
|
|
+// HandleSwapInfo::handle_special_depth(ExchangeEnum::BitgetSwap, res_data)
|
|
|
// }
|
|
|
-//
|
|
|
+
|
|
|
// // 处理特殊Ticker信息
|
|
|
// pub fn handle_special_ticker(res_data: ResponseData) -> SpecialDepth {
|
|
|
// let res_data_str = res_data.data;
|