Skip to main content

quantwave_core/indicators/
pattern.rs

1talib_cdl!(CDLDOJI, talib_rs::pattern::cdl_doji);
2impl Default for CDLDOJI {
3    fn default() -> Self {
4        Self::new()
5    }
6}
7talib_cdl!(CDLHAMMER, talib_rs::pattern::cdl_hammer);
8impl Default for CDLHAMMER {
9    fn default() -> Self {
10        Self::new()
11    }
12}
13talib_cdl!(CDLENGULFING, talib_rs::pattern::cdl_engulfing);
14impl Default for CDLENGULFING {
15    fn default() -> Self {
16        Self::new()
17    }
18}
19talib_cdl!(CDLCLOSINGMARUBOZU, talib_rs::pattern::cdl_closingmarubozu);
20impl Default for CDLCLOSINGMARUBOZU {
21    fn default() -> Self {
22        Self::new()
23    }
24}
25talib_cdl!(CDLDRAGONFLYDOJI, talib_rs::pattern::cdl_dragonflydoji);
26impl Default for CDLDRAGONFLYDOJI {
27    fn default() -> Self {
28        Self::new()
29    }
30}
31talib_cdl!(CDLGRAVESTONEDOJI, talib_rs::pattern::cdl_gravestonedoji);
32impl Default for CDLGRAVESTONEDOJI {
33    fn default() -> Self {
34        Self::new()
35    }
36}
37talib_cdl!(CDLHIGHWAVE, talib_rs::pattern::cdl_highwave);
38impl Default for CDLHIGHWAVE {
39    fn default() -> Self {
40        Self::new()
41    }
42}
43talib_cdl!(CDLLONGLEGGEDDOJI, talib_rs::pattern::cdl_longleggeddoji);
44impl Default for CDLLONGLEGGEDDOJI {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49talib_cdl!(CDLLONGLINE, talib_rs::pattern::cdl_longline);
50impl Default for CDLLONGLINE {
51    fn default() -> Self {
52        Self::new()
53    }
54}
55talib_cdl!(CDLMARUBOZU, talib_rs::pattern::cdl_marubozu);
56impl Default for CDLMARUBOZU {
57    fn default() -> Self {
58        Self::new()
59    }
60}
61talib_cdl!(CDLRICKSHAWMAN, talib_rs::pattern::cdl_rickshawman);
62impl Default for CDLRICKSHAWMAN {
63    fn default() -> Self {
64        Self::new()
65    }
66}
67talib_cdl!(CDLSHORTLINE, talib_rs::pattern::cdl_shortline);
68impl Default for CDLSHORTLINE {
69    fn default() -> Self {
70        Self::new()
71    }
72}
73talib_cdl!(CDLSPINNINGTOP, talib_rs::pattern::cdl_spinningtop);
74impl Default for CDLSPINNINGTOP {
75    fn default() -> Self {
76        Self::new()
77    }
78}
79talib_cdl!(CDLTAKURI, talib_rs::pattern::cdl_takuri);
80impl Default for CDLTAKURI {
81    fn default() -> Self {
82        Self::new()
83    }
84}
85talib_cdl!(CDL2CROWS, talib_rs::pattern::cdl_2crows);
86impl Default for CDL2CROWS {
87    fn default() -> Self {
88        Self::new()
89    }
90}
91talib_cdl!(CDLCOUNTERATTACK, talib_rs::pattern::cdl_counterattack);
92impl Default for CDLCOUNTERATTACK {
93    fn default() -> Self {
94        Self::new()
95    }
96}
97talib_cdl!(CDLDARKCLOUDCOVER, talib_rs::pattern::cdl_darkcloudcover);
98impl Default for CDLDARKCLOUDCOVER {
99    fn default() -> Self {
100        Self::new()
101    }
102}
103talib_cdl!(CDLDOJISTAR, talib_rs::pattern::cdl_dojistar);
104impl Default for CDLDOJISTAR {
105    fn default() -> Self {
106        Self::new()
107    }
108}
109talib_cdl!(CDLHANGINGMAN, talib_rs::pattern::cdl_hangingman);
110impl Default for CDLHANGINGMAN {
111    fn default() -> Self {
112        Self::new()
113    }
114}
115talib_cdl!(CDLHARAMI, talib_rs::pattern::cdl_harami);
116impl Default for CDLHARAMI {
117    fn default() -> Self {
118        Self::new()
119    }
120}
121talib_cdl!(CDLHARAMICROSS, talib_rs::pattern::cdl_haramicross);
122impl Default for CDLHARAMICROSS {
123    fn default() -> Self {
124        Self::new()
125    }
126}
127talib_cdl!(CDLHIKKAKE, talib_rs::pattern::cdl_hikkake);
128impl Default for CDLHIKKAKE {
129    fn default() -> Self {
130        Self::new()
131    }
132}
133talib_cdl!(CDLHIKKAKEMOD, talib_rs::pattern::cdl_hikkakemod);
134impl Default for CDLHIKKAKEMOD {
135    fn default() -> Self {
136        Self::new()
137    }
138}
139talib_cdl!(CDLHOMINGPIGEON, talib_rs::pattern::cdl_homingpigeon);
140impl Default for CDLHOMINGPIGEON {
141    fn default() -> Self {
142        Self::new()
143    }
144}
145talib_cdl!(CDLINNECK, talib_rs::pattern::cdl_inneck);
146impl Default for CDLINNECK {
147    fn default() -> Self {
148        Self::new()
149    }
150}
151talib_cdl!(CDLINVERTEDHAMMER, talib_rs::pattern::cdl_invertedhammer);
152impl Default for CDLINVERTEDHAMMER {
153    fn default() -> Self {
154        Self::new()
155    }
156}
157talib_cdl!(CDLKICKING, talib_rs::pattern::cdl_kicking);
158impl Default for CDLKICKING {
159    fn default() -> Self {
160        Self::new()
161    }
162}
163talib_cdl!(CDLKICKINGBYLENGTH, talib_rs::pattern::cdl_kickingbylength);
164impl Default for CDLKICKINGBYLENGTH {
165    fn default() -> Self {
166        Self::new()
167    }
168}
169talib_cdl!(CDLMATCHINGLOW, talib_rs::pattern::cdl_matchinglow);
170impl Default for CDLMATCHINGLOW {
171    fn default() -> Self {
172        Self::new()
173    }
174}
175talib_cdl!(CDLONNECK, talib_rs::pattern::cdl_onneck);
176impl Default for CDLONNECK {
177    fn default() -> Self {
178        Self::new()
179    }
180}
181talib_cdl!(CDLPIERCING, talib_rs::pattern::cdl_piercing);
182impl Default for CDLPIERCING {
183    fn default() -> Self {
184        Self::new()
185    }
186}
187talib_cdl!(CDLSEPARATINGLINES, talib_rs::pattern::cdl_separatinglines);
188impl Default for CDLSEPARATINGLINES {
189    fn default() -> Self {
190        Self::new()
191    }
192}
193talib_cdl!(CDLSHOOTINGSTAR, talib_rs::pattern::cdl_shootingstar);
194impl Default for CDLSHOOTINGSTAR {
195    fn default() -> Self {
196        Self::new()
197    }
198}
199talib_cdl!(CDLSTICKSANDWICH, talib_rs::pattern::cdl_sticksandwich);
200impl Default for CDLSTICKSANDWICH {
201    fn default() -> Self {
202        Self::new()
203    }
204}
205talib_cdl!(CDLTHRUSTING, talib_rs::pattern::cdl_thrusting);
206impl Default for CDLTHRUSTING {
207    fn default() -> Self {
208        Self::new()
209    }
210}
211talib_cdl!(CDLBELTHOLD, talib_rs::pattern::cdl_belthold);
212impl Default for CDLBELTHOLD {
213    fn default() -> Self {
214        Self::new()
215    }
216}
217talib_cdl!(CDL3BLACKCROWS, talib_rs::pattern::cdl_3blackcrows);
218impl Default for CDL3BLACKCROWS {
219    fn default() -> Self {
220        Self::new()
221    }
222}
223talib_cdl!(CDL3INSIDE, talib_rs::pattern::cdl_3inside);
224impl Default for CDL3INSIDE {
225    fn default() -> Self {
226        Self::new()
227    }
228}
229talib_cdl!(CDL3LINESTRIKE, talib_rs::pattern::cdl_3linestrike);
230impl Default for CDL3LINESTRIKE {
231    fn default() -> Self {
232        Self::new()
233    }
234}
235talib_cdl!(CDL3OUTSIDE, talib_rs::pattern::cdl_3outside);
236impl Default for CDL3OUTSIDE {
237    fn default() -> Self {
238        Self::new()
239    }
240}
241talib_cdl!(CDL3STARSINSOUTH, talib_rs::pattern::cdl_3starsinsouth);
242impl Default for CDL3STARSINSOUTH {
243    fn default() -> Self {
244        Self::new()
245    }
246}
247talib_cdl!(CDL3WHITESOLDIERS, talib_rs::pattern::cdl_3whitesoldiers);
248impl Default for CDL3WHITESOLDIERS {
249    fn default() -> Self {
250        Self::new()
251    }
252}
253talib_cdl!(CDLABANDONEDBABY, talib_rs::pattern::cdl_abandonedbaby);
254impl Default for CDLABANDONEDBABY {
255    fn default() -> Self {
256        Self::new()
257    }
258}
259talib_cdl!(CDLADVANCEBLOCK, talib_rs::pattern::cdl_advanceblock);
260impl Default for CDLADVANCEBLOCK {
261    fn default() -> Self {
262        Self::new()
263    }
264}
265talib_cdl!(CDLBREAKAWAY, talib_rs::pattern::cdl_breakaway);
266impl Default for CDLBREAKAWAY {
267    fn default() -> Self {
268        Self::new()
269    }
270}
271talib_cdl!(CDLCONCEALBABYSWALL, talib_rs::pattern::cdl_concealbabyswall);
272impl Default for CDLCONCEALBABYSWALL {
273    fn default() -> Self {
274        Self::new()
275    }
276}
277talib_cdl!(CDLEVENINGDOJISTAR, talib_rs::pattern::cdl_eveningdojistar);
278impl Default for CDLEVENINGDOJISTAR {
279    fn default() -> Self {
280        Self::new()
281    }
282}
283talib_cdl!(CDLEVENINGSTAR, talib_rs::pattern::cdl_eveningstar);
284impl Default for CDLEVENINGSTAR {
285    fn default() -> Self {
286        Self::new()
287    }
288}
289talib_cdl!(CDLGAPSIDESIDEWHITE, talib_rs::pattern::cdl_gapsidesidewhite);
290impl Default for CDLGAPSIDESIDEWHITE {
291    fn default() -> Self {
292        Self::new()
293    }
294}
295talib_cdl!(CDLIDENTICAL3CROWS, talib_rs::pattern::cdl_identical3crows);
296impl Default for CDLIDENTICAL3CROWS {
297    fn default() -> Self {
298        Self::new()
299    }
300}
301talib_cdl!(CDLLADDERBOTTOM, talib_rs::pattern::cdl_ladderbottom);
302impl Default for CDLLADDERBOTTOM {
303    fn default() -> Self {
304        Self::new()
305    }
306}
307talib_cdl!(CDLMATHOLD, talib_rs::pattern::cdl_mathold);
308impl Default for CDLMATHOLD {
309    fn default() -> Self {
310        Self::new()
311    }
312}
313talib_cdl!(CDLMORNINGDOJISTAR, talib_rs::pattern::cdl_morningdojistar);
314impl Default for CDLMORNINGDOJISTAR {
315    fn default() -> Self {
316        Self::new()
317    }
318}
319talib_cdl!(CDLMORNINGSTAR, talib_rs::pattern::cdl_morningstar);
320impl Default for CDLMORNINGSTAR {
321    fn default() -> Self {
322        Self::new()
323    }
324}
325talib_cdl!(CDLRISEFALL3METHODS, talib_rs::pattern::cdl_risefall3methods);
326impl Default for CDLRISEFALL3METHODS {
327    fn default() -> Self {
328        Self::new()
329    }
330}
331talib_cdl!(CDLSTALLEDPATTERN, talib_rs::pattern::cdl_stalledpattern);
332impl Default for CDLSTALLEDPATTERN {
333    fn default() -> Self {
334        Self::new()
335    }
336}
337talib_cdl!(CDLTASUKIGAP, talib_rs::pattern::cdl_tasukigap);
338impl Default for CDLTASUKIGAP {
339    fn default() -> Self {
340        Self::new()
341    }
342}
343talib_cdl!(CDLTRISTAR, talib_rs::pattern::cdl_tristar);
344impl Default for CDLTRISTAR {
345    fn default() -> Self {
346        Self::new()
347    }
348}
349talib_cdl!(CDLUNIQUE3RIVER, talib_rs::pattern::cdl_unique3river);
350impl Default for CDLUNIQUE3RIVER {
351    fn default() -> Self {
352        Self::new()
353    }
354}
355talib_cdl!(CDLUPSIDEGAP2CROWS, talib_rs::pattern::cdl_upsidegap2crows);
356impl Default for CDLUPSIDEGAP2CROWS {
357    fn default() -> Self {
358        Self::new()
359    }
360}
361talib_cdl!(CDLXSIDEGAP3METHODS, talib_rs::pattern::cdl_xsidegap3methods);
362impl Default for CDLXSIDEGAP3METHODS {
363    fn default() -> Self {
364        Self::new()
365    }
366}
367
368#[cfg(test)]
369mod tests {
370    use super::*;
371    use crate::traits::Next;
372    use proptest::prelude::*;
373
374    proptest! {
375        #[test]
376        fn test_cdl_doji_parity(
377            o in prop::collection::vec(10.0..100.0, 1..100),
378            h in prop::collection::vec(10.0..100.0, 1..100),
379            l in prop::collection::vec(10.0..100.0, 1..100),
380            c in prop::collection::vec(10.0..100.0, 1..100)
381        ) {
382            let len = o.len().min(h.len()).min(l.len()).min(c.len());
383            if len == 0 { return Ok(()); }
384
385            let mut doji = CDLDOJI::new();
386            let streaming_results: Vec<f64> = (0..len).map(|i| doji.next((o[i], h[i], l[i], c[i]))).collect();
387            let batch_results = talib_rs::pattern::cdl_doji(&o[..len], &h[..len], &l[..len], &c[..len]).unwrap_or_else(|_| vec![0; len]);
388
389            for (s, b) in streaming_results.iter().zip(batch_results.iter()) {
390                assert_eq!(*s as i32, *b);
391            }
392        }
393
394        #[test]
395        fn test_cdl_hammer_parity(
396            o in prop::collection::vec(10.0..100.0, 1..100),
397            h in prop::collection::vec(10.0..100.0, 1..100),
398            l in prop::collection::vec(10.0..100.0, 1..100),
399            c in prop::collection::vec(10.0..100.0, 1..100)
400        ) {
401            let len = o.len().min(h.len()).min(l.len()).min(c.len());
402            if len == 0 { return Ok(()); }
403
404            let mut hammer = CDLHAMMER::new();
405            let streaming_results: Vec<f64> = (0..len).map(|i| hammer.next((o[i], h[i], l[i], c[i]))).collect();
406            let batch_results = talib_rs::pattern::cdl_hammer(&o[..len], &h[..len], &l[..len], &c[..len]).unwrap_or_else(|_| vec![0; len]);
407
408            for (s, b) in streaming_results.iter().zip(batch_results.iter()) {
409                assert_eq!(*s as i32, *b);
410            }
411        }
412    }
413}