From 50aca5fe89f09227c2036bb036a0c9953b094031 Mon Sep 17 00:00:00 2001 From: m5l14i11 Date: Mon, 26 Jun 2023 23:07:38 +0400 Subject: [PATCH] cache len --- ta_lib/momentum/src/rsi.rs | 10 ++++++---- ta_lib/overlap/src/ema.rs | 12 +++++++----- ta_lib/overlap/src/sma.rs | 10 ++++++++-- ta_lib/overlap/src/smma.rs | 12 +++++++----- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ta_lib/momentum/src/rsi.rs b/ta_lib/momentum/src/rsi.rs index 214e7aef..61a72524 100644 --- a/ta_lib/momentum/src/rsi.rs +++ b/ta_lib/momentum/src/rsi.rs @@ -1,12 +1,14 @@ use overlap::smma::smma; pub fn rsi(data: &[f64], period: usize) -> Vec> { - if data.len() < period { - return vec![None; data.len()]; + let len = data.len(); + + if len < period { + return vec![None; len]; } - let mut gains = vec![0.0; data.len()]; - let mut losses = vec![0.0; data.len()]; + let mut gains = vec![0.0; len]; + let mut losses = vec![0.0; len]; for i in 1..data.len() { let change = data[i] - data[i - 1]; diff --git a/ta_lib/overlap/src/ema.rs b/ta_lib/overlap/src/ema.rs index f7cec8ea..459ced6f 100644 --- a/ta_lib/overlap/src/ema.rs +++ b/ta_lib/overlap/src/ema.rs @@ -1,16 +1,18 @@ pub fn ema(data: &[f64], period: usize) -> Vec> { - if data.len() < period { - return vec![None; data.len()]; + let len = data.len(); + + if len < period { + return vec![None; len]; } let alpha = 2.0 / (period as f64 + 1.0); - let mut ema = vec![None; data.len()]; - + let mut ema = vec![None; len]; let mut ema_current = data[0]; - for i in 1..data.len() { + for i in 1..len { ema_current = (data[i] - ema_current) * alpha + ema_current; + if i >= period - 1 { ema[i] = Some(ema_current); } diff --git a/ta_lib/overlap/src/sma.rs b/ta_lib/overlap/src/sma.rs index 61a445ac..df39a640 100644 --- a/ta_lib/overlap/src/sma.rs +++ b/ta_lib/overlap/src/sma.rs @@ -1,8 +1,14 @@ pub fn sma(data: &[f64], period: usize) -> Vec> { - let mut sma = vec![None; data.len()]; + let len = data.len(); + + if len < period { + return vec![None; len]; + } + + let mut sma = vec![None; len]; let mut sum = 0.0; - for i in 0..data.len() { + for i in 0..len { sum += data[i]; if i >= period { diff --git a/ta_lib/overlap/src/smma.rs b/ta_lib/overlap/src/smma.rs index 682fffee..8891d852 100644 --- a/ta_lib/overlap/src/smma.rs +++ b/ta_lib/overlap/src/smma.rs @@ -1,16 +1,18 @@ pub fn smma(data: &[f64], period: usize) -> Vec> { - if data.len() < period { - return vec![None; data.len()]; + let len = data.len(); + + if len < period { + return vec![None; len]; } let alpha = 1.0 / period as f64; - let mut smma = vec![None; data.len()]; - + let mut smma = vec![None; len]; let mut smma_current = data[0]; - for i in 1..data.len() { + for i in 1..len { smma_current = (data[i] - smma_current) * alpha + smma_current; + if i >= period - 1 { smma[i] = Some(smma_current); }