quantwave_core/indicators/patterns/
cdllongleggeddoji.rs1use 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; #[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}