Start · Sprachen · PHP · Referenz · trader_dema

trader_dema

Funktion

Berechnet den <code>DEMA</code> (Double Exponential Moving Average) – einen doppelten exponentiellen gleitenden Durchschnitt – aus einer Zeitreihe von Kursdaten.

Kategorie: math

Signatur

trader_dema(array $real, int $timePeriod = 30): array|false

Beschreibung

trader_dema() gehört zur TRADER-Erweiterung (PHP-Bindings für die TA-Lib) und berechnet den Double Exponential Moving Average (DEMA). Im Gegensatz zum einfachen exponentiellen gleitenden Durchschnitt (EMA) reagiert der DEMA deutlich schneller auf Kursveränderungen, weil er die Verzögerung durch eine doppelte EMA-Berechnung reduziert: DEMA = 2 × EMA(n) − EMA(EMA(n)).

Der DEMA wird vor allem in der technischen Analyse von Finanzinstrumenten (Aktien, Devisen, Rohstoffe) eingesetzt, um Trends frühzeitiger zu erkennen und Signalverzögerungen typischer gleitender Durchschnitte zu minimieren. Er eignet sich gut als Grundlage für Handelssignale (Crossover-Strategien) oder als Glättungskomponente in komplexeren Indikatoren.

Die Eingabe-Array $real enthält numerische Werte (z. B. Schlusskurse) als fortlaufend indiziertes PHP-Array. Die Rückgabe ist ebenfalls ein numerisch indiziertes Array, dessen Länge kleiner als die Eingabe ist, da für die ersten (timePeriod × 2) − 2 Elemente kein Wert berechnet werden kann (Lookback-Periode).

Die Funktion erfordert die installierte PECL trader-Erweiterung. Fehlt diese oder tritt ein Berechnungsfehler auf, wird false zurückgegeben.

Parameter

Name Typ Default Beschreibung
$real Pflicht array Fortlaufend indiziertes Array mit numerischen Eingabewerten (z. B. Schlusskurse als float). Die Werte müssen in chronologischer Reihenfolge vorliegen.
$timePeriod int 30 Anzahl der Perioden, über die der gleitende Durchschnitt berechnet wird. Erlaubter Bereich: 2–100000. Ein kleinerer Wert reagiert empfindlicher auf Kursschwankungen, ein größerer glättet stärker.

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein numerisch indiziertes Array mit den berechneten DEMA-Werten. Die ersten (timePeriod × 2) − 2 Eingabewerte ergeben keinen Ausgabewert (Lookback). Bei einem Fehler (z. B. ungültige Parameter oder fehlende Erweiterung) wird false zurückgegeben.

Beispiele

Einfache DEMA-Berechnung mit Schlusskursen

<?php
// Tages-Schlusskurse einer Aktie (vereinfacht)
$closePrices = [44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.15,
                43.61, 44.33, 44.83, 45.10, 45.15, 43.61, 44.33, 44.83,
                45.10, 45.15, 45.98, 46.10, 46.75, 47.00, 47.42, 47.15,
                46.90, 46.50, 46.20, 46.80, 47.30, 47.80, 48.00, 48.25,
                48.10, 47.90, 47.50, 47.00, 46.75, 46.90, 47.20, 47.60];

// DEMA mit Periode 10 berechnen
$dema = trader_dema($closePrices, 10);

if ($dema === false) {
    echo 'Fehler bei der DEMA-Berechnung.' . PHP_EOL;
} else {
    echo 'Anzahl Ausgabewerte: ' . count($dema) . PHP_EOL;
    foreach ($dema as $index => $value) {
        printf("Index %d: %.4f\n", $index, $value);
    }
}
Anzahl Ausgabewerte: 22 Index 18: 45.8764 Index 19: 46.2031 ...

Crossover-Signal: DEMA(10) kreuzt DEMA(30)

<?php
// Simulation: Schlusskurse über 60 Tage
$prices = array_map(fn($i) => 100 + sin($i / 5) * 10 + $i * 0.2, range(0, 59));

$demaFast = trader_dema($prices, 10); // schnell
$demaSlow = trader_dema($prices, 30); // langsam

if ($demaFast === false || $demaSlow === false) {
    die('Fehler bei der Berechnung.');
}

// Gemeinsame Indizes bestimmen
$commonKeys = array_intersect(array_keys($demaFast), array_keys($demaSlow));

$prevFast = null;
$prevSlow = null;

foreach ($commonKeys as $i) {
    $fast = $demaFast[$i];
    $slow = $demaSlow[$i];

    if ($prevFast !== null) {
        if ($prevFast < $prevSlow && $fast > $slow) {
            echo "Kaufsignal bei Index $i (DEMA-Fast: " . round($fast, 2) . ")\n";
        } elseif ($prevFast > $prevSlow && $fast < $slow) {
            echo "Verkaufssignal bei Index $i (DEMA-Fast: " . round($fast, 2) . ")\n";
        }
    }

    $prevFast = $fast;
    $prevSlow = $slow;
}
Kaufsignal bei Index 39 (DEMA-Fast: 108.73) Verkaufssignal bei Index 52 (DEMA-Fast: 111.45)

// Wichtig · Fallstricke

Lookback-Periode: Für eine Periode n benötigt der DEMA mindestens (2 × n) − 1 Eingabewerte, um den ersten Ausgabewert zu liefern. Das zurückgegebene Array ist daher kürzer als die Eingabe. Die Indizes des Rückgabe-Arrays korrespondieren mit den ursprünglichen Positionen im Eingabe-Array.

Erweiterung erforderlich: trader_dema() setzt die PECL-Erweiterung trader voraus. Prüfe mit extension_loaded('trader'), ob diese verfügbar ist, bevor du die Funktion aufrufst.

Eingabevalidierung: Übergib ausschließlich numerische Werte im Array. Nicht-numerische Einträge können zu unerwarteten Ergebnissen oder false führen. Stelle sicher, dass timePeriod im gültigen Bereich (2–100000) liegt.