From 4d8761cc3caa9f9f6c746323f421516408ffa095 Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 7 Sep 2026 04:44:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=BB=E6=AD=A2=E6=9C=AA=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=80=80=E5=87=BA=E5=8F=8D=E5=90=91=E8=A1=A5=E4=B9=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index dbf0fb1..092a429 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -13280,6 +13280,13 @@ impl Strategy for PlatformExprStrategy { )?; if daily_top_up_active && self.config.target_portfolio_daily_enabled { for (symbol, target_scale) in &daily_target_portfolio_scales { + if exit_symbols.contains(symbol) + || pending_full_close_symbols.contains(symbol) + || factor_position_action_symbols.contains(symbol) + || delayed_sold_symbols.contains(symbol) + { + continue; + } let target_value = target_value_for_scale( strategy_visible_total_value, trading_ratio, @@ -22682,12 +22689,19 @@ mod tests { cfg.risk_config.trading_constraints.liquidity_limit_enabled = true; cfg.signal_symbol = symbol.to_string(); cfg.exposure_expr = "0.5".to_string(); - cfg.selection_limit_expr = "40".to_string(); - cfg.stock_filter_expr = "false".to_string(); + cfg.max_positions = 1; + cfg.selection_limit_expr = "1".to_string(); + cfg.stock_filter_expr = "close > 0".to_string(); cfg.stop_loss_expr = "0.92".to_string(); cfg.take_profit_expr.clear(); + cfg.daily_top_up_enabled = true; + cfg.daily_position_target_adjust_enabled = true; + cfg.target_portfolio_daily_enabled = true; + cfg.release_slot_on_exit_signal = true; + cfg.redistribute_target_weights_after_exit = true; cfg.intraday_execution_time = Some(NaiveTime::from_hms_opt(10, 15, 0).expect("time")); let mut strategy = PlatformExprStrategy::new(cfg); + strategy.rebalance_day_counter = 2; let decision = strategy.on_day(&ctx).expect("platform decision"); @@ -22709,6 +22723,14 @@ mod tests { && *quantity > 0 && reason == "daily_position_target_adjust" ))); + assert!(!decision.order_intents.iter().any(|intent| matches!( + intent, + OrderIntent::TargetValue { + symbol: intent_symbol, + target_value, + .. + } if intent_symbol == symbol && *target_value > 0.0 + ))); assert!(!strategy.pending_full_close_symbols.contains(symbol)); }