English Русский 中文 Español 日本語 Português
Der Indikator CCI: Drei Transformationsschritte

Der Indikator CCI: Drei Transformationsschritte

MetaTrader 5Indikatoren | 17 Oktober 2022, 09:27
290 0
Aleksej Poljakov
Aleksej Poljakov

Im vorangegangenen Artikel habe ich mögliche Veränderungen des herkömmlichen Commodity Channel Index-Indikators besprochen. Sie betrafen die Berechnungsmethoden, berührten aber nicht den Kern dieses Indikators. In diesem Artikel werde ich den Indikator aus einem etwas anderen Blickwinkel betrachten, indem ich seine Berechnungslogik ändere. Wir werden sehen, wie sich diese Änderungen auf die Ergebnisse des Indikators auswirken werden. Natürlich werde ich versuchen, die Gültigkeit der vorgenommenen Änderungen zu bewerten.


Schritt eins:

Der CCI basiert auf einfachen und intuitiven Berechnungen. Zunächst wird die Differenz zwischen dem aktuellen Preis und dem Durchschnittswert berechnet. Diese Differenz wird dann durch die Standardabweichung geteilt. Mit anderen Worten, wir bewerten, um wie viel mehr (oder weniger) die Differenz zwischen dem Preis und dem Stichprobenmittelwert im Vergleich zur Standardabweichung der Stichprobe ist.

Alles ist einfach und klar. Aber es gibt auch einen Nachteil, der zu falschen Entscheidungen führen kann. Nehmen wir zwei Sequenzen als Beispiel: 2, 1, 1 and 21, 11, 1. Wenn wir diese Sequenzen in die Sprache des Handels übersetzen, dann ist die erste eine Seitwärtsbewegung, und die zweite ist ein klarer und starker Trend.

Welche dieser beiden Sequenzen wird einen höheren CCI-Wert ergeben? Versuchen Sie, auf der Grundlage Ihrer Intuition zu antworten und Ihre Antwort zu begründen. In der Zwischenzeit werde ich die notwendigen Berechnungen anstellen.

Erste Sequenz

Zweite Sequenz

Wie wir sehen, führten beide Sequenzen zum gleichen Ergebnis. Der Hauptgrund ist, dass wir die Standardabweichung verwenden. Bei der ersten Sequenz ist der Unterschied zwischen dem aktuellen Wert und dem Durchschnitt gering. Aber auch die Standardabweichung ist gering. Bei der zweiten Sequenz hat sich die Differenz vergrößert, aber auch die Standardabweichung ist größer geworden. Deshalb führen die zwei unterschiedliche Sequenzen zum gleichen Ergebnis.

Wenn wir einen Händler nach seinen Anforderungen an einen technischen Indikator fragen, dann wird er höchstwahrscheinlich sagen: eine einzigartige Situation sollte zu einem einzigartigen Indikatorwert führen. Ist es möglich, einen solchen Wunsch zu erfüllen, wenn es um die CCI geht? Die Antwort ist ja. Um dies zu erreichen, müssen wir jedoch die Division aufgeben und durch die Multiplikation ersetzen. Die Formel des Indikators sieht dann wie folgt aus:

Mit einer solchen Änderung sollte der Indikator tendenzielle Kursbewegungen gut genug hervorheben, wenn sowohl die Differenz als auch die Standardabweichung groß sind. Dieser Ansatz hat jedoch seine Eigenheiten. Wir können die Bandbreite der Indikatorwerte und deren Höhe nicht (auch nicht annähernd) abschätzen. Dieses Manko lässt sich jedoch leicht beheben. Lassen wir den Indikator selbst berechnen, welche Werte er annimmt und wie oft. Nachdem wir diese Daten gesammelt haben, können wir die Indikatorstufe festlegen. Indikatorwerte, die leicht von Null abweichen, treten häufiger auf. Größere Werte werden seltener auftreten. Indem wir die Indikatorwerte nach der Häufigkeit ihres Auftretens abgrenzen, können wir die Indikatorstufen festlegen. Es ist zu berücksichtigen, dass die Statistiken für positive und negative Werte des Indikators voneinander abweichen können. Erfassen wir also die Daten für die positiven und negativen Werte getrennt.

Der Wert der Stufen selbst wird am einfachsten in Prozent angegeben. Wenn beispielsweise das Niveau 70 beträgt, dann ist dies genau der Anteil der Indikatorwerte, der zwischen dem Niveau und der Nulllinie liegt. Nur 30 % der Werte werden über die Stufen hinausgehen.

Um die Werte zu berechnen, gehen wir wie folgt vor. Wir erstellen zwei Arrays, in denen wir die Indikatorwerte speichern (positive und negative Werte sind voneinander getrennt).

