Signatur
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
(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);
}
}
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;
}
// 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.