diff --git a/ta_lib/Cargo.lock b/ta_lib/Cargo.lock index ef82fb33..7e1a772c 100644 --- a/ta_lib/Cargo.lock +++ b/ta_lib/Cargo.lock @@ -12,6 +12,14 @@ dependencies = [ [[package]] name = "overlap" version = "0.1.0" +dependencies = [ + "price", + "statistics", +] + +[[package]] +name = "patterns" +version = "0.1.0" [[package]] name = "price" @@ -20,3 +28,7 @@ version = "0.1.0" [[package]] name = "statistics" version = "0.1.0" + +[[package]] +name = "volatility" +version = "0.1.0" diff --git a/ta_lib/Cargo.toml b/ta_lib/Cargo.toml index 9fa72d42..6ffba8dd 100644 --- a/ta_lib/Cargo.toml +++ b/ta_lib/Cargo.toml @@ -3,5 +3,7 @@ members = [ "overlap", "momentum", "price", -"statistics" +"statistics", +"volatility", +"patterns" ] 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/lib.rs b/ta_lib/overlap/src/lib.rs index 1a8ffebf..67eaec5e 100644 --- a/ta_lib/overlap/src/lib.rs +++ b/ta_lib/overlap/src/lib.rs @@ -2,3 +2,4 @@ pub mod ema; pub mod sma; pub mod smma; pub mod vwap; +pub mod vama; \ No newline at end of file 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); }