diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index d35a4a8..1b3ccf4 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -623,6 +623,7 @@ struct SymbolDailySeriesBase { upper_limits: Vec, lower_limits: Vec, price_ticks: Vec, + day_open_prefix: Vec, open_prefix: Vec, close_prefix: Vec, prev_close_prefix: Vec, @@ -880,6 +881,7 @@ impl SymbolPriceSeries { lower_limits.push(row.lower_limit); price_ticks.push(row.price_tick); } + let day_open_prefix = prefix_sums(&day_opens); let open_prefix = prefix_sums(&opens); let close_prefix = prefix_sums(&closes); let prev_close_prefix = prefix_sums(&prev_closes); @@ -926,6 +928,7 @@ impl SymbolPriceSeries { upper_limits, lower_limits, price_ticks, + day_open_prefix, open_prefix, close_prefix, prev_close_prefix, @@ -1205,7 +1208,7 @@ impl SymbolPriceSeries { fn prefix_for(&self, field: PriceField) -> &[f64] { match field { - PriceField::DayOpen => &self.open_prefix, + PriceField::DayOpen => &self.day_open_prefix, PriceField::Open => &self.open_prefix, PriceField::Close => &self.close_prefix, PriceField::Last => &self.last_prefix, @@ -6553,6 +6556,24 @@ mod tests { } } + #[test] + fn day_open_moving_average_uses_its_own_historical_column() { + let mut first = market_row("2025-01-02", 10.0, 100); + first.day_open = 10.0; + first.open = 20.0; + let mut second = market_row("2025-01-03", 12.0, 200); + second.day_open = 12.0; + second.open = 24.0; + let rows = [first, second]; + let series = SymbolPriceSeries::new("000001.SZ".to_string(), &rows); + let date = NaiveDate::from_ymd_opt(2025, 1, 3).unwrap(); + assert_eq!(series.trailing_values(date, 2, PriceField::DayOpen), vec![10.0, 12.0]); + assert_eq!(series.moving_average(date, 2, PriceField::DayOpen), Some(11.0)); + assert_eq!(series.moving_average(date, 2, PriceField::Open), Some(22.0)); + assert_eq!(series.moving_average(date, 0, PriceField::DayOpen), None); + assert_eq!(series.moving_average(date, 3, PriceField::DayOpen), None); + } + #[test] fn symbol_price_series_test_constructor_sorts_unsorted_rows() { let series = SymbolPriceSeries::new(