Skip to main content

trading_toolkit/indicator/
elder_ray.rs

1use super::MovingAverage;
2use crate::types::{
3    data::{BaseData, Candle},
4    error::ToolkitError,
5};
6
7#[derive(Debug, Clone, Copy)]
8pub struct ElderRay {
9    /// seller's force
10    ask_force: f64,
11    /// buyer's force
12    bid_force: f64,
13}
14
15impl ElderRay {
16    pub fn new<T>(data: &[T]) -> Result<Self, ToolkitError>
17    where
18        T: Candle + BaseData + Clone,
19    {
20        if data.len() == 0 {
21            return Err(ToolkitError::EmptyData);
22        }
23        let mut sorted = data.to_vec().clone();
24        sorted.sort_by_key(|k| Candle::epoch_time(k));
25
26        let ema = MovingAverage::exponential(data).inner();
27        let last = sorted.last().ok_or(ToolkitError::EmptyData)?;
28
29        Ok(Self {
30            ask_force: last.low_price() - ema,
31            bid_force: last.high_price() - ema,
32        })
33    }
34
35    pub fn ask_force(&self) -> f64 {
36        self.ask_force
37    }
38
39    pub fn bid_force(&self) -> f64 {
40        self.bid_force
41    }
42}