|
|
@@ -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;
|
|
|
|