Răsfoiți Sursa

振幅相关计算已ok

skyffire 8 luni în urmă
părinte
comite
95bff742a2
1 a modificat fișierele cu 26 adăugiri și 5 ștergeri
  1. 26 5
      strategy/src/predictor.rs

+ 26 - 5
strategy/src/predictor.rs

@@ -31,7 +31,7 @@ pub struct Predictor {
     pub close_price_min: Decimal,
     pub amplitude_mean: Decimal,                                                // 振幅平均值
     pub amplitude_times: Decimal,                                               // 当前振幅与振幅平均值的倍数
-    pub amplitude_vec: Decimal,
+    pub amplitude_vec: VecDeque<Decimal>,
 
     // 价格相关
     pub mid_price: Decimal,                                                     // 中间价
@@ -357,13 +357,34 @@ impl Predictor {
                     mean_long = self.mid_price;
                 }
 
+                // 趋势计算相关
                 self.trend = mean_short / mean_long;
                 self.trend_vec.push_back(self.trend);
                 if self.trend_vec.len() > 600 { self.trend_vec.pop_front(); }
                 self.trend_limit = match Self::calculate_quantile(&self.trend_vec, 0.5f64) {
                     None => {Decimal::ZERO}
                     Some(limit) => {limit}
-                }
+                };
+
+                // 振幅计算相关
+                self.close_price_max = *self.close_price_vec.iter()
+                    .map(|record| &record.close)
+                    .max()
+                    .unwrap_or(&Decimal::ZERO);
+                self.close_price_min = *self.close_price_vec.iter()
+                    .map(|record| &record.close)
+                    .min()
+                    .unwrap_or(&Decimal::ZERO);
+                self.amplitude = self.close_price_max / self.close_price_min - Decimal::ONE;
+                self.amplitude_vec.push_back(self.amplitude);
+                if self.amplitude_vec.len() > 120 { self.amplitude_vec.pop_front(); }
+                self.amplitude_mean = self.amplitude_vec.iter().sum::<Decimal>() / Decimal::from(self.amplitude_vec.len());
+                self.amplitude_times = if self.amplitude_mean.is_zero() {
+                    Decimal::ONE
+                } else {
+                    self.amplitude / self.amplitude_mean
+                };
+                self.amplitude_times.rescale(4);
 
                 // // 计算phi
                 // if len >= 2 {
@@ -769,9 +790,9 @@ impl Predictor {
         let last_price = Self::DONT_VIEW;
         let fair_price = self.fair_price;
 
-        let spread = Self::DONT_VIEW;
-        let spread_max = self.trend;
-        let spread_min = self.trend_limit;
+        let spread = self.amplitude_times;
+        let spread_max = self.amplitude;
+        let spread_min = self.amplitude_mean;
 
         let inventory = self.inventory;