int array_dn[],         // array for storing positive values
    array_up[],         // array for storing negative values
    size_dn=0,size_up=0;// array sizes

Legen wir die Array-Größen fest.

ArrayResize(array_up,size_up,rates_total);
ArrayResize(array_dn,size_dn,rates_total);

Sobald historische Daten zur Verfügung stehen, werden wir die erzielten Ergebnisse einstellen. Bitte beachten Sie, dass wir dem Array für negative Werte positive Zahlen zuweisen. Dies geschieht, um die spätere Handhabung zu erleichtern.

if(cci>0)
  {
   ArrayResize(array_up,size_up+1);
   array_up[size_up]=(int)MathRound(cci/_Point);
   size_up++;
  }
if(cci<0)
  {
   ArrayResize(array_dn,size_dn+1);
   array_dn[size_dn]=(int)MathRound(-cci/_Point);
   size_dn++;
  }

Bevor der Balken Null eröffnet wird, müssen diese Felder zunächst sortiert werden. Dann werden die Indizes der Array-Elemente ermittelt. Diese Zellen enthalten die Levelwerte. Vergessen wir nicht das Minuszeichen, um einen negativen Wert zurückzugeben.

ArraySort(array_up);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,array_up[size_up*level/100]*_Point);
ArraySort(array_dn);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-array_dn[size_dn*level/100]*_Point);

 

Werfen wir nun einen Blick auf unseren neuen Indikator.


Wie wir sehen können, haben alle Berechnungsoptionen ein ähnliches Bild ergeben. Der Hauptunterschied besteht in den numerischen Werten der Level. Interessanterweise unterscheiden sich die Werte für positive und negative Werte bei allen Optionen voneinander. Dies bedeutet, dass die Aufwärts- und Abwärtsbewegungen der Preise aus der Sicht des Indikators nicht symmetrisch sind, und unsere Annahme einer getrennten Sammlung von Statistiken hat sich als richtig erwiesen.

Noch interessanter ist es jedoch, unseren neuen Indikator mit dem herkömmlichen CCI zu vergleichen. Hier können wir auf Bereiche treffen, in denen die Indikatoren recht ähnlich aussehen

 

sowie die Abschnitte, in denen die Indikatoren ein anderes Verhalten zeigen. Dieser Unterschied wird besonders deutlich, wenn man auf die Kreuzungen der Indikatorlinie und ihre Level achtet.


Lassen Sie uns nun unseren neuen Indikator in Aktion testen. Entwickeln wir einen EA, der nach seinen Signalen handelt. Da sich die Indikatorwerte ändern können, werden wir die Regeln für die Eröffnung von Positionen wie folgt festlegen. Eine Kaufposition wird eröffnet, wenn der aktuelle Wert des Indikators unter dem negativen Niveau liegt und der vorherige Wert des Indikators unter dem aktuellen Wert liegt. Eine Verkaufsposition wird eröffnet, wenn der aktuelle Wert des Indikators über dem positiven Niveau liegt und der vorherige Wert über dem aktuellen Wert liegt. Die Eröffnung einer Position eines Typs führt zur Schließung aller anderen Positionen.

Testparameter: EURUSD H1, 2021.01.01 - 2021.12.31.

Die wichtigsten Ergebnisse der einzelnen Tests sind in der Tabelle aufgeführt:

TypInd
Nettogewinn, $
Bruttogewinn
Bruttoverlust
Positionen insgesamt
Klassisch 248.21
1 361.74
-1 113.53
823
Quadratisch -304.83
2 993.08
-3 297.91
3581
Modern -567.15
2 540.88
-3 108.03
3251

Interessanterweise führte die klassische Methode der Berechnung der Standardabweichung sofort zu einem positiven Ergebnis. Bei den letzten beiden Optionen ist die Zahl der Positionen deutlich gestiegen. Dies kann ein Hinweis darauf sein, dass die Auslöseschwellen der Indikatoren erhöht werden müssen. Dann wird die Zahl der Positionen abnehmen, und möglicherweise wird sich ihre Effizienz verbessern. Nachfolgend ist ein Beispiel für eine Saldenkurve für die klassische Version dargestellt.



Schritt zwei.

Bislang habe ich die Standardabweichung zur Berechnung des Indikators verwendet. Die Verwendung der Standardabweichung zur Normalisierung der Werte ist nur dann gerechtfertigt, wenn die Werte normalverteilt sind. Im Falle des CCI sind die Ausgangsdaten die Differenzen zwischen dem Preis und dem Durchschnitt. Wir wollen sehen, wie sie tatsächlich verteilt werden.

Um die Merkmale des erhaltenen Ergebnisses hervorzuheben, habe ich den Stichprobenumfang reduziert und Nullwerte daraus entfernt. Wie Sie sehen können, ist das Diagramm ziemlich eigenartig und sieht nicht einmal annähernd wie eine Normalverteilungsgrafik aus.

