(do ;; Simple Moving Average O(1) (def SMA (fn [len] (do (def s (Series len)) (def sum 0.0) (fn [val] (do (if (>= (count s) len) (set sum (- sum (get_item s (- len 1)))) (nop)) (push s val) (set sum (+ sum val)) (/ sum (count s))))))) ;; Weighted Moving Average (def WMA (fn [len] (do (def s (Series len)) (def weight_sum (/ (* len (+ len 1)) 2)) (fn [val] (do (push s val) (def current_sum 0.0) (def i 0) (while (< i (count s)) (do (set current_sum (+ current_sum (* (get_item s i) (- len i)))) (set i (+ i 1)))) (/ current_sum weight_sum)))))))