1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#![feature(external_doc)] use ta_common::traits::Indicator; #[doc(include = "../README.md")] pub struct Wilders { period: u32, prev_avg: f64, sum: f64, index: u32, } impl Wilders { pub fn new(period: u32) -> Wilders { Self { period, prev_avg: 0.0, sum: 0.0, index: 0, } } } impl Indicator<f64, Option<f64>> for Wilders { fn next(&mut self, input: f64) -> Option<f64> { self.index = self.index + 1; println!("index {} sum {}", self.index, self.sum); if self.index < self.period { self.sum = self.sum + input; return None; } if self.index == (self.period) { self.sum = self.sum + input; let res = self.sum / self.period as f64; println!("index {} sum {}", self.index, self.sum); self.prev_avg = res; return Some(res); } let period = self.period as f64; let res = (self.prev_avg * (period - 1.0) + input) / period; self.prev_avg = res; Some(res) } fn reset(&mut self) { self.sum = 0.0; self.index = 0; self.prev_avg = 0.0; } } #[cfg(test)] mod tests { use crate::Wilders; use ta_common::traits::Indicator; #[test] fn it_works() { let mut wilders = Wilders::new(5); assert_eq!(wilders.next(81.59), None); assert_eq!(wilders.next(81.06), None); assert_eq!(wilders.next(82.87), None); assert_eq!(wilders.next(83.00), None); assert_eq!(wilders.next(83.61), Some(82.426)); assert_eq!(wilders.next(83.15), Some(82.5708)); assert_eq!(wilders.next(82.84), Some(82.62464)); assert_eq!(wilders.next(83.99), Some(82.897712)); assert_eq!(wilders.next(84.55), Some(83.2281696)); assert_eq!(wilders.next(84.36), Some(83.45453568)); assert_eq!(wilders.next(85.53), Some(83.86962854400001)); assert_eq!(wilders.next(86.54), Some(84.40370283520001)); assert_eq!(wilders.next(86.89), Some(84.90096226816)); assert_eq!(wilders.next(87.77), Some(85.474769814528)); assert_eq!(wilders.next(87.29), Some(85.83781585162241)); } }