From 94632f42d6dc33957294507e4edf41dd1fa1de39 Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 7 Sep 2026 13:34:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=85=B1=E4=BA=AB=E6=97=A5?= =?UTF-8?q?=E7=BA=BF=E5=BA=8F=E5=88=97=E4=B8=8E=E6=97=A5=E5=86=85=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/data.rs | 73 ++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 9878022..4fe5fcf 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -561,23 +561,29 @@ pub fn decision_free_float_cap_bn(factor: &DailyFactorSnapshot) -> f64 { #[derive(Debug, Clone)] struct SymbolPriceSeries { + base: Arc, + timestamps: Vec>, + last_prices: Vec, + bid1s: Vec, + ask1s: Vec, + minute_volumes: Vec, + bid1_volumes: Vec, + ask1_volumes: Vec, + trading_phases: Vec>, + last_prefix: Vec, +} + +#[derive(Debug)] +struct SymbolDailySeriesBase { symbol: String, dates: Vec, - timestamps: Vec>, day_opens: Vec, opens: Vec, highs: Vec, lows: Vec, closes: Vec, prev_closes: Vec, - last_prices: Vec, - bid1s: Vec, - ask1s: Vec, volumes: Vec, - minute_volumes: Vec, - bid1_volumes: Vec, - ask1_volumes: Vec, - trading_phases: Vec>, paused: Vec, upper_limits: Vec, lower_limits: Vec, @@ -585,12 +591,19 @@ struct SymbolPriceSeries { open_prefix: Vec, close_prefix: Vec, prev_close_prefix: Vec, - last_prefix: Vec, valid_volume_sum_prefix: Vec, valid_volume_count_prefix: Vec, valid_volume_start_by_count: Vec, } +impl std::ops::Deref for SymbolPriceSeries { + type Target = SymbolDailySeriesBase; + + fn deref(&self) -> &Self::Target { + &self.base + } +} + type DenseRowPositionIndex = BTreeMap>; const MISSING_ROW_POSITION: u32 = u32::MAX; @@ -869,34 +882,36 @@ impl SymbolPriceSeries { } Self { - symbol, - dates, + base: Arc::new(SymbolDailySeriesBase { + symbol, + dates, + day_opens, + opens, + highs, + lows, + closes, + prev_closes, + volumes, + paused, + upper_limits, + lower_limits, + price_ticks, + open_prefix, + close_prefix, + prev_close_prefix, + valid_volume_sum_prefix, + valid_volume_count_prefix, + valid_volume_start_by_count, + }), timestamps, - day_opens, - opens, - highs, - lows, - closes, - prev_closes, last_prices, bid1s, ask1s, - volumes, minute_volumes, bid1_volumes, ask1_volumes, trading_phases, - paused, - upper_limits, - lower_limits, - price_ticks, - open_prefix, - close_prefix, - prev_close_prefix, last_prefix, - valid_volume_sum_prefix, - valid_volume_count_prefix, - valid_volume_start_by_count, } } @@ -5085,6 +5100,7 @@ mod tests { .as_ref() .unwrap(), ); + let daily_base_before = Arc::clone(&market_series_before.base); assert_eq!( data.apply_intraday_market_overlays(vec![IntradayMarketSnapshotOverlay { @@ -5120,6 +5136,7 @@ mod tests { &market_series_before, market_series_after )); + assert!(Arc::ptr_eq(&daily_base_before, &market_series_after.base)); assert_eq!( serde_json::to_value(market_series_after.snapshot_at(0)).unwrap(), serde_json::to_value(market).unwrap()