use crate::Series;
use std::collections::VecDeque;
pub(crate) fn calculate_stochastic(series: &[Series], period: usize) -> VecDeque<f32> {
if series.len() <= period {
return VecDeque::new();
}
let mut stochastic_values = VecDeque::new();
for i in period..series.len() {
let closing_price = series[i].close;
let mut lowest_low = f32::INFINITY;
let mut highest_high = f32::NEG_INFINITY;
for s in &series[i - period + 1..=i] {
let current_low = s.low;
let current_high = s.high;
if current_low < lowest_low {
lowest_low = current_low;
}
if current_high > highest_high {
highest_high = current_high;
}
}
let percent_k = if highest_high != lowest_low {
((closing_price - lowest_low) / (highest_high - lowest_low)) * 100.0
} else {
0.0
};
stochastic_values.push_back(percent_k);
}
for _ in 1..period + 1 {
stochastic_values.push_front(0.0);
}
assert!(stochastic_values.len() == series.len());
stochastic_values
}