(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 verfgbar 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 zurck. 
      ;; (- (random) 0.5) erzeugt eine nderung zwischen -0.5 und +0.5
      (assign current-price (+ current-price (- (random) 0.5)))

      ;; 2. Preis zur Series hinzufgen
      (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...)"))
    )
  )
)