Browse Source

v1.0.12: 使用价差扩大行为配合前期波动进行开单

skyffire 10 tháng trước cách đây
mục cha
commit
efc8bf9ca0
1 tập tin đã thay đổi với 16 bổ sung10 xóa
  1. 16 10
      strategy/src/predictor.rs

+ 16 - 10
strategy/src/predictor.rs

@@ -32,6 +32,7 @@ pub struct Predictor {
     pub trades_volume_short_ema: Decimal,                                       // 过去10秒的成交量总和的ema
     pub spread: Decimal,                                                        // 当前价差
     pub spread_ema_1000: Decimal,                                               // 价差的ema,1000级别
+    pub spread_diff: Decimal,                                                   // 价差与价差ema的diff,可以衡量价差扩大行为
 
     pub optimal_ask_price: Decimal,                                             // 卖出挂单价
     pub optimal_bid_price: Decimal,                                             // 买入挂单价
@@ -157,6 +158,7 @@ impl Predictor {
             trades_volume_short_ema: Default::default(),
             spread: Default::default(),
             spread_ema_1000: Default::default(),
+            spread_diff: Default::default(),
             optimal_ask_price: Default::default(),
             optimal_bid_price: Default::default(),
 
@@ -165,7 +167,7 @@ impl Predictor {
             bid_delta: Default::default(),
 
             fair_price_time_vec: FixedTimeRangeDeque::new((params.second_observation_time.to_f64().unwrap() * 1_000_000f64).to_i64().unwrap()),
-            mid_price_time_vec: FixedTimeRangeDeque::new(100_000),
+            mid_price_time_vec: FixedTimeRangeDeque::new((params.second_observation_time.to_f64().unwrap() * 1_000_000f64).to_i64().unwrap()),
             fair_price: Default::default(),
             fair_price_ema_short: Default::default(),
             fair_price_ema_long: Default::default(),
@@ -381,8 +383,10 @@ impl Predictor {
                 return;
             }
 
-            let mut rate = Self::get_real_rate(&self.fair_price_time_vec);
-            rate.rescale(8);
+            let mut fair_rate = Self::get_real_rate(&self.fair_price_time_vec);
+            fair_rate.rescale(8);
+            let mut mid_rate = Self::get_real_rate(&self.mid_price_time_vec);
+            mid_rate.rescale(8);
 
             // 重置开仓焦点,条件1
             if !self.fair_rate_focus_open.is_zero() {
@@ -413,16 +417,16 @@ impl Predictor {
             // 更新程序关注的开仓焦点
             if self.fair_rate_focus_open.is_zero() && self.inventory.is_zero() {
                 // 只有有强度的rate才有资格被称为针,并且差价够大,
-                if rate.abs() > self.params.open_activate && self.spread.abs() > self.params.min_spread {
+                if fair_rate.abs() > self.params.open_activate && mid_rate.abs() > self.params.open_activate && self.spread_diff.abs() > self.params.min_spread {
                     // 向上涨,并且fair下穿mid,视为观测阶段开始
-                    if rate > Decimal::ZERO && self.spread < Decimal::ZERO {
-                        self.fair_rate_focus_open = rate;
+                    if mid_rate > Decimal::ZERO && fair_rate > Decimal::ZERO && self.spread_diff < Decimal::ZERO {
+                        self.fair_rate_focus_open = mid_rate;
                         self.mid_price_focus_open = self.mid_price;
                     }
 
                     // 向下跌,并且fair上穿mid,视为观测阶段开始
-                    if rate < Decimal::ZERO && self.spread > Decimal::ZERO {
-                        self.fair_rate_focus_open = rate;
+                    if mid_rate < Decimal::ZERO && fair_rate > Decimal::ZERO && self.spread_diff > Decimal::ZERO {
+                        self.fair_rate_focus_open = mid_rate;
                         self.mid_price_focus_open = self.mid_price;
                     }
                 }
@@ -432,7 +436,7 @@ impl Predictor {
             // close_rate:
             //  大于0:当前价格在均线之上
             //  小于0:当前价格在均线之下
-            let close_rate = rate.clone();
+            let close_rate = mid_rate.clone();
             // 重置平仓焦点,条件1
             if !self.fair_rate_focus_close.is_zero() && self.inventory.is_zero() {
                 self.fair_rate_focus_close = Decimal::ZERO;
@@ -529,6 +533,8 @@ impl Predictor {
         // self.spread_sma_1000.rescale(8);
         // self.spread_sma_1000_time_vec.push_back(self.spread_ema_1000);
 
+        self.spread_diff = self.spread - self.spread_ema_1000;
+
         while self.spread_vec.len() > 1_000 {
             self.spread_vec.remove(0);
         }
@@ -681,7 +687,7 @@ impl Predictor {
 
         let spread = self.spread;
         let spread_max = self.spread_ema_1000;
-        let spread_min = self.spread - self.spread_ema_1000;
+        let spread_min = self.spread_diff;
         // let spread = self.price_times_avg;
         // let spread_max = self.fair_price_vec[1] / self.fair_price_vec[0];
         // let spread_min = self.fair_price / self.mid_price;