Quellcode durchsuchen

去除干扰平仓,加入干扰平仓(强)

skyffire vor 10 Monaten
Ursprung
Commit
3b0f332ce0
2 geänderte Dateien mit 25 neuen und 19 gelöschten Zeilen
  1. 2 2
      global/src/params.rs
  2. 23 17
      strategy/src/predictor.rs

+ 2 - 2
global/src/params.rs

@@ -31,7 +31,7 @@ pub struct Params {
     // 平仓
     pub close: Decimal,
     // 干扰平仓
-    pub is_interfere: bool,
+    pub is_strong_interfere: bool,
     // 秒级观测时间
     pub second_observation_time: Decimal,
     // 杠杆大小
@@ -95,7 +95,7 @@ impl Params {
             open: Decimal::try_from(json_value["open"].as_f64().unwrap_or_default()).unwrap(),
             open_activate: Decimal::try_from(json_value["open_activate"].as_f64().unwrap_or_default()).unwrap(),
             close: Decimal::try_from(json_value["close"].as_f64().unwrap_or_default()).unwrap(),
-            is_interfere: json_value["is_interfere"].as_bool().unwrap(),
+            is_strong_interfere: json_value["is_strong_interfere"].as_bool().unwrap(),
             second_observation_time: Decimal::try_from(json_value["second_observation_time"].as_f64().unwrap()).unwrap(),
             lever_rate: Decimal::try_from(json_value["lever_rate"].as_f64().unwrap_or_default()).unwrap(),
             ref_exchange: vec![json_value["ref_exchange"].as_str().unwrap().to_string()],                   // 兼容新版本与老版本

+ 23 - 17
strategy/src/predictor.rs

@@ -390,6 +390,9 @@ impl Predictor {
             }
 
             // ============================ 平仓逻辑处理 =======================
+            // close_rate:
+            //  大于0:当前价格在均线之上
+            //  小于0:当前价格在均线之下
             let close_rate = (self.fair_price - self.fair_price_ema_long) / self.fair_price_ema_long;
             // 重置平仓焦点,条件1
             if !self.fair_rate_focus_close.is_zero() && self.inventory.is_zero() {
@@ -411,16 +414,17 @@ impl Predictor {
             if self.fair_rate_focus_close.is_zero() && !self.inventory.is_zero() {
                 // 多单平仓逻辑
                 if self.inventory > Decimal::ZERO && close_rate > Decimal::ZERO {
-                    // 是否干扰平仓
-                    if self.params.is_interfere {
-                        if self.mid_price > self.pos_avg_price {
-                            self.fair_rate_focus_close = close_rate;
-                            self.fair_price_focus_close = self.fair_price;
-                        } else if self.t_diff.is_zero() {
-                            self.fair_rate_focus_close = close_rate;
-                            self.fair_price_focus_close = self.fair_price;
-                        }
+                    // 是否强干扰平仓
+                    let target_price = if self.params.is_strong_interfere {
+                        self.pos_avg_price - self.params.open_activate * self.mid_price * self.t_diff * dec!(0.5)
                     } else {
+                        self.pos_avg_price
+                    };
+
+                    if self.mid_price > target_price {
+                        self.fair_rate_focus_close = close_rate;
+                        self.fair_price_focus_close = self.fair_price;
+                    } else if self.t_diff.is_zero() {
                         self.fair_rate_focus_close = close_rate;
                         self.fair_price_focus_close = self.fair_price;
                     }
@@ -428,15 +432,17 @@ impl Predictor {
 
                 // 空单平仓逻辑
                 if self.inventory < Decimal::ZERO && close_rate < Decimal::ZERO {
-                    if self.params.is_interfere {
-                        if self.mid_price < self.pos_avg_price {
-                            self.fair_rate_focus_close = close_rate;
-                            self.fair_price_focus_close = self.fair_price;
-                        } else if self.t_diff.is_zero() {
-                            self.fair_rate_focus_close = close_rate;
-                            self.fair_price_focus_close = self.fair_price;
-                        }
+                    // 是否强干扰平仓
+                    let target_price = if self.params.is_strong_interfere {
+                        self.pos_avg_price + self.params.open_activate * self.mid_price * self.t_diff * dec!(0.5)
                     } else {
+                        self.pos_avg_price
+                    };
+
+                    if self.mid_price < target_price {
+                        self.fair_rate_focus_close = close_rate;
+                        self.fair_price_focus_close = self.fair_price;
+                    } else if self.t_diff.is_zero() {
                         self.fair_rate_focus_close = close_rate;
                         self.fair_price_focus_close = self.fair_price;
                     }