fix(data): use day-open values for day-open rolling averages

This commit is contained in:
boris
2026-09-14 03:18:56 +08:00
committed by boris
parent 3a3091a2cf
commit c62ae1206f
+22 -1
View File
@@ -623,6 +623,7 @@ struct SymbolDailySeriesBase {
upper_limits: Vec<f64>,
lower_limits: Vec<f64>,
price_ticks: Vec<f64>,
day_open_prefix: Vec<f64>,
open_prefix: Vec<f64>,
close_prefix: Vec<f64>,
prev_close_prefix: Vec<f64>,
@@ -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(