Signatur
Beschreibung
Der Percentage Price Oszillator (PPO) ist ein Momentum-Indikator aus der technischen Analyse, der die prozentuale Differenz zwischen zwei gleitenden Durchschnitten unterschiedlicher Perioden darstellt. Im Gegensatz zum MACD, der die absolute Differenz anzeigt, normalisiert der PPO die Werte und macht damit Vergleiche zwischen verschiedenen Wertpapieren mit unterschiedlichem Preisniveau besser möglich.
Die Formel lautet: PPO = ((Fast MA - Slow MA) / Slow MA) * 100. Ein positiver PPO-Wert signalisiert bullisches Momentum (schneller gleitender Durchschnitt liegt über dem langsamen), ein negativer Wert signalisiert bärisches Momentum. Kreuzt der PPO die Nulllinie, wird dies häufig als Kauf- bzw. Verkaufssignal interpretiert.
Die Funktion gehört zur PHP-Erweiterung Trader (PECL trader), die auf der TA-Lib-Bibliothek basiert. Der Parameter mAType erlaubt die Wahl zwischen verschiedenen Arten von gleitenden Durchschnitten, z. B. SMA, EMA oder WMA, was eine flexible Anpassung an unterschiedliche Analyseanforderungen ermöglicht.
Das Ergebnis-Array ist kürzer als das Eingabe-Array, da für die Berechnung der ersten Werte nicht genügend historische Daten vorhanden sind (Lookback-Periode). Die Schlüssel des Rückgabe-Arrays beginnen daher nicht notwendigerweise bei 0.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $real Pflicht | array | Numerisches Array mit den Eingabedaten (z. B. Schlusskurse einer Zeitreihe). | |
| $fastPeriod | int | 12 | Anzahl der Perioden für den schnellen gleitenden Durchschnitt. Muss kleiner als slowPeriod sein. Gültige Werte: 2–100000. |
| $slowPeriod | int | 26 | Anzahl der Perioden für den langsamen gleitenden Durchschnitt. Muss größer als fastPeriod sein. Gültige Werte: 2–100000. |
| $mAType | int | TRADER_MA_TYPE_SMA | Typ des gleitenden Durchschnitts. Mögliche Werte sind die TRADER_MA_TYPE_*-Konstanten, z. B. TRADER_MA_TYPE_SMA (0), TRADER_MA_TYPE_EMA (1), TRADER_MA_TYPE_WMA (2) usw. |
Rückgabewert
false zurückgegeben.Beispiele
Einfache PPO-Berechnung mit Standardwerten
<?php
// Beispielhafte Schlusskurse
$closes = [
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, 45.98, 45.77, 45.54,
45.40, 45.15, 44.89, 44.36, 44.57, 43.67, 44.13, 44.34,
44.09, 44.15, 43.61, 44.83, 45.10, 45.15
];
// PPO mit Standard-Einstellungen: Fast=12, Slow=26, SMA
$ppo = trader_ppo($closes, 12, 26, TRADER_MA_TYPE_SMA);
if ($ppo === false) {
echo 'Fehler bei der PPO-Berechnung.' . PHP_EOL;
} else {
foreach ($ppo as $index => $value) {
printf("Index %d: PPO = %.4f%%\n", $index, $value);
}
}
PPO mit EMA-Typ — Signalerkennung
<?php
// Größerer Datensatz: aufsteigende und absteigende Kurse
$closes = array_merge(
range(100, 130, 1), // Aufwärtstrend
range(129, 100, -1) // Abwärtstrend
);
// PPO mit EMA (wie MACD üblich)
$ppo = trader_ppo($closes, 12, 26, TRADER_MA_TYPE_EMA);
if ($ppo === false) {
echo 'Berechnung fehlgeschlagen.' . PHP_EOL;
} else {
$prevValue = null;
foreach ($ppo as $index => $value) {
// Nulllinien-Kreuzung erkennen
if ($prevValue !== null) {
if ($prevValue < 0 && $value >= 0) {
echo "Kaufsignal bei Index $index (PPO kreuzt Nulllinie von unten): " . round($value, 4) . "%\n";
} elseif ($prevValue > 0 && $value <= 0) {
echo "Verkaufssignal bei Index $index (PPO kreuzt Nulllinie von oben): " . round($value, 4) . "%\n";
}
}
$prevValue = $value;
}
}
// Wichtig · Fallstricke
Lookback-Periode: Das Ergebnis-Array enthält weniger Elemente als das Eingabe-Array. Die fehlenden Anfangswerte entsprechen der Lookback-Periode, die von slowPeriod und dem gewählten mAType abhängt. Beim Indizieren des Rückgabe-Arrays auf den ursprünglichen Datensatz muss dies berücksichtigt werden.
Voraussetzung: Die PECL-Erweiterung trader muss installiert und in der php.ini aktiviert sein (extension=trader). Die Verfügbarkeit kann mit extension_loaded('trader') geprüft werden.
Fehlerbehandlung: Bei ungültigen Parametern (z. B. fastPeriod >= slowPeriod oder zu wenige Eingabedaten) gibt die Funktion false zurück. Der genaue Fehlercode ist über trader_errno() abrufbar.