From 935dd47e344c927a0182f1e7a4b794dcbc18a3a7 Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 26 Aug 2026 14:27:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E8=BF=90=E8=A1=8C=E6=80=81?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E7=BB=93=E7=AE=97=E4=BA=A4=E6=98=93=E6=97=A5?= =?UTF-8?q?=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/data.rs | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 92e9995..c9c4a1d 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -1188,6 +1188,16 @@ pub struct DataSet { } impl DataSet { + pub fn with_additional_trading_dates( + mut self, + dates: impl IntoIterator, + ) -> Self { + let mut calendar_dates = self.calendar.days().to_vec(); + calendar_dates.extend(dates); + self.calendar = Arc::new(TradingCalendar::new(calendar_dates)); + self + } + pub fn from_components( instruments: Vec, market: Vec, @@ -3869,6 +3879,37 @@ mod tests { assert_eq!(run_data.execution_quote_count(), 1); } + #[test] + fn additional_terminal_calendar_dates_are_isolated_from_shared_market_data() { + let date = NaiveDate::parse_from_str("2025-01-02", "%Y-%m-%d").unwrap(); + let next_date = NaiveDate::parse_from_str("2025-01-03", "%Y-%m-%d").unwrap(); + let data = DataSet::from_components( + vec![Instrument { + symbol: "000001.SZ".to_string(), + name: "平安银行".to_string(), + board: "SZ".to_string(), + round_lot: 100, + listed_at: None, + delisted_at: None, + status: "active".to_string(), + }], + vec![market_row("2025-01-02", 10.0, 1_000_000)], + Vec::new(), + Vec::new(), + vec![benchmark_row("2025-01-02", 12.0)], + ) + .unwrap(); + + let run_data = data + .clone() + .with_additional_trading_dates([next_date, next_date]); + + assert_eq!(data.next_trading_date(date, 1), None); + assert_eq!(run_data.next_trading_date(date, 1), Some(next_date)); + assert!(run_data.market(next_date, "000001.SZ").is_none()); + assert!(Arc::ptr_eq(&data.market_by_date, &run_data.market_by_date)); + } + #[test] fn execution_quotes_use_stable_k_way_merge_and_release_by_date() { let date = NaiveDate::parse_from_str("2025-01-02", "%Y-%m-%d").unwrap();