From a5a9688599d1313735124ea6689d655dc7b22a31 Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 8 Jul 2026 03:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=E5=BC=B1=E5=B8=82=E8=B0=83?= =?UTF-8?q?=E4=BB=93=E6=89=A7=E8=A1=8C=E5=B1=82=E5=88=86=E6=8B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 29a3118..8093b61 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -8483,6 +8483,47 @@ impl Strategy for PlatformExprStrategy { } } + let mut actionable_stop_take_exit_symbols = BTreeSet::::new(); + if self.config.aiquant_transaction_cost + && self.config.rotation_enabled + && trading_ratio > 0.0 + && trading_ratio < 1.0 + && selection_limit > 0 + { + for position in ctx.portfolio.positions().values() { + if position.quantity == 0 + || delayed_sold_symbols.contains(&position.symbol) + || pending_full_close_symbols.contains(&position.symbol) + || self.pending_highlimit_holdings.contains(&position.symbol) + { + continue; + } + if self.regular_sell_should_wait_due_to_highlimit( + ctx, + projection_date, + &position.symbol, + self.intraday_execution_start_time(), + )? { + continue; + } + let (stop_hit, profit_hit) = + self.stop_take_action_for_position(ctx, signal_date, &day, position)?; + if !stop_hit && !profit_hit { + continue; + } + if defer_execution_risk + || self.can_sell_position_at_time( + ctx, + execution_date, + &position.symbol, + Some(self.intraday_execution_start_time()), + ) + { + actionable_stop_take_exit_symbols.insert(position.symbol.clone()); + } + } + } + if self.config.aiquant_transaction_cost && self.config.rotation_enabled && trading_ratio > 0.0 @@ -8509,6 +8550,9 @@ impl Strategy for PlatformExprStrategy { if pending_full_close_symbols.contains(&position.symbol) { continue; } + if actionable_stop_take_exit_symbols.contains(&position.symbol) { + continue; + } let current_value = self.projected_position_value_at_execution_price( ctx, &projected,