use crate::formula::ema;
pub fn ema_crossover(
prices: Vec<f64>,
slow_period: usize,
fast_period: usize,
confirmation_candles: usize,
) -> Vec<f64> {
let slow_ema = ema(prices.clone(), slow_period);
let fast_ema = ema(prices, fast_period);
let mut crossover_signals = Vec::new();
for i in 0..slow_ema.len() {
if i == 0 {
crossover_signals.push(0.0);
} else {
let prev_slow = slow_ema[i - 1];
let prev_fast = fast_ema[i - 1];
let curr_slow = slow_ema[i];
let curr_fast = fast_ema[i];
if prev_fast <= prev_slow && curr_fast > curr_slow {
let mut confirmed = true;
let start_idx = i.saturating_sub(confirmation_candles);
for j in start_idx..i {
if fast_ema[j] > slow_ema[j] {
confirmed = false;
break;
}
}
if confirmed && i >= confirmation_candles {
crossover_signals.push(1.0); } else {
crossover_signals.push(0.0); }
}
else if prev_fast >= prev_slow && curr_fast < curr_slow {
let mut confirmed = true;
let start_idx = i.saturating_sub(confirmation_candles);
for j in start_idx..i {
if fast_ema[j] < slow_ema[j] {
confirmed = false;
break;
}
}
if confirmed && i >= confirmation_candles {
crossover_signals.push(-1.0); } else {
crossover_signals.push(0.0); }
} else {
crossover_signals.push(0.0); }
}
}
crossover_signals
}