From 91531d7be1c0e0981e2aa19a816269da3bbeb702 Mon Sep 17 00:00:00 2001 From: m5l14i11 Date: Sat, 27 Apr 2024 16:43:10 +0300 Subject: [PATCH] upd --- core/models/strategy_ref.py | 1 + ta_lib/benches/strategy.rs | 15 +++++++- ta_lib/strategies/base/src/ffi.rs | 2 ++ ta_lib/strategies/base/src/model.rs | 24 +++++++++---- ta_lib/strategies/base/src/source.rs | 6 ++++ ta_lib/strategies/base/src/strategy.rs | 26 +++++++------- ta_lib/strategies/baseline/src/ma.rs | 2 +- ta_lib/strategies/confirm/src/dso.rs | 16 ++++++++- ta_lib/strategies/confirm/src/vi.rs | 11 +++++- ta_lib/strategies/pulse/src/braid.rs | 15 ++++++++ .../signal/src/flip/supertrend_flip.rs | 36 +++++++++++++++++++ .../src/neutrality/dso_neutrality_cross.rs | 2 +- .../src/neutrality/rsi_neutrality_cross.rs | 2 +- .../src/neutrality/rsi_neutrality_pullback.rs | 2 +- .../neutrality/rsi_neutrality_rejection.rs | 2 +- .../src/neutrality/tii_neutrality_cross.rs | 2 +- .../signal/src/pattern/macd_colorswitch.rs | 2 +- ta_lib/strategies/signal/src/pattern/rsi_v.rs | 2 +- ta_lib/strategies/signal/src/pattern/tii_v.rs | 2 +- .../signal/src/reversal/dmi_reversal.rs | 9 ++++- .../signal/src/reversal/vi_reversal.rs | 16 ++++++++- .../signal/src/signalline/di_signalline.rs | 2 +- .../signal/src/signalline/dso_signalline.rs | 2 +- .../signal/src/signalline/kst_signalline.rs | 2 +- .../signal/src/signalline/macd_signalline.rs | 2 +- .../signal/src/signalline/rsi_signalline.rs | 2 +- .../signal/src/signalline/trix_signalline.rs | 2 +- .../signal/src/signalline/tsi_signalline.rs | 2 +- .../signal/src/zerocross/apo_zerocross.rs | 2 +- .../signal/src/zerocross/cc_zerocross.rs | 2 +- .../signal/src/zerocross/cfo_zerocross.rs | 2 +- .../signal/src/zerocross/di_zerocross.rs | 2 +- .../signal/src/zerocross/macd_zerocross.rs | 2 +- .../signal/src/zerocross/roc_zerocross.rs | 2 +- .../signal/src/zerocross/trix_zerocross.rs | 2 +- .../signal/src/zerocross/tsi_zerocross.rs | 2 +- 36 files changed, 175 insertions(+), 50 deletions(-) diff --git a/core/models/strategy_ref.py b/core/models/strategy_ref.py index 8e3d1364..87af78ca 100644 --- a/core/models/strategy_ref.py +++ b/core/models/strategy_ref.py @@ -46,6 +46,7 @@ def next( [raw_action, price] = exports["strategy_next"]( self.store_ref, self.id, + ohlcv.timestamp, ohlcv.open, ohlcv.high, ohlcv.low, diff --git a/ta_lib/benches/strategy.rs b/ta_lib/benches/strategy.rs index c3c768fe..af766597 100644 --- a/ta_lib/benches/strategy.rs +++ b/ta_lib/benches/strategy.rs @@ -4,6 +4,17 @@ use std::collections::VecDeque; fn model(c: &mut Criterion) { let mut group = c.benchmark_group("model"); + let ts: Vec = vec![ + 1679827200, 1679827500, 1679827800, 1679828100, 1679828400, 1679828700, 1679829000, + 1679829300, 1679829600, 1679829900, 1679830200, 1679830500, 1679830800, 1679831100, + 1679831400, 1679831700, 1679832000, 1679832300, 1679832600, 1679832900, 1679833200, + 1679833500, 1679833800, 1679834100, 1679834400, 1679834700, 1679835000, 1679835300, + 1679835600, 1679835900, 1679836200, 1679836500, 1679836800, 1679837100, 1679837400, + 1679837700, 1679838000, 1679838300, 1679838600, 1679838900, 1679839200, 1679839500, + 1679839800, 1679840100, 1679840400, 1679840700, 1679841000, 1679841300, 1679841600, + 1679841900, 1679842200, + ]; + let open: Vec = vec![ 6.8430, 6.8660, 6.8635, 6.8610, 6.865, 6.8595, 6.8565, 6.852, 6.859, 6.86, 6.8580, 6.8605, 6.8620, 6.867, 6.859, 6.8670, 6.8640, 6.8575, 6.8485, 6.8350, 7.1195, 7.136, 7.1405, 7.112, @@ -56,7 +67,9 @@ fn model(c: &mut Criterion) { .zip(low.iter()) .zip(close.iter()) .zip(volume.iter()) - .map(|((((&o, &h), &l), &c), &v)| OHLCV { + .zip(ts.iter()) + .map(|(((((&o, &h), &l), &c), &v), &t)| OHLCV { + ts: t, open: o, high: h, low: l, diff --git a/ta_lib/strategies/base/src/ffi.rs b/ta_lib/strategies/base/src/ffi.rs index a35a91e8..9e5db873 100644 --- a/ta_lib/strategies/base/src/ffi.rs +++ b/ta_lib/strategies/base/src/ffi.rs @@ -44,6 +44,7 @@ pub fn unregister_strategy(strategy_id: i32) -> i32 { #[no_mangle] pub fn strategy_next( strategy_id: i32, + ts: i64, open: f32, high: f32, low: f32, @@ -53,6 +54,7 @@ pub fn strategy_next( let mut strategies = STRATEGY_ID_TO_INSTANCE.write().unwrap(); if let Some(strategy) = strategies.get_mut(&strategy_id) { let ohlcv = OHLCV { + ts, open, high, low, diff --git a/ta_lib/strategies/base/src/model.rs b/ta_lib/strategies/base/src/model.rs index 94060840..d115707c 100644 --- a/ta_lib/strategies/base/src/model.rs +++ b/ta_lib/strategies/base/src/model.rs @@ -1,8 +1,9 @@ use core::prelude::*; -use std::collections::VecDeque; +use std::collections::{HashSet, VecDeque}; #[derive(Debug, Copy, Clone)] pub struct OHLCV { + pub ts: i64, pub open: f32, pub high: f32, pub low: f32, @@ -29,12 +30,21 @@ impl OHLCVSeries { let mut close = Vec::with_capacity(len); let mut volume = Vec::with_capacity(len); - for ohlcv in data.iter() { - open.push(ohlcv.open); - high.push(ohlcv.high); - low.push(ohlcv.low); - close.push(ohlcv.close); - volume.push(ohlcv.volume); + let mut visited = HashSet::new(); + + let mut sorted_data: Vec<_> = data.iter().collect(); + sorted_data.sort_by_key(|v| v.ts); + + for ohlcv in sorted_data.iter() { + if !visited.contains(&ohlcv.ts) { + open.push(ohlcv.open); + high.push(ohlcv.high); + low.push(ohlcv.low); + close.push(ohlcv.close); + volume.push(ohlcv.volume); + + visited.insert(ohlcv.ts); + } } Self { diff --git a/ta_lib/strategies/base/src/source.rs b/ta_lib/strategies/base/src/source.rs index 2ba439a0..73b2c191 100644 --- a/ta_lib/strategies/base/src/source.rs +++ b/ta_lib/strategies/base/src/source.rs @@ -3,6 +3,7 @@ use core::prelude::*; use price::prelude::*; pub trait Source { + fn close(&self) -> Series; fn hl2(&self) -> Series; fn hlc3(&self) -> Series; fn hlcc4(&self) -> Series; @@ -10,6 +11,11 @@ pub trait Source { } impl Source for OHLCVSeries { + #[inline] + fn close(&self) -> Series { + self.close.clone() + } + #[inline] fn hl2(&self) -> Series { median_price(&self.high, &self.low) diff --git a/ta_lib/strategies/base/src/strategy.rs b/ta_lib/strategies/base/src/strategy.rs index 9debbf4f..5ef2ee38 100644 --- a/ta_lib/strategies/base/src/strategy.rs +++ b/ta_lib/strategies/base/src/strategy.rs @@ -65,7 +65,9 @@ impl BaseStrategy { } fn store(&mut self, data: OHLCV) { - if self.data.len() >= self.lookback_period { + let buf_size = (self.lookback_period as f32 * 1.3) as usize; + + if self.data.len() > buf_size { self.data.pop_front(); } @@ -77,6 +79,7 @@ impl BaseStrategy { self.data.len() >= self.lookback_period } + #[inline(always)] fn ohlcv_series(&self) -> OHLCVSeries { OHLCVSeries::from_data(&self.data) } @@ -93,10 +96,10 @@ impl Strategy for BaseStrategy { let theo_price = self.suggested_entry(); match self.trade_signals() { - (true, _, false, false) => TradeAction::GoLong(theo_price), - (_, true, false, false) => TradeAction::GoShort(theo_price), - (false, false, true, _) => TradeAction::ExitLong(data.close), - (false, false, _, true) => TradeAction::ExitShort(data.close), + (true, false, false, false) => TradeAction::GoLong(theo_price), + (false, true, false, false) => TradeAction::GoShort(theo_price), + (false, false, true, false) => TradeAction::ExitLong(data.close), + (false, false, false, true) => TradeAction::ExitShort(data.close), _ => TradeAction::DoNothing, } } @@ -129,14 +132,8 @@ impl BaseStrategy { let (filter_long_baseline, filter_short_baseline) = self.base_line.filter(&series); let (exit_long_eval, exit_short_eval) = self.exit.evaluate(&series); - let prev_go_long_trigger = go_long_trigger.shift(1); - let prev_go_short_trigger = go_short_trigger.shift(1); - - let go_long_trigger_signal = go_long_trigger | prev_go_long_trigger; - let go_short_trigger_signal = go_short_trigger | prev_go_short_trigger; - - let go_long_signal = go_long_trigger_signal | go_long_baseline; - let go_short_signal = go_short_trigger_signal | go_short_baseline; + let go_long_signal = go_long_trigger | go_long_baseline; + let go_short_signal = go_short_trigger | go_short_baseline; let go_long = (go_long_signal & filter_long_baseline & go_long_confirm & go_long_momentum) .last() @@ -153,7 +150,7 @@ impl BaseStrategy { } fn suggested_entry(&self) -> f32 { - self.ohlcv_series().hlc3().last().unwrap_or(std::f32::NAN) + self.ohlcv_series().ohlc4().last().unwrap_or(std::f32::NAN) } fn stop_loss_levels(&self) -> (f32, f32) { @@ -307,6 +304,7 @@ mod tests { let ohlcvs = vec![ OHLCV { + ts: 1710297600000, open: 1.0, high: 2.0, low: 0.5, diff --git a/ta_lib/strategies/baseline/src/ma.rs b/ta_lib/strategies/baseline/src/ma.rs index 05629e6d..30beeea6 100644 --- a/ta_lib/strategies/baseline/src/ma.rs +++ b/ta_lib/strategies/baseline/src/ma.rs @@ -19,7 +19,7 @@ impl MaBaseLine { period: period as usize, signal: vec![ Box::new(MaSurpassSignal::new(ma, period)), - Box::new(MaQuadrupleSignal::new(ma, period)), + // Box::new(MaQuadrupleSignal::new(ma, period)), ], } } diff --git a/ta_lib/strategies/confirm/src/dso.rs b/ta_lib/strategies/confirm/src/dso.rs index e85a8dbf..748366b1 100644 --- a/ta_lib/strategies/confirm/src/dso.rs +++ b/ta_lib/strategies/confirm/src/dso.rs @@ -42,7 +42,6 @@ impl Confirm for DsoConfirm { #[cfg(test)] mod tests { use super::*; - use core::prelude::*; use std::collections::VecDeque; #[test] @@ -50,6 +49,7 @@ mod tests { let confirm = DsoConfirm::new(Smooth::EMA, 13.0, 8.0, 9.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 4.8914, high: 4.9045, low: 4.8895, @@ -57,6 +57,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 4.8995, high: 4.9073, low: 4.8995, @@ -64,6 +65,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 4.9061, high: 4.9070, low: 4.9001, @@ -71,6 +73,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 4.9001, high: 4.9053, low: 4.8995, @@ -78,6 +81,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 4.9053, high: 4.9093, low: 4.9046, @@ -85,6 +89,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 4.9087, high: 4.9154, low: 4.9087, @@ -92,6 +97,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 4.9131, high: 4.9131, low: 4.9040, @@ -99,6 +105,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 4.9041, high: 4.9068, low: 4.8988, @@ -106,6 +113,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829600, open: 4.9023, high: 4.9051, low: 4.8949, @@ -113,6 +121,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829900, open: 4.9010, high: 4.9052, low: 4.8969, @@ -120,6 +129,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830200, open: 4.8969, high: 4.8969, low: 4.8819, @@ -127,6 +137,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830500, open: 4.8895, high: 4.8928, low: 4.8851, @@ -134,6 +145,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830800, open: 4.8901, high: 4.8910, low: 4.8813, @@ -141,6 +153,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831100, open: 4.8855, high: 4.8864, low: 4.8816, @@ -148,6 +161,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831400, open: 4.8824, high: 4.8934, low: 4.8814, diff --git a/ta_lib/strategies/confirm/src/vi.rs b/ta_lib/strategies/confirm/src/vi.rs index 43ffba6f..189e5b73 100644 --- a/ta_lib/strategies/confirm/src/vi.rs +++ b/ta_lib/strategies/confirm/src/vi.rs @@ -36,7 +36,6 @@ impl Confirm for ViConfirm { #[cfg(test)] mod tests { use super::*; - use core::prelude::*; use std::collections::VecDeque; #[test] @@ -44,6 +43,7 @@ mod tests { let confirm = ViConfirm::new(1.0, 3.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 6.490, high: 6.514, low: 6.490, @@ -51,6 +51,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 6.511, high: 6.522, low: 6.506, @@ -58,6 +59,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 6.512, high: 6.513, low: 6.496, @@ -65,6 +67,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 6.512, high: 6.528, low: 6.507, @@ -72,6 +75,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 6.527, high: 6.530, low: 6.497, @@ -79,6 +83,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 6.500, high: 6.508, low: 6.489, @@ -86,6 +91,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 6.505, high: 6.510, low: 6.483, @@ -93,6 +99,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 6.492, high: 6.496, low: 6.481, @@ -100,6 +107,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829600, open: 6.491, high: 6.512, low: 6.486, @@ -107,6 +115,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829900, open: 6.499, high: 6.500, low: 6.481, diff --git a/ta_lib/strategies/pulse/src/braid.rs b/ta_lib/strategies/pulse/src/braid.rs index 5fe7ba15..39bec469 100644 --- a/ta_lib/strategies/pulse/src/braid.rs +++ b/ta_lib/strategies/pulse/src/braid.rs @@ -69,6 +69,7 @@ mod tests { let pulse = BraidPulse::new(Smooth::LSMA, 3.0, 14.0, 7.0, 40.0, 14.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 4.8914, high: 4.9045, low: 4.8895, @@ -76,6 +77,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 4.8995, high: 4.9073, low: 4.8995, @@ -83,6 +85,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 4.9061, high: 4.9070, low: 4.9001, @@ -90,6 +93,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 4.9001, high: 4.9053, low: 4.8995, @@ -97,6 +101,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 4.9053, high: 4.9093, low: 4.9046, @@ -104,6 +109,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 4.9087, high: 4.9154, low: 4.9087, @@ -111,6 +117,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 4.9131, high: 4.9131, low: 4.9040, @@ -118,6 +125,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 4.9041, high: 4.9068, low: 4.8988, @@ -125,6 +133,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 4.9023, high: 4.9051, low: 4.8949, @@ -132,6 +141,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829600, open: 4.9010, high: 4.9052, low: 4.8969, @@ -139,6 +149,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829900, open: 4.8969, high: 4.8969, low: 4.8819, @@ -146,6 +157,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830200, open: 4.8895, high: 4.8928, low: 4.8851, @@ -153,6 +165,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830500, open: 4.8901, high: 4.8910, low: 4.8813, @@ -160,6 +173,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830800, open: 4.8855, high: 4.8864, low: 4.8816, @@ -167,6 +181,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831100, open: 4.8824, high: 4.8934, low: 4.8814, diff --git a/ta_lib/strategies/signal/src/flip/supertrend_flip.rs b/ta_lib/strategies/signal/src/flip/supertrend_flip.rs index 57dd93b2..6022ed33 100644 --- a/ta_lib/strategies/signal/src/flip/supertrend_flip.rs +++ b/ta_lib/strategies/signal/src/flip/supertrend_flip.rs @@ -43,6 +43,7 @@ mod tests { let signal = SupertrendFlipSignal::new(3.0, 3.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 6.161, high: 6.161, low: 6.136, @@ -50,6 +51,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 6.146, high: 6.150, low: 6.135, @@ -57,6 +59,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 6.148, high: 6.157, low: 6.143, @@ -64,6 +67,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 6.155, high: 6.174, low: 6.155, @@ -71,6 +75,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 6.174, high: 6.179, low: 6.163, @@ -78,6 +83,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 6.173, high: 6.192, low: 6.170, @@ -85,6 +91,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 6.172, high: 6.184, low: 6.167, @@ -92,6 +99,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 6.182, high: 6.183, low: 6.170, @@ -99,6 +107,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829600, open: 6.176, high: 6.185, low: 6.161, @@ -106,6 +115,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829900, open: 6.167, high: 6.193, low: 6.165, @@ -113,6 +123,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830200, open: 6.193, high: 6.213, low: 6.188, @@ -120,6 +131,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830500, open: 6.201, high: 6.201, low: 6.183, @@ -127,6 +139,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830800, open: 6.198, high: 6.205, low: 6.186, @@ -134,6 +147,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831100, open: 6.188, high: 6.188, low: 6.168, @@ -141,6 +155,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831400, open: 6.174, high: 6.180, low: 6.164, @@ -148,6 +163,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831700, open: 6.176, high: 6.194, low: 6.176, @@ -155,6 +171,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679832000, open: 6.191, high: 6.191, low: 6.169, @@ -162,6 +179,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679832300, open: 6.175, high: 6.184, low: 6.175, @@ -169,6 +187,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679832600, open: 6.184, high: 6.194, low: 6.176, @@ -176,6 +195,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679832900, open: 6.188, high: 6.188, low: 6.171, @@ -183,6 +203,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679833200, open: 6.179, high: 6.188, low: 6.171, @@ -190,6 +211,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679833500, open: 6.184, high: 6.195, low: 6.182, @@ -197,6 +219,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679833800, open: 6.195, high: 6.212, low: 6.193, @@ -204,6 +227,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679834100, open: 6.210, high: 6.210, low: 6.180, @@ -211,6 +235,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679834400, open: 6.192, high: 6.193, low: 6.152, @@ -218,6 +243,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679834700, open: 6.173, high: 6.178, low: 6.161, @@ -225,6 +251,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679835000, open: 6.174, high: 6.189, low: 6.161, @@ -232,6 +259,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679835300, open: 6.189, high: 6.197, low: 6.183, @@ -239,6 +267,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679835600, open: 6.194, high: 6.205, low: 6.189, @@ -246,6 +275,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679835900, open: 6.202, high: 6.232, low: 6.193, @@ -253,6 +283,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679836200, open: 6.231, high: 6.236, low: 6.215, @@ -260,6 +291,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679836500, open: 6.218, high: 6.222, low: 6.205, @@ -267,6 +299,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679836800, open: 6.208, high: 6.233, low: 6.208, @@ -274,6 +307,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679837100, open: 6.224, high: 6.231, low: 6.213, @@ -281,6 +315,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679837400, open: 6.220, high: 6.224, low: 6.196, @@ -288,6 +323,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679837700, open: 6.208, high: 6.219, low: 6.202, diff --git a/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs b/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs index 4dccbbb9..2166f977 100644 --- a/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs +++ b/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs @@ -28,7 +28,7 @@ impl Signal for DsoNeutralityCrossSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let (k, _) = dso( - &data.close, + &data.close(), self.smooth_type, self.smooth_period, self.k_period, diff --git a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs index bae38d77..2462a9b9 100644 --- a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs @@ -24,7 +24,7 @@ impl Signal for RsiNeutralityCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let rsi = rsi(&data.close, self.smooth_type, self.rsi_period); + let rsi = rsi(&data.close(), self.smooth_type, self.rsi_period); let upper_neutrality = NEUTRALITY_LINE + self.threshold; let lower_neutrality = NEUTRALITY_LINE - self.threshold; diff --git a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs index 8c41e013..ba0a3f53 100644 --- a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs @@ -24,7 +24,7 @@ impl Signal for RsiNeutralityPullbackSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let rsi = rsi(&data.close, self.smooth_type, self.rsi_period); + let rsi = rsi(&data.close(), self.smooth_type, self.rsi_period); let upper_neutrality = NEUTRALITY_LINE + self.threshold; let lower_neutrality = NEUTRALITY_LINE - self.threshold; diff --git a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs index a3318071..16a0b37a 100644 --- a/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs @@ -24,7 +24,7 @@ impl Signal for RsiNeutralityRejectionSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let rsi = rsi(&data.close, self.smooth_type, self.rsi_period); + let rsi = rsi(&data.close(), self.smooth_type, self.rsi_period); let upper_neutrality = NEUTRALITY_LINE + self.threshold; let lower_neutrality = NEUTRALITY_LINE - self.threshold; diff --git a/ta_lib/strategies/signal/src/neutrality/tii_neutrality_cross.rs b/ta_lib/strategies/signal/src/neutrality/tii_neutrality_cross.rs index 908fba7c..a055f245 100644 --- a/ta_lib/strategies/signal/src/neutrality/tii_neutrality_cross.rs +++ b/ta_lib/strategies/signal/src/neutrality/tii_neutrality_cross.rs @@ -25,7 +25,7 @@ impl Signal for TiiNeutralityCrossSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let tii = tii( - &data.close, + &data.close(), self.smooth_type, self.major_period, self.minor_period, diff --git a/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs b/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs index 0edd6a09..b2db1943 100644 --- a/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs +++ b/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs @@ -33,7 +33,7 @@ impl Signal for MacdColorSwitchSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let (_, _, histogram) = macd( - &data.close, + &data.close(), self.smooth_type, self.fast_period, self.slow_period, diff --git a/ta_lib/strategies/signal/src/pattern/rsi_v.rs b/ta_lib/strategies/signal/src/pattern/rsi_v.rs index 6755eaa8..383b52f6 100644 --- a/ta_lib/strategies/signal/src/pattern/rsi_v.rs +++ b/ta_lib/strategies/signal/src/pattern/rsi_v.rs @@ -27,7 +27,7 @@ impl Signal for RsiVSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let rsi = rsi(&data.close, self.smooth_type, self.rsi_period); + let rsi = rsi(&data.close(), self.smooth_type, self.rsi_period); let lower_barrier = RSI_LOWER_BARRIER + self.threshold; let upper_barrier = RSI_UPPER_BARRIER - self.threshold; diff --git a/ta_lib/strategies/signal/src/pattern/tii_v.rs b/ta_lib/strategies/signal/src/pattern/tii_v.rs index 682342d7..110d8f1a 100644 --- a/ta_lib/strategies/signal/src/pattern/tii_v.rs +++ b/ta_lib/strategies/signal/src/pattern/tii_v.rs @@ -28,7 +28,7 @@ impl Signal for TiiVSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let tii = tii( - &data.close, + &data.close(), self.smooth_type, self.major_period, self.minor_period, diff --git a/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs b/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs index 5128bd23..7014c1b9 100644 --- a/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs +++ b/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs @@ -42,7 +42,6 @@ impl Signal for DmiReversalSignal { #[cfg(test)] mod tests { use super::*; - use core::prelude::*; use std::collections::VecDeque; #[test] @@ -50,6 +49,7 @@ mod tests { let signal = DmiReversalSignal::new(Smooth::SMMA, 3.0, 3.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 0.010631, high: 0.010655, low: 0.010612, @@ -57,6 +57,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 0.010651, high: 0.010671, low: 0.010596, @@ -64,6 +65,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 0.010665, high: 0.010720, low: 0.010661, @@ -71,6 +73,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 0.010693, high: 0.010711, low: 0.010651, @@ -78,6 +81,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 0.010698, high: 0.010761, low: 0.010675, @@ -85,6 +89,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 0.010688, high: 0.010688, low: 0.010614, @@ -92,6 +97,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 0.010625, high: 0.010629, low: 0.010533, @@ -99,6 +105,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 0.010548, high: 0.010563, low: 0.010501, diff --git a/ta_lib/strategies/signal/src/reversal/vi_reversal.rs b/ta_lib/strategies/signal/src/reversal/vi_reversal.rs index a7b40528..0faaa440 100644 --- a/ta_lib/strategies/signal/src/reversal/vi_reversal.rs +++ b/ta_lib/strategies/signal/src/reversal/vi_reversal.rs @@ -36,7 +36,6 @@ impl Signal for ViReversalSignal { #[cfg(test)] mod tests { use super::*; - use core::prelude::*; use std::collections::VecDeque; #[test] @@ -44,6 +43,7 @@ mod tests { let signal = ViReversalSignal::new(1.0, 2.0); let data = VecDeque::from([ OHLCV { + ts: 1679827200, open: 4.8914, high: 4.9045, low: 4.8895, @@ -51,6 +51,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827500, open: 4.8995, high: 4.9073, low: 4.8995, @@ -58,6 +59,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679827800, open: 4.9061, high: 4.9070, low: 4.9001, @@ -65,6 +67,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828100, open: 4.9001, high: 4.9053, low: 4.8995, @@ -72,6 +75,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828400, open: 4.9053, high: 4.9093, low: 4.9046, @@ -79,6 +83,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679828700, open: 4.9087, high: 4.9154, low: 4.9087, @@ -86,6 +91,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829000, open: 4.9131, high: 4.9131, low: 4.9040, @@ -93,6 +99,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829300, open: 4.9041, high: 4.9068, low: 4.8988, @@ -100,6 +107,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829600, open: 4.9023, high: 4.9051, low: 4.8949, @@ -107,6 +115,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679829900, open: 4.9010, high: 4.9052, low: 4.8969, @@ -114,6 +123,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830200, open: 4.8969, high: 4.8969, low: 4.8819, @@ -121,6 +131,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830500, open: 4.8895, high: 4.8928, low: 4.8851, @@ -128,6 +139,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679830800, open: 4.8901, high: 4.8910, low: 4.8813, @@ -135,6 +147,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831100, open: 4.8855, high: 4.8864, low: 4.8816, @@ -142,6 +155,7 @@ mod tests { volume: 100.0, }, OHLCV { + ts: 1679831400, open: 4.8824, high: 4.8934, low: 4.8814, diff --git a/ta_lib/strategies/signal/src/signalline/di_signalline.rs b/ta_lib/strategies/signal/src/signalline/di_signalline.rs index 46a10223..b79c1457 100644 --- a/ta_lib/strategies/signal/src/signalline/di_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/di_signalline.rs @@ -24,7 +24,7 @@ impl Signal for DiSignalLineSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let di = di(&data.close, self.smooth_type, self.period); + let di = di(&data.close(), self.smooth_type, self.period); let signal_line = di.smooth(self.smooth_type, self.signal_period); (di.cross_over(&signal_line), di.cross_under(&signal_line)) diff --git a/ta_lib/strategies/signal/src/signalline/dso_signalline.rs b/ta_lib/strategies/signal/src/signalline/dso_signalline.rs index 22c70d74..7ee3ce18 100644 --- a/ta_lib/strategies/signal/src/signalline/dso_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/dso_signalline.rs @@ -28,7 +28,7 @@ impl Signal for DsoSignalLineSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let (k, d) = dso( - &data.close, + &data.close(), self.smooth_type, self.smooth_period, self.k_period, diff --git a/ta_lib/strategies/signal/src/signalline/kst_signalline.rs b/ta_lib/strategies/signal/src/signalline/kst_signalline.rs index 33afbabc..fbd40f97 100644 --- a/ta_lib/strategies/signal/src/signalline/kst_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/kst_signalline.rs @@ -57,7 +57,7 @@ impl Signal for KstSignalLineSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let kst = kst( - &data.close, + &data.close(), self.smooth_type, self.roc_period_first, self.roc_period_second, diff --git a/ta_lib/strategies/signal/src/signalline/macd_signalline.rs b/ta_lib/strategies/signal/src/signalline/macd_signalline.rs index 00ae81b7..95be9034 100644 --- a/ta_lib/strategies/signal/src/signalline/macd_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/macd_signalline.rs @@ -33,7 +33,7 @@ impl Signal for MacdSignalLineSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let (macd_line, signal_line, _) = macd( - &data.close, + &data.close(), self.smooth_type, self.fast_period, self.slow_period, diff --git a/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs b/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs index 998c651c..2ece8a00 100644 --- a/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs @@ -34,7 +34,7 @@ impl Signal for RsiSignalLineSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let rsi = rsi(&data.close, self.smooth_type, self.rsi_period); + let rsi = rsi(&data.close(), self.smooth_type, self.rsi_period); let rsi_ma = rsi.smooth(self.smooth_signal, self.smooth_period); let upper_neutrality = NEUTRALITY_LINE + self.threshold; let lower_neutrality = NEUTRALITY_LINE - self.threshold; diff --git a/ta_lib/strategies/signal/src/signalline/trix_signalline.rs b/ta_lib/strategies/signal/src/signalline/trix_signalline.rs index 00f999a7..2149c80e 100644 --- a/ta_lib/strategies/signal/src/signalline/trix_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/trix_signalline.rs @@ -24,7 +24,7 @@ impl Signal for TrixSignalLineSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let trix = trix(&data.close, self.smooth_type, self.period); + let trix = trix(&data.close(), self.smooth_type, self.period); let signal_line = trix.smooth(self.smooth_type, self.signal_period); ( diff --git a/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs b/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs index 1c1bb499..c6a36053 100644 --- a/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs +++ b/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs @@ -33,7 +33,7 @@ impl Signal for TsiSignalLineSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let tsi = tsi( - &data.close, + &data.close(), self.smooth_type, self.slow_period, self.fast_period, diff --git a/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs index 87dfe710..512ef36f 100644 --- a/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs @@ -22,7 +22,7 @@ impl Signal for ApoZeroCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let apo = apo(&data.close, self.fast_period, self.slow_period); + let apo = apo(&data.close(), self.fast_period, self.slow_period); (apo.cross_over(&ZERO_LINE), apo.cross_under(&ZERO_LINE)) } diff --git a/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs index 27e2dc32..3a10cfa3 100644 --- a/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs @@ -33,7 +33,7 @@ impl Signal for CcZeroCrossSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let cc = cc( - &data.close, + &data.close(), self.fast_period, self.slow_period, self.smooth_type, diff --git a/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs index ce699e3b..dbbf98a9 100644 --- a/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs @@ -20,7 +20,7 @@ impl Signal for CfoZeroCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let cfo = cfo(&data.close, self.period); + let cfo = cfo(&data.close(), self.period); (cfo.cross_over(&ZERO_LINE), cfo.cross_under(&ZERO_LINE)) } diff --git a/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs index 63f40ff1..6fd57af6 100644 --- a/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs @@ -22,7 +22,7 @@ impl Signal for DiZeroCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let di = di(&data.close, self.smooth_type, self.period); + let di = di(&data.close(), self.smooth_type, self.period); (di.cross_over(&ZERO_LINE), di.cross_under(&ZERO_LINE)) } diff --git a/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs index b5729168..89d84a8e 100644 --- a/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs @@ -33,7 +33,7 @@ impl Signal for MacdZeroCrossSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let (macd_line, _, _) = macd( - &data.close, + &data.close(), self.smooth_type, self.fast_period, self.slow_period, diff --git a/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs index 2b0b64e7..80e4d391 100644 --- a/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs @@ -20,7 +20,7 @@ impl Signal for RocZeroCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let roc = roc(&data.close, self.period); + let roc = roc(&data.close(), self.period); (roc.cross_over(&ZERO_LINE), roc.cross_under(&ZERO_LINE)) } diff --git a/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs index 6a9eec12..f1000620 100644 --- a/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs @@ -22,7 +22,7 @@ impl Signal for TrixZeroCrossSignal { } fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let trix = trix(&data.close, self.smooth_type, self.period); + let trix = trix(&data.close(), self.smooth_type, self.period); (trix.cross_over(&ZERO_LINE), trix.cross_under(&ZERO_LINE)) } diff --git a/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs b/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs index 2aead088..448cfaa3 100644 --- a/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs +++ b/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs @@ -25,7 +25,7 @@ impl Signal for TsiZeroCrossSignal { fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { let tsi = tsi( - &data.close, + &data.close(), self.smooth_type, self.slow_period, self.fast_period,