Skip to main content

quantwave_core/indicators/patterns/
cdllongleggeddoji.rs

1//! Native O(1) streaming CDLLONGLEGGEDDOJI (matches `talib_rs::pattern::cdl_longleggeddoji`).
2//! Source: TA-Lib
3
4use crate::indicators::patterns::candle_settings::{
5    BODY_DOJI, CandleWindow, RollingCandleAvg, SHADOW_LONG, lower_shadow, real_body, upper_shadow,
6};
7use crate::traits::Next;
8
9const LOOKBACK: usize = 10; // max(10, 0)
10
11#[derive(Debug, Clone)]
12#[allow(non_camel_case_types)]
13pub struct CDLLONGLEGGEDDOJI {
14    bars_seen: usize,
15    window: CandleWindow,
16    body_doji: RollingCandleAvg,
17    shadow_long: RollingCandleAvg,
18}
19
20impl CDLLONGLEGGEDDOJI {
21    pub fn new() -> Self {
22        Self {
23            bars_seen: 0,
24            window: CandleWindow::new(1),
25            body_doji: RollingCandleAvg::new(BODY_DOJI),
26            shadow_long: RollingCandleAvg::new(SHADOW_LONG),
27        }
28    }
29}
30
31impl Default for CDLLONGLEGGEDDOJI {
32    fn default() -> Self {
33        Self::new()
34    }
35}
36
37impl Next<(f64, f64, f64, f64)> for CDLLONGLEGGEDDOJI {
38    type Output = f64;
39
40    fn next(&mut self, (open, high, low, close): (f64, f64, f64, f64)) -> Self::Output {
41        self.bars_seen += 1;
42        self.window.push(open, high, low, close);
43        self.body_doji.push(open, high, low, close);
44        self.shadow_long.push(open, high, low, close);
45
46        if self.bars_seen <= LOOKBACK {
47            return 0.0;
48        }
49
50        let curr = self.window.bar(0);
51
52        let out = (real_body(curr.open, curr.close) <= self.body_doji.val(0)
53            && (lower_shadow(curr.open, curr.low, curr.close) > self.shadow_long.val(0)
54                || upper_shadow(curr.open, curr.high, curr.close) > self.shadow_long.val(0)))
55            as i32
56            * 100;
57
58        out as f64
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65    crate::test_pattern_parity!(
66        test_cdllongleggeddoji_parity,
67        CDLLONGLEGGEDDOJI,
68        talib_rs::pattern::cdl_longleggeddoji
69    );
70}