From 48736e6222d814aee72c46ffdb25cf8923f7d1ef Mon Sep 17 00:00:00 2001 From: m5l14i11 Date: Sun, 25 Jun 2023 23:44:23 +0400 Subject: [PATCH] vama --- ta_lib/overlap/Cargo.toml | 1 + ta_lib/overlap/src/vama.rs | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 ta_lib/overlap/src/vama.rs diff --git a/ta_lib/overlap/Cargo.toml b/ta_lib/overlap/Cargo.toml index c336da9a..8e7511d2 100644 --- a/ta_lib/overlap/Cargo.toml +++ b/ta_lib/overlap/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] price = { path = "../price" } +statistics = { path = "../statistics" } diff --git a/ta_lib/overlap/src/vama.rs b/ta_lib/overlap/src/vama.rs new file mode 100644 index 00000000..eafd4dd4 --- /dev/null +++ b/ta_lib/overlap/src/vama.rs @@ -0,0 +1,48 @@ +use statistics::stddev::std_dev; + +pub fn vama( + close: &[f64], + short_volatility: usize, + long_volatility: usize, + alpha_factor: f64, +) -> Vec> { + let short_std = std_dev(close, short_volatility); + let long_std = std_dev(close, long_volatility); + + let mut alpha = vec![None; close.len()]; + let mut vama = vec![None; close.len()]; + + for i in 0..close.len() { + if let (Some(ss), Some(ls)) = (short_std[i], long_std[i]) { + alpha[i] = Some((ss / ls) * alpha_factor); + } + } + + let alpha = alpha.iter().filter_map(|&x| x).collect::>(); + + vama = ema(&alpha, short_volatility); + + vama +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_vama() { + let close = vec![100.0, 105.0, 110.0, 115.0, 120.0]; + let short_volatility = 2; + let long_volatility = 3; + let alpha_factor = 0.5; + let expected = vec![ + None, + Some(102.5), + Some(106.25), + Some(110.625), + Some(115.3125), + ]; + let result = vama(&close, short_volatility, long_volatility, alpha_factor); + assert_eq!(result, expected); + } +}