Wenn die Unterschiede nach einem empirischen Gesetz verteilt sind, können wir es uns leisten, auf die Standardabweichung zu verzichten. Dann verwandelt sich unser Indikator in eine Hälfte des CCI.

Lassen Sie uns über die Folgen eines solchen Schrittes nachdenken. Ohne Glättung ist die Streuung der Indikatorwerte natürlich recht groß und sieht etwas ungewöhnlich aus. Darüber hinaus können große Kursbewegungen die visuelle Wahrnehmung des Indikators beeinträchtigen. Diese Unzulänglichkeiten können jedoch einen großen Vorteil nicht aufwiegen.

Bei der Berechnung der Werte des CCI-Indikators verwenden wir einen einfachen Durchschnitt. Diese Gleichung ist wohlbekannt, aber ich werde sie hier trotzdem aufführen:

Doch was verbirgt sich hinter dieser Formel? Dies kann das arithmetische Mittel, der mathematische Erwartungswert einer Zufallsvariablen und ein rechteckiges Fenster (window function) sein. Konzentrieren wir uns auf die letzte Option. Warum ein rechteckiges Fenster? Schließlich gibt es noch andere Fensterfunktionen, die angewendet werden können.

Ich kenne etwa fünfzig Fensterfunktionen mit eigenen Namen. Die Zahl der Fensterfunktionen ohne Eigennamen ist viel größer.

Für das Experiment nehmen wir ein rechteckiges Fenster, ein dreieckiges Fenster und ein Fenster mit flacher Spitze. Die letzte Fensterfunktion ist eher ungewöhnlich, da einige ihrer Gewichte negative Werte annehmen. Nehmen wir außerdem drei asymmetrische Fenster - mit linearer, Potenz und exponentieller Gewichtung. Die Durchschnittswerte mit linearer und exponentieller Gewichtung sind unter im Menü Durchschnitt verfügbar.
Die Übersicht über alle Optionen ist in der Abbildung dargestellt (der unterste Indikator ist der klassische CCI).

Alle Optionen sind recht ähnlich, aber ihre Höhe kann sehr unterschiedlich sein. Es hängt von der verwendeten Fensterfunktion ab - einige von ihnen laufen hinterher, und relativ große Indikatorwerte können häufiger auftreten. Andere Fensterfunktionen folgen dem Preis, sodass kleine Abweichungen häufiger vorkommen.

Fügen wir dem Indikator außerdem zwei Glättungsoptionen hinzu, nur für den Fall. Sie ändern nicht das Wesen der Berechnungen, aber sie können den Indikator optisch attraktiver machen.

 

Lassen Sie uns einen weiteren EA entwickeln, um diesen hCCI-Indikator zu testen. Die Signale für das Öffnen und Schließen von Positionen sind genau dieselben wie beim vorherigen EA. Die Prüfparameter und das Prüfintervall sind ebenfalls dieselben wie im vorherigen Fall.

Die wichtigsten Testergebnisse sind in der Tabelle aufgeführt.

