talib_cdl!(CDLDOJI, talib_rs::pattern::cdl_doji);
impl Default for CDLDOJI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHAMMER, talib_rs::pattern::cdl_hammer);
impl Default for CDLHAMMER {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLENGULFING, talib_rs::pattern::cdl_engulfing);
impl Default for CDLENGULFING {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLCLOSINGMARUBOZU, talib_rs::pattern::cdl_closingmarubozu);
impl Default for CDLCLOSINGMARUBOZU {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLDRAGONFLYDOJI, talib_rs::pattern::cdl_dragonflydoji);
impl Default for CDLDRAGONFLYDOJI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLGRAVESTONEDOJI, talib_rs::pattern::cdl_gravestonedoji);
impl Default for CDLGRAVESTONEDOJI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHIGHWAVE, talib_rs::pattern::cdl_highwave);
impl Default for CDLHIGHWAVE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLLONGLEGGEDDOJI, talib_rs::pattern::cdl_longleggeddoji);
impl Default for CDLLONGLEGGEDDOJI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLLONGLINE, talib_rs::pattern::cdl_longline);
impl Default for CDLLONGLINE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLMARUBOZU, talib_rs::pattern::cdl_marubozu);
impl Default for CDLMARUBOZU {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLRICKSHAWMAN, talib_rs::pattern::cdl_rickshawman);
impl Default for CDLRICKSHAWMAN {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSHORTLINE, talib_rs::pattern::cdl_shortline);
impl Default for CDLSHORTLINE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSPINNINGTOP, talib_rs::pattern::cdl_spinningtop);
impl Default for CDLSPINNINGTOP {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLTAKURI, talib_rs::pattern::cdl_takuri);
impl Default for CDLTAKURI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL2CROWS, talib_rs::pattern::cdl_2crows);
impl Default for CDL2CROWS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLCOUNTERATTACK, talib_rs::pattern::cdl_counterattack);
impl Default for CDLCOUNTERATTACK {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLDARKCLOUDCOVER, talib_rs::pattern::cdl_darkcloudcover);
impl Default for CDLDARKCLOUDCOVER {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLDOJISTAR, talib_rs::pattern::cdl_dojistar);
impl Default for CDLDOJISTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHANGINGMAN, talib_rs::pattern::cdl_hangingman);
impl Default for CDLHANGINGMAN {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHARAMI, talib_rs::pattern::cdl_harami);
impl Default for CDLHARAMI {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHARAMICROSS, talib_rs::pattern::cdl_haramicross);
impl Default for CDLHARAMICROSS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHIKKAKE, talib_rs::pattern::cdl_hikkake);
impl Default for CDLHIKKAKE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHIKKAKEMOD, talib_rs::pattern::cdl_hikkakemod);
impl Default for CDLHIKKAKEMOD {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLHOMINGPIGEON, talib_rs::pattern::cdl_homingpigeon);
impl Default for CDLHOMINGPIGEON {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLINNECK, talib_rs::pattern::cdl_inneck);
impl Default for CDLINNECK {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLINVERTEDHAMMER, talib_rs::pattern::cdl_invertedhammer);
impl Default for CDLINVERTEDHAMMER {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLKICKING, talib_rs::pattern::cdl_kicking);
impl Default for CDLKICKING {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLKICKINGBYLENGTH, talib_rs::pattern::cdl_kickingbylength);
impl Default for CDLKICKINGBYLENGTH {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLMATCHINGLOW, talib_rs::pattern::cdl_matchinglow);
impl Default for CDLMATCHINGLOW {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLONNECK, talib_rs::pattern::cdl_onneck);
impl Default for CDLONNECK {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLPIERCING, talib_rs::pattern::cdl_piercing);
impl Default for CDLPIERCING {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSEPARATINGLINES, talib_rs::pattern::cdl_separatinglines);
impl Default for CDLSEPARATINGLINES {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSHOOTINGSTAR, talib_rs::pattern::cdl_shootingstar);
impl Default for CDLSHOOTINGSTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSTICKSANDWICH, talib_rs::pattern::cdl_sticksandwich);
impl Default for CDLSTICKSANDWICH {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLTHRUSTING, talib_rs::pattern::cdl_thrusting);
impl Default for CDLTHRUSTING {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLBELTHOLD, talib_rs::pattern::cdl_belthold);
impl Default for CDLBELTHOLD {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3BLACKCROWS, talib_rs::pattern::cdl_3blackcrows);
impl Default for CDL3BLACKCROWS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3INSIDE, talib_rs::pattern::cdl_3inside);
impl Default for CDL3INSIDE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3LINESTRIKE, talib_rs::pattern::cdl_3linestrike);
impl Default for CDL3LINESTRIKE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3OUTSIDE, talib_rs::pattern::cdl_3outside);
impl Default for CDL3OUTSIDE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3STARSINSOUTH, talib_rs::pattern::cdl_3starsinsouth);
impl Default for CDL3STARSINSOUTH {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDL3WHITESOLDIERS, talib_rs::pattern::cdl_3whitesoldiers);
impl Default for CDL3WHITESOLDIERS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLABANDONEDBABY, talib_rs::pattern::cdl_abandonedbaby);
impl Default for CDLABANDONEDBABY {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLADVANCEBLOCK, talib_rs::pattern::cdl_advanceblock);
impl Default for CDLADVANCEBLOCK {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLBREAKAWAY, talib_rs::pattern::cdl_breakaway);
impl Default for CDLBREAKAWAY {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLCONCEALBABYSWALL, talib_rs::pattern::cdl_concealbabyswall);
impl Default for CDLCONCEALBABYSWALL {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLEVENINGDOJISTAR, talib_rs::pattern::cdl_eveningdojistar);
impl Default for CDLEVENINGDOJISTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLEVENINGSTAR, talib_rs::pattern::cdl_eveningstar);
impl Default for CDLEVENINGSTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLGAPSIDESIDEWHITE, talib_rs::pattern::cdl_gapsidesidewhite);
impl Default for CDLGAPSIDESIDEWHITE {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLIDENTICAL3CROWS, talib_rs::pattern::cdl_identical3crows);
impl Default for CDLIDENTICAL3CROWS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLLADDERBOTTOM, talib_rs::pattern::cdl_ladderbottom);
impl Default for CDLLADDERBOTTOM {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLMATHOLD, talib_rs::pattern::cdl_mathold);
impl Default for CDLMATHOLD {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLMORNINGDOJISTAR, talib_rs::pattern::cdl_morningdojistar);
impl Default for CDLMORNINGDOJISTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLMORNINGSTAR, talib_rs::pattern::cdl_morningstar);
impl Default for CDLMORNINGSTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLRISEFALL3METHODS, talib_rs::pattern::cdl_risefall3methods);
impl Default for CDLRISEFALL3METHODS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLSTALLEDPATTERN, talib_rs::pattern::cdl_stalledpattern);
impl Default for CDLSTALLEDPATTERN {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLTASUKIGAP, talib_rs::pattern::cdl_tasukigap);
impl Default for CDLTASUKIGAP {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLTRISTAR, talib_rs::pattern::cdl_tristar);
impl Default for CDLTRISTAR {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLUNIQUE3RIVER, talib_rs::pattern::cdl_unique3river);
impl Default for CDLUNIQUE3RIVER {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLUPSIDEGAP2CROWS, talib_rs::pattern::cdl_upsidegap2crows);
impl Default for CDLUPSIDEGAP2CROWS {
fn default() -> Self {
Self::new()
}
}
talib_cdl!(CDLXSIDEGAP3METHODS, talib_rs::pattern::cdl_xsidegap3methods);
impl Default for CDLXSIDEGAP3METHODS {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::traits::Next;
use proptest::prelude::*;
proptest! {
#[test]
fn test_cdl_doji_parity(
o in prop::collection::vec(10.0..100.0, 1..100),
h in prop::collection::vec(10.0..100.0, 1..100),
l in prop::collection::vec(10.0..100.0, 1..100),
c in prop::collection::vec(10.0..100.0, 1..100)
) {
let len = o.len().min(h.len()).min(l.len()).min(c.len());
if len == 0 { return Ok(()); }
let mut doji = CDLDOJI::new();
let streaming_results: Vec<f64> = (0..len).map(|i| doji.next((o[i], h[i], l[i], c[i]))).collect();
let batch_results = talib_rs::pattern::cdl_doji(&o[..len], &h[..len], &l[..len], &c[..len]).unwrap_or_else(|_| vec![0; len]);
for (s, b) in streaming_results.iter().zip(batch_results.iter()) {
assert_eq!(*s as i32, *b);
}
}
#[test]
fn test_cdl_hammer_parity(
o in prop::collection::vec(10.0..100.0, 1..100),
h in prop::collection::vec(10.0..100.0, 1..100),
l in prop::collection::vec(10.0..100.0, 1..100),
c in prop::collection::vec(10.0..100.0, 1..100)
) {
let len = o.len().min(h.len()).min(l.len()).min(c.len());
if len == 0 { return Ok(()); }
let mut hammer = CDLHAMMER::new();
let streaming_results: Vec<f64> = (0..len).map(|i| hammer.next((o[i], h[i], l[i], c[i]))).collect();
let batch_results = talib_rs::pattern::cdl_hammer(&o[..len], &h[..len], &l[..len], &c[..len]).unwrap_or_else(|_| vec![0; len]);
for (s, b) in streaming_results.iter().zip(batch_results.iter()) {
assert_eq!(*s as i32, *b);
}
}
}
}