From 0714d1f77b51b11c7645280b1ff7be0c892e8eca Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 21 Jun 2026 01:06:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=82=A1=E7=A5=A8rolling?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E5=93=88=E5=B8=8C=E5=BC=80=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 203d737..8033e8b 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -2304,30 +2304,59 @@ impl PlatformExprStrategy { let factor = ctx.data.require_factor(factor_date, symbol)?; let candidate = ctx.data.require_candidate(date, symbol)?; let instrument = ctx.data.instrument(symbol); - let mut rolling_values = HashMap::<(&'static str, usize), f64>::new(); - let mut rolling = |field: &'static str, lookback: usize| -> f64 { + let rolling = |field: &'static str, lookback: usize| -> f64 { if !self.stock_rolling_requirements.requires(field, lookback) { return f64::NAN; } - *rolling_values.entry((field, lookback)).or_insert_with(|| { - self.stock_decision_rolling_mean( - ctx, - date, - symbol, - &factor.extra_factors, - field, - lookback, - ) - .unwrap_or(f64::NAN) - }) + self.stock_decision_rolling_mean( + ctx, + date, + symbol, + &factor.extra_factors, + field, + lookback, + ) + .unwrap_or(f64::NAN) }; let stock_ma_short = rolling("close", self.config.stock_short_ma_days); let stock_ma_mid = rolling("close", self.config.stock_mid_ma_days); let stock_ma_long = rolling("close", self.config.stock_long_ma_days); - let stock_ma5 = rolling("close", 5); - let stock_ma10 = rolling("close", 10); - let stock_ma20 = rolling("close", 20); - let stock_ma30 = rolling("close", 30); + let stock_ma5 = if self.config.stock_short_ma_days == 5 { + stock_ma_short + } else if self.config.stock_mid_ma_days == 5 { + stock_ma_mid + } else if self.config.stock_long_ma_days == 5 { + stock_ma_long + } else { + rolling("close", 5) + }; + let stock_ma10 = if self.config.stock_short_ma_days == 10 { + stock_ma_short + } else if self.config.stock_mid_ma_days == 10 { + stock_ma_mid + } else if self.config.stock_long_ma_days == 10 { + stock_ma_long + } else { + rolling("close", 10) + }; + let stock_ma20 = if self.config.stock_short_ma_days == 20 { + stock_ma_short + } else if self.config.stock_mid_ma_days == 20 { + stock_ma_mid + } else if self.config.stock_long_ma_days == 20 { + stock_ma_long + } else { + rolling("close", 20) + }; + let stock_ma30 = if self.config.stock_short_ma_days == 30 { + stock_ma_short + } else if self.config.stock_mid_ma_days == 30 { + stock_ma_mid + } else if self.config.stock_long_ma_days == 30 { + stock_ma_long + } else { + rolling("close", 30) + }; let stock_volume_ma5 = rolling("volume", 5); let stock_volume_ma10 = rolling("volume", 10); let stock_volume_ma20 = rolling("volume", 20);