Преглед на файлове

※※※1.修改kucoin BTC映射XBT,2.修改gate处理数据前未转换为大写

DESKTOP-F4JN2J4\Citrus_limon преди 2 години
родител
ревизия
c350fccaf2
променени са 6 файла, в които са добавени 66 реда и са изтрити 28 реда
  1. 1 2
      standard/src/gate_handle.rs
  2. 9 6
      standard/src/gate_swap.rs
  3. 1 1
      standard/src/kucoin_handle.rs
  4. 35 18
      standard/src/kucoin_swap.rs
  5. 19 0
      standard/src/utils.rs
  6. 1 1
      standard/tests/kucoin_swap_test.rs

+ 1 - 2
standard/src/gate_handle.rs

@@ -10,10 +10,9 @@ use crate::handle_info::HandleSwapInfo;
 
 // 处理账号信息
 pub fn handle_account_info(res_data: ResponseData, symbol: String) -> Account {
-    let symbol_format = symbol.to_uppercase();
     let res_data_str = res_data.data;
     let res_data_json: Vec<serde_json::Value> = serde_json::from_str(&res_data_str).unwrap();
-    format_account_info(res_data_json, symbol_format)
+    format_account_info(res_data_json, symbol)
 }
 
 pub fn format_account_info(data: Vec<serde_json::Value>, symbol: String) -> Account {

+ 9 - 6
standard/src/gate_swap.rs

@@ -184,12 +184,13 @@ impl Platform for GateSwap {
     }
 
     async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error> {
-        let symbol_array: Vec<&str> = symbol.split("_").collect();
+        let symbol_upper = symbol.to_uppercase();
+        let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let res_data = self.request.get_ticker(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
             let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
-            let ticker_info = res_data_json.iter().find(|item| item["contract"].as_str().unwrap() == symbol);
+            let ticker_info = res_data_json.iter().find(|item| item["contract"].as_str().unwrap() == symbol_upper);
             match ticker_info {
                 None => {
                     error!("Gate:获取Ticker信息错误!\nget_ticker:res_data={:?}", res_data_str);
@@ -262,12 +263,13 @@ impl Platform for GateSwap {
     }
 
     async fn get_market_symbol(&mut self, symbol: String) -> Result<Market, Error> {
-        let symbol_array: Vec<&str> = symbol.split("_").collect();
+        let symbol_upper = symbol.to_uppercase();
+        let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let res_data = self.request.get_market_details(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
             let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
-            let market_info = res_data_json.iter().find(|item| item["name"].as_str().unwrap() == symbol);
+            let market_info = res_data_json.iter().find(|item| item["name"].as_str().unwrap() == symbol_upper);
             match market_info {
                 None => {
                     error!("Gate:获取Market信息错误!\nget_market:market_info={:?}", market_info);
@@ -383,10 +385,11 @@ impl Platform for GateSwap {
     }
 
     async fn take_order_symbol(&mut self, symbol: String, ct_val: Decimal, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
-        let symbol_array: Vec<&str> = symbol.split("_").collect();
+        let symbol_upper = symbol.to_uppercase();
+        let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let mut params = json!({
             "text": format!("t-{}", custom_id),
-            "contract": self.symbol.to_string(),
+            "contract": symbol_upper.to_string(),
             "price": price.to_string(),
         });
         let size = (amount / ct_val).floor();

+ 1 - 1
standard/src/kucoin_handle.rs

@@ -4,7 +4,7 @@ use rust_decimal::prelude::FromPrimitive;
 use rust_decimal_macros::dec;
 use exchanges::response_base::ResponseData;
 use global::trace_stack::TraceStack;
-use crate::{Account, MarketOrder, Order, Position, PositionModeEnum, SpecialDepth, SpecialOrder, SpecialTicker};
+use crate::{Account, MarketOrder, Order, Position, PositionModeEnum, SpecialDepth, SpecialOrder, SpecialTicker, utils};
 use crate::exchange::ExchangeEnum;
 use crate::handle_info::HandleSwapInfo;
 

+ 35 - 18
standard/src/kucoin_swap.rs

@@ -90,7 +90,8 @@ impl Platform for KucoinSwap {
     }
     // 获取账号信息
     async fn get_account(&mut self) -> Result<Account, Error> {
-        let symbol_array: Vec<&str> = self.symbol.split("_").collect();
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_array: Vec<&str> = symbol_mapper.split("_").collect();
         let res_data = self.request.get_account(symbol_array[1].to_string()).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -119,7 +120,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_position(&mut self) -> Result<Vec<Position>, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let ct_val = self.market.ct_val;
         let res_data = self.request.get_position(symbol_format).await;
         if res_data.code == "200" {
@@ -133,7 +135,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
-        let symbol_array: Vec<&str> = self.symbol.split("_").collect();
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_array: Vec<&str> = symbol_mapper.split("_").collect();
         let res_data = self.request.get_positions(symbol_array[1].to_string()).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -149,7 +152,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_ticker(&mut self) -> Result<Ticker, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let res_data = self.request.get_ticker(symbol_format).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -172,7 +176,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper, ""));
         let res_data = self.request.get_ticker(symbol_format).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -195,11 +200,13 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_market(&mut self) -> Result<Market, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let res_data = self.request.get_market_details().await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
             let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
+
             let market_info = res_data_json.iter().find(|item| item["symbol"].as_str().unwrap() == symbol_format);
             match market_info {
                 None => {
@@ -208,7 +215,9 @@ impl Platform for KucoinSwap {
                 }
                 Some(value) => {
                     let base_asset = value["baseCurrency"].as_str().unwrap_or("").to_string();
+                    let base_asset_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, base_asset.as_str());
                     let quote_asset = value["quoteCurrency"].as_str().unwrap_or("").to_string();
+                    let quote_asset_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, quote_asset.as_str());
                     let tick_size = Decimal::from_f64(value["tickSize"].as_f64().unwrap()).unwrap();
                     let min_qty = Decimal::from_f64(value["lotSize"].as_f64().unwrap()).unwrap();
                     let ct_val = Decimal::from_f64(value["multiplier"].as_f64().unwrap()).unwrap();
@@ -219,9 +228,9 @@ impl Platform for KucoinSwap {
                     let min_notional = min_qty * ct_val;
 
                     let result = Market {
-                        symbol: format!("{}_{}", base_asset, quote_asset),
-                        base_asset,
-                        quote_asset,
+                        symbol: format!("{}_{}", base_asset_mapper, quote_asset_mapper),
+                        base_asset: base_asset_mapper,
+                        quote_asset: quote_asset_mapper,
                         tick_size,
                         amount_size,
                         price_precision,
@@ -241,7 +250,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_market_symbol(&mut self, symbol: String) -> Result<Market, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let res_data = self.request.get_market_details().await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -254,7 +264,9 @@ impl Platform for KucoinSwap {
                 }
                 Some(value) => {
                     let base_asset = value["baseCurrency"].as_str().unwrap_or("").to_string();
+                    let base_asset_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, base_asset.as_str());
                     let quote_asset = value["quoteCurrency"].as_str().unwrap_or("").to_string();
+                    let quote_asset_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, quote_asset.as_str());
                     let tick_size = Decimal::from_f64(value["tickSize"].as_f64().unwrap()).unwrap();
                     let min_qty = Decimal::from_f64(value["lotSize"].as_f64().unwrap()).unwrap();
                     let ct_val = Decimal::from_f64(value["multiplier"].as_f64().unwrap()).unwrap();
@@ -265,9 +277,9 @@ impl Platform for KucoinSwap {
                     let min_notional = min_qty * ct_val;
 
                     let result = Market {
-                        symbol: format!("{}_{}", base_asset, quote_asset),
-                        base_asset,
-                        quote_asset,
+                        symbol: format!("{}_{}", base_asset_mapper, quote_asset_mapper),
+                        base_asset: base_asset_mapper,
+                        quote_asset: quote_asset_mapper,
                         tick_size,
                         amount_size,
                         price_precision,
@@ -300,7 +312,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let ct_val = self.market.ct_val;
         let res_data = self.request.get_orders(status.to_string(), symbol_format.clone()).await;
         if res_data.code == "200" {
@@ -316,7 +329,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let ct_val = self.market.ct_val;
         let mut params = json!({
             "clientOid": custom_id,
@@ -367,7 +381,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn take_order_symbol(&mut self, symbol: String, ct_val: Decimal, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let mut params = json!({
             "clientOid": custom_id,
             "symbol": symbol_format,
@@ -444,7 +459,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let res_data = self.request.cancel_orders(symbol_format).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
@@ -503,7 +519,8 @@ impl Platform for KucoinSwap {
     }
 
     async fn set_auto_deposit_status(&mut self, status: bool) -> Result<String, Error> {
-        let symbol_format = format!("{}M", utils::format_symbol(self.symbol.clone(), ""));
+        let symbol_mapper = utils::symbol_mapper(ExchangeEnum::KucoinSwap, self.symbol.as_str());
+        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
         let res_data = self.request.auto_deposit_status(symbol_format, status).await;
         if res_data.code == "200" {
             let res_data_str = &res_data.data;

+ 19 - 0
standard/src/utils.rs

@@ -1,5 +1,6 @@
 use tracing::trace;
 use exchanges::proxy;
+use crate::exchange::ExchangeEnum;
 
 /// 修改交易对连接符号
 /// - `symbol(str)`: 交易对, "BTC_USDT", 默认以下划线传递
@@ -13,4 +14,22 @@ pub fn proxy_handle() {
     if proxy::ParsingDetail::http_enable_proxy() {
         trace!("检测有代理配置,配置走代理");
     }
+}
+
+/// 币种映射器
+#[allow(dead_code)]
+pub fn symbol_mapper(exchange_enum: ExchangeEnum, symbol: &str) -> String {
+    let symbol_upper = symbol.to_uppercase();
+    match exchange_enum {
+        ExchangeEnum::KucoinSwap => {
+            if symbol_upper.contains("BTC") {
+                symbol_upper.replace("BTC", "XBT")
+            } else if symbol_upper.contains("XBT") {
+                symbol_upper.replace("XBT", "BTC")
+            } else { symbol_upper.to_string() }
+        }
+        _ => {
+            symbol_upper.to_string()
+        }
+    }
 }

+ 1 - 1
standard/tests/kucoin_swap_test.rs

@@ -10,7 +10,7 @@ use standard::exchange::{Exchange, ExchangeEnum};
 use standard::{Order, OrderCommand, Platform, utils};
 use crate::exchange_test::{test_new_exchange};
 
-const SYMBOL: &str = "BLZ_USDT";
+const SYMBOL: &str = "BTC_USDT";
 
 // 测试获取Exchange实体
 #[tokio::test]