Browse Source

与区间最大值最小值的关系(研究)

skyffire 9 months ago
parent
commit
1b59059fff
1 changed files with 32 additions and 28 deletions
  1. 32 28
      strategy/src/predictor.rs

+ 32 - 28
strategy/src/predictor.rs

@@ -254,23 +254,21 @@ impl Predictor {
     pub async fn on_trade(&mut self, trade: &Trade, _index: usize) {
         self.trade_long_vec.push_back(trade.clone());
         self.trade_short_vec.push_back(trade.clone());
-        if !self.inventory.is_zero() {
-            self.trade_fixed_vec.push(trade.clone());
-
-            if self.trade_fixed_vec.len() > 100 {
-                let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_fixed_vec.iter()
-                    .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
-                        if item.size > Decimal::ZERO {
-                            (buy_sum + item.value.abs(), sell_sum)
-                        } else if item.size < Decimal::ZERO {
-                            (buy_sum, sell_sum + item.value.abs())
-                        } else {
-                            (buy_sum, sell_sum)
-                        }
-                    });
-                self.money_flow = (bought_sum - sold_sum) / (bought_sum + sold_sum);
-                self.money_flow.rescale(4);
-            }
+        self.trade_fixed_vec.push(trade.clone());
+
+        if self.trade_long_vec.len() > 100 {
+            let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_long_vec.deque.iter()
+                .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
+                    if item.size > Decimal::ZERO {
+                        (buy_sum + item.value.abs(), sell_sum)
+                    } else if item.size < Decimal::ZERO {
+                        (buy_sum, sell_sum + item.value.abs())
+                    } else {
+                        (buy_sum, sell_sum)
+                    }
+                });
+            self.money_flow = (bought_sum - sold_sum) / (bought_sum + sold_sum);
+            self.money_flow.rescale(4);
         }
 
         self.last_price = trade.price;
@@ -431,8 +429,8 @@ impl Predictor {
                 // is_cross = is_cross && mid_rate.abs() > self.params.open_activate;
                 // is_cross = is_cross && ((mid_start - fair_start) / mid_start).abs() < dec!(0.0005);
 
-                // 最近80%的波动都发生在最近短周期的时间里
-                let is_high_speed = mid_rate.abs() > mid_long_rate.abs() * dec!(0.8) && mid_rate * mid_long_rate > Decimal::ZERO;
+                // 小于40%的波动发生在最后一段时间
+                let is_high_speed = mid_rate.abs() < mid_long_rate.abs() * dec!(0.4) && mid_rate * mid_long_rate > Decimal::ZERO;
 
                 if is_high_speed && mid_rate.abs() > self.params.open_activate {
                     // 向上涨,并且fair下穿mid,视为观测阶段开始
@@ -723,9 +721,13 @@ impl Predictor {
         let last_price = self.last_price;
         let fair_price = Self::DONT_VIEW;
 
-        let spread = self.spread;
-        let spread_max = self.spread_ema;
-        let spread_min = self.spread_diff;
+        let (spread, spread_max, spread_min) = if self.mid_price_trend_time_vec.len() > 1 {
+            let (_, max, min) = Self::get_real_rate(&self.mid_price_trend_time_vec);
+
+            (self.mid_price, max, min)
+        } else {
+            (self.mid_price, Self::DONT_VIEW, Self::DONT_VIEW)
+        };
         // 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;
@@ -735,14 +737,16 @@ impl Predictor {
 
         let inventory = self.inventory;
 
-        let (sigma_square, _, _) = if self.mid_price_long_time_vec.len() > 1 {
-            Self::get_real_rate(&self.mid_price_long_time_vec)
-        } else {
-            (Decimal::ZERO, Decimal::ZERO, Decimal::ZERO)
-        };
+        let sigma_square = self.money_flow;
         // let sigma_square = self.error_rate;
 
-        let gamma = self.mid_rate_focus_open;
+        let gamma = if self.mid_price_time_vec.len() > 1 {
+            let (mid_rate, _, _) = Self::get_real_rate(&self.mid_price_time_vec);
+
+            mid_rate
+        } else {
+            Decimal::ZERO
+        };
         let kappa = self.mid_rate_focus_close;
 
         let flow_ratio = Decimal::ZERO;