1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#[cfg(feature = "simd_assets")]
pub use crate::indicators::simd_indicators::by_asset::elderray::indicator_by_assets;
#[cfg(feature = "simd_options")]
pub use crate::indicators::simd_indicators::by_option::elderray::indicator_by_options;
use crate::indicators::simd_indicators::ema_simd::calc_simd as calc_ema_simd;
pub use crate::indicators::simd_indicators::ema_simd::multiplier_simd;
use std::simd::Simd;
/// Computes one bar of Elder-ray for `N` lanes simultaneously using SIMD parallelism.
///
/// Advances the EMA by one bar and returns the bull power, bear power, and updated EMA
/// for all `N` lanes in a single pass.
///
/// # Arguments
///
/// * `high` - High prices for this bar across all `N` lanes.
/// * `low` - Low prices for this bar across all `N` lanes.
/// * `close` - Close prices for this bar across all `N` lanes.
/// * `prev_ema` - Previous EMA values for each lane.
/// * `multipliers` - Tuple `(multiplier, inv_multiplier)` from [`multiplier_simd`].
///
/// # Returns
///
/// A tuple `(bull, bear, ema)` where:
/// * `bull` = `high − EMA` for each lane
/// * `bear` = `low − EMA` for each lane
/// * `ema` = updated EMA values for each lane
#[inline(always)]
pub fn calc_simd<const N: usize>(
high: Simd<f64, N>,
low: Simd<f64, N>,
close: Simd<f64, N>,
prev_ema: Simd<f64, N>,
multipliers: (Simd<f64, N>, Simd<f64, N>),
) -> (Simd<f64, N>, Simd<f64, N>, Simd<f64, N>) {
let ema = calc_ema_simd(close, prev_ema, multipliers);
(high - ema, low - ema, ema)
}