From 7f809fd8756a2bea1853e473c841f7c1bb1a7a4b Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 21 Jun 2026 02:53:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B6=A8=E5=81=9C=E6=8C=81?= =?UTF-8?q?=E4=BB=93=E6=99=AE=E9=80=9A=E8=B0=83=E4=BB=93=E6=8F=90=E5=89=8D?= =?UTF-8?q?=E5=8D=96=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 43 +++++++------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index ea2de6e..4b079c5 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -2319,27 +2319,6 @@ impl PlatformExprStrategy { } } - fn mark_highlimit_for_delayed_exit_at_time( - &mut self, - ctx: &StrategyContext<'_>, - date: NaiveDate, - symbol: &str, - execution_time: NaiveTime, - ) -> Result<(), BacktestError> { - if !self.config.delayed_limit_open_exit_enabled - || self.pending_highlimit_holdings.contains(symbol) - { - return Ok(()); - } - if matches!( - self.stock_is_at_upper_limit_at_time(ctx, date, symbol, execution_time)?, - Some(true) - ) { - self.pending_highlimit_holdings.insert(symbol.to_string()); - } - Ok(()) - } - fn stock_state_with_factor_date_and_time( &self, ctx: &StrategyContext<'_>, @@ -7484,12 +7463,14 @@ impl Strategy for PlatformExprStrategy { if position.quantity == 0 || delayed_sold_symbols.contains(&position.symbol) { continue; } - self.mark_highlimit_for_delayed_exit_at_time( + if self.regular_sell_should_wait_due_to_highlimit( ctx, execution_date, &position.symbol, self.intraday_execution_start_time(), - )?; + )? { + continue; + } if pending_full_close_symbols.contains(&position.symbol) { continue; } @@ -7768,6 +7749,14 @@ impl Strategy for PlatformExprStrategy { if stock_list.iter().any(|candidate| candidate == symbol) { continue; } + if self.regular_sell_should_wait_due_to_highlimit( + ctx, + execution_date, + symbol, + self.intraday_execution_start_time(), + )? { + continue; + } if !self.can_sell_position(ctx, execution_date, symbol) { continue; } @@ -11725,7 +11714,7 @@ mod tests { } #[test] - fn platform_aiquant_weak_market_allows_pending_highlimit_partial_target_adjust() { + fn platform_aiquant_weak_market_waits_pending_highlimit_target_adjust() { let prev_date = d(2023, 5, 4); let date = d(2023, 5, 5); let symbol = "600148.SH"; @@ -11864,7 +11853,7 @@ mod tests { let decision = strategy.on_day(&ctx).expect("platform decision"); assert!( - decision.order_intents.iter().any(|intent| matches!( + !decision.order_intents.iter().any(|intent| matches!( intent, OrderIntent::Shares { symbol: intent_symbol, @@ -11881,7 +11870,7 @@ mod tests { } #[test] - fn platform_aiquant_weak_market_marks_intraday_highlimit_before_target_adjust() { + fn platform_aiquant_weak_market_waits_when_intraday_highlimit_reached() { let prev_date = d(2023, 5, 4); let date = d(2023, 5, 5); let symbol = "600148.SH"; @@ -12020,7 +12009,7 @@ mod tests { let decision = strategy.on_day(&ctx).expect("platform decision"); assert!( - decision.order_intents.iter().any(|intent| matches!( + !decision.order_intents.iter().any(|intent| matches!( intent, OrderIntent::Shares { symbol: intent_symbol,