fix(data): use day-open values for day-open rolling averages
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user