apple_quant_algorithmic/binned/
fixed_time_ranged.rs1use std::marker::PhantomData;
2
3use bevy::log::error;
4
5use crate::{
6 aggregation::Aggregator,
7 binned_method::{BinnedDataError, FixedBinnedData},
8 instrument::InstrumentSpec,
9 timestamp::TradeTimestampedRange,
10};
11
12pub struct FixedBinnedTimeRangedData<
15 'instrument_data,
16 'aggregated_data,
17 IS: InstrumentSpec,
18 T: TradeTimestampedRange
19 + Aggregator<'instrument_data, 'aggregated_data, T, AggregatorData, IS>
20 + Clone
21 + 'aggregated_data,
22 AggregatorData,
23 const SECTOR_DATA_COUNT: usize,
24 const SECTOR_STRIDE_NS: u64,
25 const DATA_STRIDE_NS: u64,
26> {
27 fixed_binned_data: FixedBinnedData<T, SECTOR_DATA_COUNT>,
28
29 _instrument_data: PhantomData<&'instrument_data ()>,
30 _aggregated_data: PhantomData<&'aggregated_data ()>,
31 _is: PhantomData<IS>,
32 _aggregator_data: PhantomData<AggregatorData>,
33}
34
35impl<
36 'instrument_data,
37 'aggregated_data,
38 IS: InstrumentSpec,
39 T: TradeTimestampedRange
40 + Aggregator<'instrument_data, 'aggregated_data, T, AggregatorData, IS>
41 + Clone
42 + 'aggregated_data,
43 AggregatorData,
44 const SECTOR_DATA_COUNT: usize,
45 const SECTOR_STRIDE_NS: u64,
46 const DATA_STRIDE_NS: u64,
47>
48 FixedBinnedTimeRangedData<
49 'instrument_data,
50 'aggregated_data,
51 IS,
52 T,
53 AggregatorData,
54 SECTOR_DATA_COUNT,
55 SECTOR_STRIDE_NS,
56 DATA_STRIDE_NS,
57 >
58{
59 pub fn new_checked() -> Result<Self, ()> {
60 if SECTOR_STRIDE_NS / SECTOR_DATA_COUNT as u64 != DATA_STRIDE_NS {
61 error!(
62 "Invalid const generics for FixedBinnedTimeRangedData where SECTOR_STRIDE_NS: {} SECTOR_DATA_COUNT: {} DATA_STRIDE_NS: {}",
63 SECTOR_STRIDE_NS, SECTOR_DATA_COUNT, DATA_STRIDE_NS,
64 );
65 return Err(());
66 }
67
68 Ok(Self {
69 fixed_binned_data: FixedBinnedData::default(),
70 _instrument_data: PhantomData::default(),
71 _aggregated_data: PhantomData::default(),
72 _is: PhantomData::default(),
73 _aggregator_data: PhantomData::default(),
74 })
75 }
76
77 fn index_ranged_timestamp(
78 min_timestamp: u64,
79 max_timestamp: u64,
80 ) -> Result<(usize, usize), BinnedDataError> {
81 let min_index = (min_timestamp / DATA_STRIDE_NS) as usize;
82 let max_index = (max_timestamp / DATA_STRIDE_NS) as usize;
83
84 #[cfg(debug_assertions)]
85 if max_index < min_index {
86 return Err(
87 BinnedDataError::InvalidMinMax {
88 min: min_index as u64,
89 max: max_index as u64,
90 },
91 );
92 }
93
94 Ok((min_index, max_index))
95 }
96}
97
98