Selaa lähdekoodia

v3.2.6: 修复bybit_swap的一个rest接口格式化问题。

skyffire 7 kuukautta sitten
vanhempi
commit
53b126e0e5
2 muutettua tiedostoa jossa 97 lisäystä ja 25 poistoa
  1. 78 8
      standard/src/bybit_swap.rs
  2. 19 17
      strategy/src/core.rs

+ 78 - 8
standard/src/bybit_swap.rs

@@ -79,7 +79,7 @@ impl BybitSwap {
             }
         }
         // 获取市场信息
-        bybit_swap.market = BybitSwap::get_market(&mut bybit_swap).await.unwrap_or(bybit_swap.market);
+        bybit_swap.market = BybitSwap::get_market(&mut bybit_swap).await.unwrap();
         bybit_swap
     }
 }
@@ -764,13 +764,10 @@ pub fn format_order_item(order: Value, ct_val: Decimal) -> Order {
     let mut deal_amount = Decimal::ZERO;
     let mut avg_price = Decimal::ZERO;
 
-    let right_str = order["cumExecQty"].to_string();
-    let size_str = order["qty"].to_string();
-
-    if !order.get("qty").is_some() {
-        size = Decimal::from_str(size_str.as_str()).unwrap();
+    if order.get("qty").is_some() {
+        size = Decimal::from_str(order["qty"].as_str().unwrap()).unwrap();
         let right_val = Decimal::from_str(order["cumExecValue"].as_str().unwrap()).unwrap();
-        let right = Decimal::from_str(right_str.as_str()).unwrap();
+        let right = Decimal::from_str(order["cumExecQty"].as_str().unwrap()).unwrap();
         if right != Decimal::ZERO {
             avg_price = right_val / right;
         }
@@ -778,7 +775,11 @@ pub fn format_order_item(order: Value, ct_val: Decimal) -> Order {
     }
 
     let amount = size * ct_val;
-    let custom_status = if status == "Filled" || status == "Cancelled" { "REMOVE".to_string() } else if status == "New" { "NEW".to_string() } else {
+    let custom_status = if status == "Filled" || status == "Cancelled" {
+        "REMOVE".to_string()
+    } else if status == "New" {
+        "NEW".to_string()
+    } else {
         "NULL".to_string()
     };
     let rst_order = Order {
@@ -793,4 +794,73 @@ pub fn format_order_item(order: Value, ct_val: Decimal) -> Order {
         trace_stack: TraceStack::new(0, Instant::now()).on_special("688 trace_stack".to_string()),
     };
     return rst_order;
+}
+
+#[cfg(test)]
+mod tests {
+    use global::log_utils::init_log_with_info;
+    use super::*;
+
+    #[test]
+    fn test_format_order_item() {
+        let _g = init_log_with_info();
+
+        // 准备测试数据
+        let json_str = r#"{
+            "avgPrice": "2.0575",
+            "blockTradeId": "",
+            "cancelType": "UNKNOWN",
+            "closeOnTrigger": false,
+            "createType": "CreateByUser",
+            "createdTime": "1743419403716",
+            "cumExecFee": "0.004115",
+            "cumExecQty": "10",
+            "cumExecValue": "20.575",
+            "isLeverage": "",
+            "lastPriceOnCreated": "2.0573",
+            "leavesQty": "0",
+            "leavesValue": "0",
+            "marketUnit": "",
+            "orderId": "ed33e19d-5346-4690-954f-f6bec6c24ffb",
+            "orderIv": "",
+            "orderLinkId": "t-1652550550bybit",
+            "orderStatus": "Filled",
+            "orderType": "Limit",
+            "placeType": "",
+            "positionIdx": 0,
+            "price": "2.0575",
+            "qty": "10",
+            "reduceOnly": true,
+            "rejectReason": "EC_NoError",
+            "side": "Sell",
+            "slLimitPrice": "0",
+            "slTriggerBy": "",
+            "smpGroup": 0,
+            "smpOrderId": "",
+            "smpType": "None",
+            "stopLoss": "",
+            "stopOrderType": "",
+            "symbol": "XRPUSDT",
+            "takeProfit": "",
+            "timeInForce": "GTC",
+            "tpLimitPrice": "0",
+            "tpTriggerBy": "",
+            "tpslMode": "",
+            "triggerBy": "",
+            "triggerDirection": 0,
+            "triggerPrice": "",
+            "updatedTime": "1743419403736"
+        }"#;
+
+        // 解析JSON字符串为Value对象
+        let order_value: Value = serde_json::from_str(json_str).unwrap();
+
+        // 创建一个Decimal值作为测试参数
+        let ct_val = Decimal::from_str("1").unwrap();
+
+        // 调用被测试的函数
+        let order = format_order_item(order_value, ct_val);
+
+        println!("{:#?}", order);
+    }
 }

+ 19 - 17
strategy/src/core.rs

@@ -655,22 +655,24 @@ impl Core {
     }
 
     pub async fn on_trade(&mut self, trade: &Trade, _name_ref: &String, trace_stack: &mut TraceStack, index: usize) {
-        self.predictor.on_trade(trade, index).await;
-
-        // 产生交易信号
-        if trade.value > Decimal::ONE_HUNDRED {
-            let mut orders = self.strategy.do_strategy(&mut self.predictor, &self.local_orders, &self.local_position, &self.local_coin, &self.local_cash);
-            trace_stack.on_after_strategy();
+        if self.mode_signal == 0 && self.ready == 1 {
+            self.predictor.on_trade(trade, index).await;
 
-            if orders.is_not_empty() {
-                let mut platform_rest_fb = self.platform_rest.clone_box();
-                // 先更新本地记录再发单。
-                self._update_local_orders(&mut orders);
-                // info!("订单指令:{:?}", orders);
-                let mut ts = trace_stack.clone();
-                spawn(async move {
-                    platform_rest_fb.command_order(&mut orders, &mut ts).await;
-                });
+            // 产生交易信号
+            if trade.value > Decimal::ONE_HUNDRED {
+                let mut orders = self.strategy.do_strategy(&mut self.predictor, &self.local_orders, &self.local_position, &self.local_coin, &self.local_cash);
+                trace_stack.on_after_strategy();
+
+                if orders.is_not_empty() {
+                    let mut platform_rest_fb = self.platform_rest.clone_box();
+                    // 先更新本地记录再发单。
+                    self._update_local_orders(&mut orders);
+                    // info!("订单指令:{:?}", orders);
+                    let mut ts = trace_stack.clone();
+                    spawn(async move {
+                        platform_rest_fb.command_order(&mut orders, &mut ts).await;
+                    });
+                }
             }
         }
     }
@@ -1716,7 +1718,7 @@ pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
                         let mut platform_rest_fb = core.platform_rest.clone_box();
                         // 获取信号
                         if core.mode_signal > 20 {
-                            // 先执行onExit
+                            // 先判断onExit
                             let mut predictor = core.predictor.clone();
                             let local_orders = core.local_orders.clone();
                             let local_position = core.local_position.clone();
@@ -1734,7 +1736,7 @@ pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
                                 });
                             }
                         } else {
-                            // 再执行onSleep
+                            // 再判断onSleep
                             let mut predictor = core.predictor.clone();
                             let local_orders = core.local_orders.clone();
                             let local_position = core.local_position.clone();