diff --git a/ta_lib/price/src/avg.rs b/ta_lib/price/src/avg.rs new file mode 100644 index 00000000..f99ecb0b --- /dev/null +++ b/ta_lib/price/src/avg.rs @@ -0,0 +1,32 @@ +pub fn average_price(open: &[f64], high: &[f64], low: &[f64], close: &[f64]) -> Vec> { + let len = high.len(); + + if len != low.len() || len != open.len() || len != close.len() { + return vec![None; len]; + } + + high.iter() + .zip(low) + .zip(open) + .zip(close) + .map(|(((&h, &l), &o), &c)| Some((h + l + o + c) / 4.0)) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_average_price() { + let open = vec![1.5, 3.0, 4.5]; + let high = vec![2.0, 4.0, 6.0]; + let low = vec![1.0, 2.0, 3.0]; + let close = vec![1.75, 3.5, 5.25]; + + let expected = vec![Some(1.5625), Some(3.125), Some(4.6875)]; + let result = average_price(&open, &high, &low, &close); + + assert_eq!(result, expected); + } +} diff --git a/ta_lib/price/src/lib.rs b/ta_lib/price/src/lib.rs index 5704d791..90c83c5b 100644 --- a/ta_lib/price/src/lib.rs +++ b/ta_lib/price/src/lib.rs @@ -1 +1,3 @@ +pub mod avg; +pub mod median; pub mod typical; diff --git a/ta_lib/price/src/median.rs b/ta_lib/price/src/median.rs new file mode 100644 index 00000000..ec81e29d --- /dev/null +++ b/ta_lib/price/src/median.rs @@ -0,0 +1,28 @@ +pub fn median_price(high: &[f64], low: &[f64]) -> Vec> { + let len = high.len(); + + if len != low.len() { + return vec![None; len]; + } + + high.iter() + .zip(low) + .map(|(&h, &l)| Some((h + l) / 2.0)) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_median_price() { + let high = vec![1.0, 2.0, 3.0]; + let low = vec![0.5, 1.0, 2.0]; + + let expected = vec![Some(0.75), Some(1.5), Some(2.5)]; + let result = median_price(&high, &low); + + assert_eq!(result, expected); + } +}