use crate::model::Bar;
use std::collections::HashMap;
#[derive(Clone)]
pub struct SeriesContext {
pub bars: Vec<Bar>,
pub curr_bar: usize,
pub series_cache: HashMap<String, Vec<f64>>,
}
impl SeriesContext {
pub fn new(bars: &[Bar]) -> Self {
let mut series_cache = HashMap::new();
series_cache.insert("open".to_string(), bars.iter().map(|b| b.open).collect());
series_cache.insert("high".to_string(), bars.iter().map(|b| b.high).collect());
series_cache.insert("low".to_string(), bars.iter().map(|b| b.low).collect());
series_cache.insert("close".to_string(), bars.iter().map(|b| b.close).collect());
series_cache.insert(
"volume".to_string(),
bars.iter().map(|b| b.volume).collect(),
);
series_cache.insert(
"hl2".to_string(),
bars.iter().map(|b| (b.high + b.low) / 2.0).collect(),
);
series_cache.insert(
"hlc3".to_string(),
bars.iter()
.map(|b| (b.high + b.low + b.close) / 3.0)
.collect(),
);
series_cache.insert(
"ohlc4".to_string(),
bars.iter()
.map(|b| (b.open + b.high + b.low + b.close) / 4.0)
.collect(),
);
Self {
bars: bars.to_vec(),
curr_bar: 0,
series_cache,
}
}
pub fn get_series_val(&self, series_name: &str, offset: usize) -> Option<f64> {
let series = self.series_cache.get(series_name)?;
if offset <= self.curr_bar {
series.get(self.curr_bar - offset).copied()
} else {
None
}
}
pub fn get_series(&self, name: &str) -> Option<&Vec<f64>> {
self.series_cache.get(name)
}
pub fn store_series(&mut self, name: String, values: Vec<f64>) {
self.series_cache.insert(name, values);
}
}