diff --git a/crates/fidc-core/src/broker.rs b/crates/fidc-core/src/broker.rs index 39c1edf..a9a874a 100644 --- a/crates/fidc-core/src/broker.rs +++ b/crates/fidc-core/src/broker.rs @@ -427,11 +427,10 @@ where symbol: &str, snapshot: &crate::data::DailyMarketSnapshot, ) -> f64 { - if self.matching_type == MatchingType::NextBarOpen - && snapshot.prev_close.is_finite() - && snapshot.prev_close > 0.0 - { - return snapshot.prev_close; + if self.matching_type == MatchingType::NextBarOpen { + // The target budget is frozen on the signal day, but the broker can only + // convert that budget to shares once the next session's open is visible. + return self.sizing_price(snapshot); } if self.aiquant_execution_rules && self.execution_price_field == PriceField::Last { let start_cursor = self @@ -7154,7 +7153,7 @@ mod tests { } #[test] - fn next_open_target_value_valuation_uses_previous_close() { + fn next_open_target_value_valuation_uses_execution_open() { let date = chrono::NaiveDate::from_ymd_opt(2025, 1, 2).expect("valid date"); let broker = BrokerSimulator::new_with_execution_price( ChinaAShareCostModel::default(), @@ -7181,7 +7180,7 @@ mod tests { assert_eq!( broker.target_value_valuation_price(date, &data, "000001.SZ", snapshot), - 10.0 + 11.0 ); }