From fd274297139ffb86716248a0d71767ffe18561ba Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 21 Jun 2026 00:54:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=87=8D=E8=82=A1=E7=A5=A8=E7=8A=B6?= =?UTF-8?q?=E6=80=81rolling=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 83 ++++++------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index cfe8cbe..21a8790 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -2264,63 +2264,32 @@ 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 stock_ma_short = self - .stock_decision_rolling_mean( - ctx, - date, - symbol, - &factor.extra_factors, - "close", - self.config.stock_short_ma_days, - ) - .unwrap_or(f64::NAN); - let stock_ma_mid = self - .stock_decision_rolling_mean( - ctx, - date, - symbol, - &factor.extra_factors, - "close", - self.config.stock_mid_ma_days, - ) - .unwrap_or(f64::NAN); - let stock_ma_long = self - .stock_decision_rolling_mean( - ctx, - date, - symbol, - &factor.extra_factors, - "close", - self.config.stock_long_ma_days, - ) - .unwrap_or(f64::NAN); - let stock_ma5 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 5) - .unwrap_or(f64::NAN); - let stock_ma10 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 10) - .unwrap_or(f64::NAN); - let stock_ma20 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 20) - .unwrap_or(f64::NAN); - let stock_ma30 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 30) - .unwrap_or(f64::NAN); - let stock_volume_ma5 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 5) - .unwrap_or(f64::NAN); - let stock_volume_ma10 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 10) - .unwrap_or(f64::NAN); - let stock_volume_ma20 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 20) - .unwrap_or(f64::NAN); - let stock_volume_ma60 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 60) - .unwrap_or(f64::NAN); - let stock_volume_ma100 = self - .stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 100) - .unwrap_or(f64::NAN); + let mut rolling_values = HashMap::<(&'static str, usize), f64>::new(); + let mut rolling = |field: &'static str, lookback: usize| -> f64 { + *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) + }) + }; + 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_volume_ma5 = rolling("volume", 5); + let stock_volume_ma10 = rolling("volume", 10); + let stock_volume_ma20 = rolling("volume", 20); + let stock_volume_ma60 = rolling("volume", 60); + let stock_volume_ma100 = rolling("volume", 100); let touched_upper_limit = !market.paused && (market.is_at_upper_limit_price(market.close) || market.is_at_upper_limit_price(market.open)