瀏覽代碼

解决订单状态识别问题。

skyfffire 2 年之前
父節點
當前提交
a6c5b58ac3
共有 4 個文件被更改,包括 29 次插入13 次删除
  1. 1 1
      src/quant_libs.rs
  2. 11 7
      standard/src/kucoin_handle.rs
  3. 14 5
      standard/src/kucoin_swap.rs
  4. 3 0
      strategy/src/exchange_disguise.rs

+ 1 - 1
src/quant_libs.rs

@@ -46,7 +46,7 @@ pub async fn init(params: Params, ws_running: Arc<AtomicBool>, running: Arc<Atom
 
             match order_receiver.recv().await {
                 Some(order) => {
-                    {
+                    if order.status != "NULL" {
                         let mut quant = order_handler_quant_arc.lock().await;
 
                         let order_info = OrderInfo {

+ 11 - 7
standard/src/kucoin_handle.rs

@@ -96,22 +96,26 @@ pub fn handle_order(res_data: ResponseData, amount_size: Decimal) -> SpecialOrde
     }
 }
 
+// ws处理
 pub fn format_order_item(order: serde_json::Value, amount_size: Decimal) -> Order {
     let price = Decimal::from_str(order["price"].as_str().unwrap()).unwrap();
     let size = Decimal::from_str(order["size"].as_str().unwrap()).unwrap();
     let status = order["status"].as_str().unwrap_or("");
+    let type_ = order["type"].as_str().unwrap_or("");
     let filled_size = Decimal::from_str(order["filledSize"].as_str().unwrap()).unwrap();
 
-    let avg_price;
-    if status == "match" {
-        avg_price = Decimal::from_str(order["matchPrice"].as_str().unwrap_or("-1")).unwrap();
-    } else {
-        avg_price = price;
-    };
+    let avg_price = price;
 
     let amount = size * amount_size;
     let deal_amount = filled_size * amount_size;
-    let custom_status = if ["done", "match"].contains(&status) { "REMOVE".to_string() } else if status == "open" { "NEW".to_string() } else { panic!("Kucoin:格式化订单状态错误!\nformat_order_item:status={:?}", status); };
+    let custom_status;
+     if ["filled", "canceled"].contains(&type_) {
+         custom_status = "REMOVE".to_string();
+    } else if ["open"].contains(&status) {
+         custom_status = "NEW".to_string();
+    } else {
+         custom_status = "NULL".to_string();
+    }
     Order {
         id: order["orderId"].as_str().unwrap().to_string(),
         custom_id: order["clientOid"].as_str().unwrap().to_string(),

+ 14 - 5
standard/src/kucoin_swap.rs

@@ -8,7 +8,7 @@ use futures::TryStreamExt;
 use rust_decimal::Decimal;
 use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
 use rust_decimal_macros::dec;
-use serde_json::{json};
+use serde_json::{json, Value};
 use tracing::{error};
 use exchanges::kucoin_swap_rest::KucoinSwapRest;
 use crate::exchange::ExchangeEnum;
@@ -363,8 +363,9 @@ impl Platform for KucoinSwap {
                                 Ok(order) => {
                                     result_sd.send(order).await.unwrap();
                                 }
-                                Err(_) => {
-                                    panic!("撤单失败,而且查单也失败了,kucoin_swap,oid={}, cid={}。", order_id.clone(), custom_id.clone());
+                                Err(query_err) => {
+                                    error!(?query_err);
+                                    error!("撤单失败,而且查单也失败了,kucoin_swap,oid={}, cid={}。", order_id.clone(), custom_id.clone());
                                 }
                             }
                             err_sd.send(error).await.unwrap();
@@ -438,7 +439,7 @@ impl Platform for KucoinSwap {
     }
 }
 
-pub fn format_order_item(order: serde_json::Value, amount_size: Decimal) -> Order {
+pub fn format_order_item(order: Value, amount_size: Decimal) -> Order {
     let price = Decimal::from_str(order["price"].as_str().unwrap()).unwrap();
     let size = Decimal::from_str(&order["size"].to_string()).unwrap();
     let status = order["status"].as_str().unwrap_or("");
@@ -448,7 +449,15 @@ pub fn format_order_item(order: serde_json::Value, amount_size: Decimal) -> Orde
     let amount = size * amount_size;
     let deal_amount = filled_size * amount_size;
     let avg_price = if deal_amount.is_zero() { dec!(0) } else { filled_value / deal_amount };
-    let custom_status = if ["done", "match"].contains(&status) { "REMOVE".to_string() } else if status == "open" { "NEW".to_string() } else { panic!("Kucoin:格式化订单状态错误!\nformat_order_item:status={:?}", status); };
+    let custom_status;
+    if ["cancelled", "closed", "finished"].contains(&status) {
+        custom_status = "REMOVE".to_string();
+    } else if status == "open" {
+        custom_status = "NEW".to_string();
+    } else {
+        custom_status = "NULL".to_string();
+    };
+
     Order {
         id: order["id"].as_str().unwrap().to_string(),
         custom_id: order["clientOid"].as_str().unwrap().to_string(),

+ 3 - 0
strategy/src/exchange_disguise.rs

@@ -254,6 +254,9 @@ async fn kucoin_swap_run(bool_v1 :Arc<AtomicBool>, type_num: i8, quant_arc: Arc<
                         let orders = standard::handle_info::HandleSwapInfo::handle_order(KucoinSwap, data.clone(), multiplier);
                         let mut order_infos:Vec<OrderInfo> = Vec::new();
                         for order in orders.order {
+                            if order.status == "NULL" {
+                                continue;
+                            }
                             let order_info = OrderInfo {
                                 symbol: "".to_string(),
                                 amount: order.amount.abs(),