Autor:
Witold Wozniak
Der Cycle Period Indikator ist ein nützliches Tool, um die Periodizität von Preisänderungen eines Finanzinstruments zu messen. Er speichert die aktuellen Marktzykluswerte in seinem Indikatorpuffer, die aus offensichtlichen Gründen nie stabil sind. Dieser Indikator wurde entwickelt, um in Kombination mit Oszillatoren verwendet zu werden, damit diese sich an die ständig wechselnden Marktzyklen anpassen können.
Inspiriert wurde dieser Indikator durch den Artikel von John Ehlers "Using The Fisher Transform", der im November 2002 in der Zeitschrift "Technical Analysis Of Stock & Commodities" veröffentlicht wurde.

Um den Cycle Period Indikator in einem anderen Indikator, wie beispielsweise dem RVI Oszillator, nutzen zu können, muss der Indikator-Handle global deklariert werden:
//---- Deklaration der Integer-Variablen für die Indikator-Handles int CP_Handle;
Im Anschluss muss der Handle des Cycle Period Indikators im Initialisierungsblock des RVI Indikators abgerufen werden:
//---- Abruf des Cycle Period Indikator-Handles CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha); if(CP_Handle==INVALID_HANDLE) { Print("Fehler beim Abrufen des CyclePeriod Indikator-Handles"); return(1); }
Jetzt haben wir die neue Alpha Variable, die der Eingabeparameter des verwendeten Indikators und der Periodenmittelwertverhältnis ist. Diese Variable muss in die Eingangsvariable des entwickelten Indikators umgewandelt werden.
//+----------------------------------------------+ //| Eingabeparameter des Indikators | //+----------------------------------------------+ input double Alpha=0.07; // Glättungsverhältnis des Indikators
Die bisherige Length Eingangsvariable muss aus der Liste der Eingabeparameter entfernt werden und stattdessen als lokale Variable innerhalb der OnCalculate() Funktion deklariert werden.
Die Größe der Arrays, die für die Glättung des Indikators verwendet werden, wird durch den Wert des Length Parameters festgelegt:
//---- Speicherverteilung für die Variablenarrays ArrayResize(Count,Length); ArrayResize(Value1,Length); ArrayResize(Value2,Length);
Der Wert dieses Parameters ändert sich jetzt, daher ist es besser, die Größen dieser Arrays nicht kleiner als den angenommenen hohen Wert dieser Variablen festzulegen. Bei der Analyse der Indikatorcharts sehen wir, dass dieser Wert 100 nicht überschreitet. Daher werden die Arraygrößen den gleichen Wert haben:
//---- Speicherverteilung für die Variablenarrays ArrayResize(Count,MAXPERIOD); ArrayResize(Value1,MAXPERIOD); ArrayResize(Value2,MAXPERIOD);
Im weiteren Verlauf müssen die Periodenwerte für die aktuelle Kerze im OnCalculate() Block aus dem CyclePeriod benutzerdefinierten Indikatorpuffer entnommen werden, damit sie anstelle des Wertes des ehemaligen Length Eingabeparameters verwendet werden können.
//---- Hauptberechnungsschleife des Indikators for(bar=first; bar<rates_total && !IsStopped(); bar++) { //---- Neu erschienene Daten in das Array kopieren if(CopyBuffer(CP_Handle,0,rates_total-1-bar,4,period)<=0) return(RESET); Length=int(MathFloor((4.0*period[0]+3.0*period[1]+2.0*period[2]+period[3])/20.0)); if(bar<Length) Length=bar; // Glättung auf die tatsächliche Anzahl der Kerzen beschränken
In diesem Fall werden die letzten vier Werte aus dem CyclePeriod Indikatorpuffer genommen und einer linear gewichteten Glättung unterzogen, nach der der gewonnene Wert als Length Glättungsperiode verwendet wird. Schließlich muss die Zeile am Ende des Indikatorcodes geändert werden:
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
So haben wir den Adaptive RVI Oszillator erhalten:

Verwandte Beiträge
- Tägliche prozentuale Veränderung in MT4 – Indikator für MetaTrader 4
- Uniformitätsfaktor-Indikator für MetaTrader 5: Analysiere deine Preisbewegungen
- Erstelle deinen eigenen neuronalen Netzwerk-Prädiktor für MetaTrader 4
- Tägliche prozentuale Veränderung in MT5 – Indikator für MetaTrader 5
- Boom Index Spike Pattern – Ein Leitfaden für MetaTrader 5 Trader