quantwave_core/indicators/
pattern.rs1talib_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}