From dd08358f1c8d1e29aff0be59d7882a190a10ff0f Mon Sep 17 00:00:00 2001 From: boris Date: Thu, 27 Aug 2026 19:20:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E5=88=B6=E7=9B=98=E5=90=8E=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E4=BB=B7=E6=A0=BC=E6=92=AE=E5=90=88=E7=94=9F=E6=95=88?= =?UTF-8?q?=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/engine.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index 3ee1506..6042ad6 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -26,6 +26,9 @@ use crate::strategy::{ TargetPortfolioOrderPricing, }; +pub const POST_CLOSE_FIXED_PRICE_EFFECTIVE_DATE: NaiveDate = + NaiveDate::from_ymd_opt(2026, 7, 6).expect("valid post-close effective date"); + #[derive(Debug, Error)] pub enum BacktestError { #[error(transparent)] @@ -1970,6 +1973,16 @@ where }) .filter(|date| self.config.end_date.map(|end| *date <= end).unwrap_or(true)) .collect::>(); + if self.broker.matching_type() == MatchingType::PostCloseFixedPrice + && calendar_dates + .first() + .is_some_and(|date| *date < POST_CLOSE_FIXED_PRICE_EFFECTIVE_DATE) + { + return Err(BacktestError::Execution(format!( + "post_close_fixed_price is unavailable before {}", + POST_CLOSE_FIXED_PRICE_EFFECTIVE_DATE + ))); + } let has_decision_inputs = |date: NaiveDate| { !self.data.factor_snapshot_rows_on(date).is_empty() && !self.data.candidate_snapshot_rows_on(date).is_empty()