Fenster
Nettogewinn, $
Bruttogewinn
Bruttoverlust
Positionen insgesamt
Rectangular
224.57
1 745.03
-1 520.46
726
Triangular
94.17
1 532.10
-1 437.93
696
FlatTop
236.54
1 354.67
-1 118.13
643
LWMA
243.62
1 444.48
-1 200.86
639
Potenz
44.57
1 175.79
-1 131.22
561
Exponential
-317.41
725.11
-1 042.52
359

    Von allen Fensterfunktionen führte nur das Exponentialfenster zu einem negativen Ergebnis. Das bedeutet nicht, dass sie nicht für den Handel geeignet ist. Dies bedeutet, dass seine Parameter fein abgestimmt werden müssen. Auch die Regeln für die Schließung von Positionen sollten verbessert werden. (Dies gilt für alle EA-Versionen). Die Abbildung zeigt die Saldenkurve des EA mit der LWMA-Fensterfunktion.



    Schritt drei

    Bislang haben wir den CCI-Indikator als Oszillator betrachtet. Es wäre jedoch interessant, sie in das Hauptdiagramm zu verschieben und zu sehen, wie sie dort angezeigt wird. Schauen wir uns an, wie wir dies erreichen können.

    Die meisten Oszillatoren beruhen auf einem einfachen Prinzip — Unterdrückung des Hauptsignals, während subtile Kursbewegungen hervorgehoben werden. Um den Indikator in das Hauptchart zu übertragen, müssen wir also ein Referenzsignal zu seinem Wert hinzufügen. Im Falle des CCI kann der aktuelle Kurs oder der Durchschnitt als Signal verwendet werden. Die Gleichungen zur Berechnung des Indikatorwerts lauten dann wie folgt:

     

    Beide Optionen sind instabil. Ihre Werte können stark von der Preislinie abweichen. Dieser Nachteil wird jedoch durch die Tatsache ausgeglichen, dass beide Indikatoren Trendkursbewegungen gut aufzeigen können.


     


    Schlussfolgerung

    Die vorgestellten Indikatoren sind eine Weiterentwicklung der Grundsätze des klassischen CCI-Indikators. Der unbestrittene Vorteil der neuen Indikatoren ist die Möglichkeit, sie nach Belieben des Händlers anzupassen.

    Indikator-Parameter

    pCCI-Indikator

     

    • TypInd – legt die Methode zur Berechnung der Indikatorwerte fest;
    • iPeriode – Indikatorperiode, Mindestwert 2;
    • iLevel – Wert der Indikatorstufen, gültiger Wert 1 - 99.

       hCCI-Indikator

    • Window – Typ der verwendeten Fensterfunktion;
    • Smoothing – angewandte Glättung;
    • iPeriod – Indikatorperiode, Mindestwert 2;
    • iLevel – Wert der Indikatorstufen, gültiger Wert 1 - 99.

      lCCI-Indicator

    • Window – Typ der verwendeten Fensterfunktion;
    • Direct – Typ des Referenzsignals;
    • iPeriod – Indikatorperiode, Mindestwert 2.

      Skript für die Verteilung von Differenzen

    • Length – Glättungslänge;
    • Level – maximaler Probenwert;
    • ViewDuration – Anzeigedauer;
    • ScreenShot – wenn der Parameter aktiviert ist, wird das Chart im Ordner "Dateien" gespeichert.

    EA pCCI

    Alle seine Parameter sind die gleichen wie die des pCCI-Indikators.  Signale für die Eröffnung und Schließung von Positionen treten auf, wenn ein neuer Balken eröffnet wird.

      EA hCCI

      Seine wichtigsten Einstellungen entsprechen denen des hCCI-Indikators. 

      Übersetzt aus dem Russischen von MetaQuotes Ltd.
      Originalartikel: https://www.mql5.com/ru/articles/8860

      Beigefügte Dateien |
      pCCI.mq5 (5.11 KB)
      hCCI.mq5 (4.68 KB)
      lCCI.mq5 (6.77 KB)
      EA_pCCI.mq5 (8.8 KB)
      EA_hCCI.mq5 (8.6 KB)
      pCCI.mq4 (6.51 KB)
      hCCI.mq4 (5.69 KB)
      lCCI.mq4 (4.39 KB)
      EA_pCCI.mq4 (7.64 KB)
      EA_hCCI.mq4 (7.44 KB)
      DoEasy. Steuerung (Teil 13): Optimierung der Interaktion von WinForms-Objekten mit der Maus, Beginn der Entwicklung des WinForms-Objekts TabControl DoEasy. Steuerung (Teil 13): Optimierung der Interaktion von WinForms-Objekten mit der Maus, Beginn der Entwicklung des WinForms-Objekts TabControl
      In diesem Artikel werde ich den Umgang mit dem Aussehen von WinForms-Objekte nach dem Bewegen des Mauszeigers weg von dem Objekt, sowie die Entwicklung der TabControl WinForms-Objekt korrigieren und optimieren.
      Neuronale Netze leicht gemacht (Teil 22): Unüberwachtes Lernen von rekurrenten Modellen Neuronale Netze leicht gemacht (Teil 22): Unüberwachtes Lernen von rekurrenten Modellen
      Wir untersuchen weiterhin Modelle und Algorithmen für unüberwachtes Lernen. Diesmal schlage ich vor, dass wir die Eigenschaften von AutoAutoencodern bei der Anwendung auf das Training rekurrenter Modelle diskutieren.
      Neuronale Netze leicht gemacht (Teil 23): Aufbau eines Tools für Transfer Learning Neuronale Netze leicht gemacht (Teil 23): Aufbau eines Tools für Transfer Learning
      In dieser Artikelserie haben wir bereits mehr als einmal über Transfer Learning berichtet. In diesem Artikel schlage ich vor, diese Lücke zu schließen und einen genaueren Blick auf Transfer Learning zu werfen.
      DoEasy. Steuerung (Teil 12): WinForms-Objekte Basislistenobjekt, ListBox und ButtonListBox DoEasy. Steuerung (Teil 12): WinForms-Objekte Basislistenobjekt, ListBox und ButtonListBox
      In diesem Artikel werde ich das Basisobjekt der WinForms-Objektlisten sowie die beiden neuen Objekte erstellen: ListBox und ButtonListBox.