Skip to main content

apple_quant_algorithmic/binned/
fixed_time_ranged.rs

1use 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
12/// Fixed Binned - Fixed size (1); bins for each T.
13/// Time Ranged - Each T is ranged by time within each constant bin size via [`RangeTimestamped`].
14pub 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// impl<
99// 	'instrument_data,
100// 	'aggregated_data,
101// 	IS: InstrumentSpec,
102// 	T: TradeTimestampedRange
103// 		+ Aggregator<'instrument_data, 'aggregated_data, T, AggregatorData, IS>
104// 		+ Default
105// 		+ 'aggregated_data,
106// 	AggregatorData,
107// 	const SECTOR_DATA_COUNT: usize,
108// 	const SECTOR_STRIDE_NS: u64,
109// 	const DATA_STRIDE_NS: u64,
110// > BinnedRange<T>
111// 	for FixedBinnedTimeRangedData<
112// 		'instrument_data,
113// 		'aggregated_data,
114// 		IS,
115// 		T,
116// 		AggregatorData,
117// 		SECTOR_DATA_COUNT,
118// 		SECTOR_STRIDE_NS,
119// 		DATA_STRIDE_NS,
120// 	>
121// {
122// }