trading_toolkit/indicator/
elder_ray.rs1use super::MovingAverage;
2use crate::types::{
3 data::{BaseData, Candle},
4 error::ToolkitError,
5};
6
7#[derive(Debug, Clone, Copy)]
8pub struct ElderRay {
9 ask_force: f64,
11 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}