Browse Source

平仓条件可以调参

skyffire 9 months ago
parent
commit
debc168f88
2 changed files with 29 additions and 10 deletions
  1. 5 1
      global/src/params.rs
  2. 24 9
      strategy/src/predictor.rs

+ 5 - 1
global/src/params.rs

@@ -1,6 +1,7 @@
 use std::fs::File;
 use std::io::Read;
 use rust_decimal::Decimal;
+use rust_decimal::prelude::ToPrimitive;
 use rust_decimal_macros::dec;
 use toml::from_str;
 use serde_derive::Deserialize;
@@ -46,6 +47,8 @@ pub struct Params {
     pub gamma: Decimal,
     // 分批建仓功能 小资金建议1 大资金建议3 默认 1
     pub grid: i8,
+    // 平仓难度, [easy, normal, hard]
+    pub close_difficulty: String,
     // 是否启用colocation技术, 1开启,0关闭 默认0
     pub colo: i8,
     // 日志级别,从低到高依次是:[trace, debug, info, warn, error]
@@ -94,7 +97,8 @@ impl Params {
             ref_pair: vec![json_value["ref_pair"].as_str().unwrap().to_string()],                           // 兼容新版本与老版本
             stop_loss: Decimal::try_from(json_value["stop_loss"].as_f64().unwrap_or_default()).unwrap(),
             hold_coin: Decimal::ZERO,
-            grid: 1,
+            grid: json_value["grid"].as_i64().unwrap().to_i8().unwrap(),
+            close_difficulty: json_value["close_difficulty"].as_str().unwrap().to_string(),
             colo: 0,
             interval: 100,
             broker_id: json_value["exchange"].as_str().unwrap().to_string().split("_").collect::<Vec<_>>()[0].to_string(),

+ 24 - 9
strategy/src/predictor.rs

@@ -366,18 +366,33 @@ impl Predictor {
             return;
         }
 
-        // 可能是趋势
-        // let is_open_long = self.spread_sma_1000 - self.spread_sma > self.params.open && self.fair_price > self.mid_price;
-        // let is_open_short = self.spread_sma_1000 - self.spread_sma < self.params.open * Decimal::NEGATIVE_ONE && self.fair_price < self.mid_price;
         // 可能是接针
         let is_open_long = self.force_order_value < -self.params.open && self.inventory.is_zero();
         let is_open_short = self.force_order_value > self.params.open && self.inventory.is_zero();
-        // 对称平仓,方差会非常大
-        let is_close_long = self.inventory > Decimal::ZERO && self.force_order_value > self.params.open * dec!(0.8);
-        let is_close_short = self.inventory < Decimal::ZERO && self.force_order_value < -self.params.open * dec!(0.8);
-        // // 穿越平仓
-        // let is_close_long = self.inventory > Decimal::ZERO && self.mid_price_trend_rate > Decimal::ZERO;
-        // let is_close_short = self.inventory < Decimal::ZERO && self.mid_price_trend_rate < Decimal::ZERO;
+
+        let (is_close_long, is_close_short) = match self.params.close_difficulty.as_str() {
+            "easy" => {
+                let is_close_long = self.inventory > Decimal::ZERO && self.force_order_value > Decimal::ZERO;
+                let is_close_short = self.inventory < Decimal::ZERO && self.force_order_value < Decimal::ZERO;
+
+                (is_close_long, is_close_short)
+            },
+            "normal" => {
+                let is_close_long = self.inventory > Decimal::ZERO && self.force_order_value > self.params.open * dec!(0.8);
+                let is_close_short = self.inventory < Decimal::ZERO && self.force_order_value < -self.params.open * dec!(0.8);
+
+                (is_close_long, is_close_short)
+            },
+            "hard" => {
+                let is_close_long = self.inventory > Decimal::ZERO && self.force_order_value > self.params.open;
+                let is_close_short = self.inventory < Decimal::ZERO && self.force_order_value < -self.params.open;
+
+                (is_close_long, is_close_short)
+            }
+            _ => {
+                panic!("错误的平仓条件:{}", self.params.close_difficulty)
+            }
+        };
 
         self.bid_delta = dec!(-2);
         self.ask_delta = dec!(-2);