Signatur
Beschreibung
Die Funktion trader_cmo() ist Teil der PECL-Erweiterung Trader und implementiert den Chande Momentum Oscillator, der 1994 von Tushar Chande entwickelt wurde. Der CMO misst die Dynamik (Momentum) eines Instruments, indem er die Differenz zwischen der Summe aller Aufwärtsbewegungen und der Summe aller Abwärtsbewegungen in einem bestimmten Zeitraum bildet und durch deren Gesamtsumme teilt. Das Ergebnis wird mit 100 multipliziert, sodass der Indikator zwischen -100 und +100 schwankt.
Ein CMO-Wert nahe +100 deutet auf eine starke Aufwärtsdynamik hin, während ein Wert nahe -100 eine starke Abwärtsdynamik signalisiert. Werte um die Null-Linie zeigen eine seitwärts gerichtete, unentschlossene Kursbewegung. Typische Handelssignale entstehen bei Schwellenwerten wie ±50 oder durch Divergenzen zwischen Preis und Indikator.
Im Gegensatz zum klassischen RSI verwendet der CMO unverstärkte Rohdaten und nicht die geglätteten Werte, was ihn sensibler auf Kursschwankungen reagieren lässt. Der Indikator eignet sich besonders zur Trendstärkenanalyse und zur Erkennung von Überkauf- bzw. Überverkauft-Zuständen in technischen Handelsstrategien.
Die Rückgabe ist ein Array, das nur für Positionen ab Index timePeriod berechnete Werte enthält — führende Elemente werden ausgelassen, da für sie noch nicht genug Datenpunkte vorliegen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $real Pflicht | array | Eindimensionales Array mit numerischen Kursdaten (z. B. Schlusskurse) in chronologischer Reihenfolge. | |
| $timePeriod | int | 14 | Anzahl der Perioden, über die der CMO berechnet wird. Typische Werte liegen zwischen 9 und 20. Muss mindestens 2 betragen. |
Rückgabewert
false zurückgegeben.Beispiele
Einfache CMO-Berechnung mit Schlusskursen
<?php
// Beispielhafte Schlusskurse einer Aktie
$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, 45.15, 46.00,
46.50, 46.00, 45.00, 46.50, 47.00
];
$timePeriod = 9;
$cmo = trader_cmo($closePrices, $timePeriod);
if ($cmo === false) {
echo "Fehler bei der CMO-Berechnung." . PHP_EOL;
} else {
echo "CMO-Werte (Periode: {$timePeriod}):" . PHP_EOL;
foreach ($cmo as $index => $value) {
printf("Index %2d: %.4f\n", $index, $value);
}
}
?>
CMO zur Erkennung von Überkauf/Überverkauft-Zuständen
<?php
$closePrices = [
10, 11, 10.5, 12, 13, 12.5, 14, 15,
14.5, 13, 12, 11.5, 10, 9.5, 9, 8.5,
8, 7.5, 7, 6.5
];
$cmo = trader_cmo($closePrices, 14);
if ($cmo === false) {
echo "Berechnung fehlgeschlagen." . PHP_EOL;
} else {
foreach ($cmo as $i => $value) {
$signal = '';
if ($value >= 50) {
$signal = ' => ÜBERKAUFT';
} elseif ($value <= -50) {
$signal = ' => ÜBERVERKAUFT';
}
printf("Periode %d: CMO = %.2f%s\n", $i, $value, $signal);
}
}
?>
// Wichtig · Fallstricke
Voraussetzung: Die PECL-Erweiterung trader muss installiert und aktiviert sein (pecl install trader + extension=trader.so in der php.ini). Die Erweiterung basiert auf der TA-Lib-Bibliothek.
Look-back-Periode: Die ersten timePeriod Einträge des Eingabe-Arrays haben keine entsprechenden Ausgabewerte. Das Ergebnis-Array beginnt daher erst ab Index timePeriod - 1 (nullbasiert) des Eingabe-Arrays. Beim Mapping der Ausgabe-Indizes auf Original-Daten ist dies zu berücksichtigen.
Vergleich mit RSI: Der CMO unterscheidet sich vom RSI darin, dass er keine Glättung anwendet und direkt mit den rohen Kursveränderungen rechnet. Er reagiert dadurch empfindlicher auf Marktbewegungen, kann aber auch rauschempfindlicher sein.