From e4f6cdd0257adb3dc9164b9914bde7c269cc693e Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 7 Sep 2026 05:10:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E9=BD=90=E7=9B=AE=E6=A0=87=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=8F=90=E4=BA=A4=E5=89=8D=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 7384045..d372f0e 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -13274,7 +13274,11 @@ impl Strategy for PlatformExprStrategy { .iter() .filter(|symbol| !Self::projected_position_is_flat(&projected, symbol)) .count(); - let daily_target_count = selection_limit.saturating_sub(blocked_exit_slots); + let daily_target_count = if self.config.redistribute_target_weights_after_exit { + selection_limit + } else { + selection_limit.saturating_sub(blocked_exit_slots) + }; let daily_target_portfolio_scales = resolved_target_scales( &original_target_scales, &candidate_target_scales, @@ -13291,6 +13295,21 @@ impl Strategy for PlatformExprStrategy { { continue; } + let execution_stock = if self.uses_intraday_execution_quotes() { + let execution_time = self.intraday_execution_start_time(); + if self + .scheduled_quote_at_time(ctx, projection_date, symbol, Some(execution_time)) + .is_none() + { + selection_notes.push(format!( + "daily_target_skipped symbol={symbol} reason=execution_quote_unavailable no_order=true" + )); + continue; + } + self.stock_state_at_time(ctx, projection_date, symbol, Some(execution_time))? + } else { + self.stock_state(ctx, projection_date, symbol)? + }; let target_value = target_value_for_scale( strategy_visible_total_value, trading_ratio, @@ -13305,6 +13324,20 @@ impl Strategy for PlatformExprStrategy { .position(&symbol) .map(|position| position.quantity) .unwrap_or(0); + if before_qty == 0 + && !defer_execution_risk + && let Some(reason) = self.buy_rejection_reason( + ctx, + execution_date, + symbol, + execution_stock.as_ref(), + )? + { + selection_notes.push(format!( + "daily_target_skipped symbol={symbol} reason={reason} no_order=true" + )); + continue; + } if before_qty > 0 { self.project_target_value( ctx,