(do ;; =========================================================================== ;; 1. DEFINITIONEN (Wie zuvor besprochen) ;; =========================================================================== ;; --- WMA Factory (O(1)) --- (def create-wma (fn [len] (do (def prev-w-sum 0.0) (def prev-s-sum 0.0) (def weight-div (/ (* len (+ len 1)) 2)) (fn [src] (do (def cnt (count src)) (if (< cnt (+ len 1)) 0.0 (do (def val-new (get src 0)) (def val-out (get src len)) (def w-sum (+ prev-w-sum (- (* len val-new) prev-s-sum))) (def s-sum (+ (- prev-s-sum val-out) val-new)) (assign prev-w-sum w-sum) (assign prev-s-sum s-sum) (/ w-sum weight-div) )) )) ))) ;; --- HMA Factory --- (def create-hma (fn [len] (do (def half-len (round (/ len 2))) (def sqrt-len (round (sqrt len))) (def wma-half (create-wma half-len)) (def wma-full (create-wma len)) (def wma-smooth (create-wma sqrt-len)) (def diff-series (new-series [[:val :Float]])) (fn [src] (do (def v1 (wma-half src)) (def v2 (wma-full src)) (def diff (- (* 2 v1) v2)) (add-item diff-series {:val diff}) (wma-smooth (get diff-series :val)) )) ))) ;; --- Repeat Macro --- (defmacro repeat [n body] `((fn [cnt] (if (> cnt 0) (do ~body (recur (- cnt 1))))) ~n)) ;; =========================================================================== ;; 2. SIMULATION & TEST ;; =========================================================================== ;; Konfiguration (def hma-length 14) (def simulation-steps 50) ;; Initialisierung der Komponenten (def hma-calc (create-hma hma-length)) ; Die HMA-Closure (def prices (new-series [[:close :Float]])) ; Die Preis-Series (def current-price 100.0) ; Startpreis ;; Header Ausgabe (falls print verfügbar ist) (print "Step | Price | HMA(14)") (print "-----|----------|----------") ;; Simulations-Schleife (repeat simulation-steps (do ;; 1. Preis simulieren (Random Walk) ;; (random) gibt 0.0 bis 1.0 zurück. ;; (- (random) 0.5) erzeugt eine Änderung zwischen -0.5 und +0.5 (assign current-price (+ current-price (- (random) 0.5))) ;; 2. Preis zur Series hinzufügen (add-item prices {:close current-price}) ;; 3. HMA berechnen (def hma-val 0.0) ;; 3. HMA berechnen (def price-series (get prices :close)) (assign hma-val (hma-calc price-series)) ;; 4. Ausgabe ;; Wir geben nur Werte aus, wenn der HMA "eingeschwungen" ist (Wert > 0) (if (> hma-val 0.0) (print (count prices) " |" current-price " | " hma-val) (print (count prices) " |" current-price " | (warming up...)")) ) ) )