Pārlūkot izejas kodu

干扰平仓逻辑参数化

skyfffire 10 mēneši atpakaļ
vecāks
revīzija
391bfe7469
2 mainītis faili ar 28 papildinājumiem un 4 dzēšanām
  1. 3 0
      global/src/params.rs
  2. 25 4
      strategy/src/predictor.rs

+ 3 - 0
global/src/params.rs

@@ -30,6 +30,8 @@ pub struct Params {
     pub close_activate: Decimal,
     // 平仓
     pub close: Decimal,
+    // 干扰平仓
+    pub is_interfere: bool,
     // 秒级观测时间
     pub second_observation_time: Decimal,
     // 杠杆大小
@@ -93,6 +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(),
             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()],                   // 兼容新版本与老版本

+ 25 - 4
strategy/src/predictor.rs

@@ -411,14 +411,35 @@ impl Predictor {
             if self.fair_rate_focus_close.is_zero() && !self.inventory.is_zero() {
                 // 多单平仓逻辑
                 if self.inventory > Decimal::ZERO && close_rate > Decimal::ZERO {
-                    self.fair_rate_focus_close = close_rate;
-                    self.fair_price_focus_close = self.fair_price;
+                    // 是否干扰平仓
+                    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;
+                        }
+                    } else {
+                        self.fair_rate_focus_close = close_rate;
+                        self.fair_price_focus_close = self.fair_price;
+                    }
                 }
 
                 // 空单平仓逻辑
                 if self.inventory < Decimal::ZERO && close_rate < Decimal::ZERO {
-                    self.fair_rate_focus_close = close_rate;
-                    self.fair_price_focus_close = self.fair_price;
+                    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;
+                        }
+                    } else {
+                        self.fair_rate_focus_close = close_rate;
+                        self.fair_price_focus_close = self.fair_price;
+                    }
                 }
             }
         }