tindi/moving_averages/
simple_moving_average.rs

1/// # Simple Moving Average
2/// The (SMA) is a basic indicator that displays the average price of an asset over a
3/// period of time.
4///
5/// ## Example
6/// ```no_run
7/// let data = vec![
8///     71.9, 72.51, 70.38, 71.63, 71.5, 71.11, 71.56, 70.34, 70.32, 70.05, 67.72, 66.45,
9///     67.12, 66.86, 66.7, 67.26, 67.52, 68.0, 67.43, 67.68, 68.86, 68.62, 67.27, 67.9, 67.74,
10///     66.45, 65.78, 66.88, 67.13, 66.65, 66.77, 65.86, 66.63, 65.55, 65.24, 64.74, 64.56,
11///     64.37, 63.06, 62.32, 63.67, 64.81, 65.23, 64.33, 64.73, 64.55, 63.94, 65.15, 66.18,
12///     67.65, 68.12, 67.9, 68.55, 67.13, 66.71, 66.34, 68.59, 68.24, 68.39, 69.34, 69.06,
13/// ];
14///
15/// let result = simple_moving_average(&data);
16/// let expected = 67.29558;
17/// assert_eq!(result, expected);   
18/// ```
19
20pub fn simple_moving_average(data: &[f32]) -> f32 {
21    let mut sum = 0.0;
22    let length = data.len();
23
24    if length < 1 {
25        return 0.0;
26    }
27
28    for number in data {
29        sum += number
30    }
31
32    sum / data.len() as f32
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_sma_wholes() {
41        let data = vec![
42            71.9, 72.51, 70.38, 71.63, 71.5, 71.11, 71.56, 70.34, 70.32, 70.05, 67.72, 66.45,
43            67.12, 66.86, 66.7, 67.26, 67.52, 68.0, 67.43, 67.68, 68.86, 68.62, 67.27, 67.9, 67.74,
44            66.45, 65.78, 66.88, 67.13, 66.65, 66.77, 65.86, 66.63, 65.55, 65.24, 64.74, 64.56,
45            64.37, 63.06, 62.32, 63.67, 64.81, 65.23, 64.33, 64.73, 64.55, 63.94, 65.15, 66.18,
46            67.65, 68.12, 67.9, 68.55, 67.13, 66.71, 66.34, 68.59, 68.24, 68.39, 69.34, 69.06,
47        ];
48        let result = simple_moving_average(&data);
49        let expected = 67.29558;
50        assert_eq!(result, expected);
51    }
52
53    #[test]
54    fn test_sma_decimals() {
55        let data = vec![0.21, 0.40, 0.60, 0.15, 0.21];
56        let result = simple_moving_average(&data);
57        let expected = 0.314;
58        assert_eq!(result, expected);
59    }
60
61    #[test]
62    fn test_sma_short() {
63        let data = vec![0.21];
64        let result = simple_moving_average(&data);
65        let expected = 0.21;
66        assert_eq!(result, expected);
67    }
68}