Untersuchung von Techniken zur Analyse der Kerzen (Teil I): Überprüfen vorhandener Muster

Alexander Fedosov | 19 April, 2019

Inhaltsverzeichnis

Einführung

Die Analyse von Kerzen ist vor mehr als 20 Jahren erschienen und erfreut sich inzwischen großer Beliebtheit. Viele Händler halten japanische Kerzen für die bequemste und leicht verständlichste Form der Visualisierung von Vermögenspreisen. Ähnliche Balkenmuster liefern keine so klare Darstellung. Japanische Kerzen sind komfortabler in Bezug auf die Einrichtung und Anzeige der Farbe von Kerzenkörper und ermöglichen so eine bessere Visualisierung von Marktentwicklungen.

Eine Vielzahl von verschiedenen Analysemethoden für Kerzen impliziert verschiedene Klassifizierungen von Kerzen oder Kombinationen von Kerzen (Mustern), die auf mögliche Marktveränderungen hinweisen können. Einige Muster deuten auf eine Fortsetzung des aktuellen Trends hin, andere deuten auf eine Trendumkehr und Seitwärtsbewegungen hin.

Allerdings kann das Alter und die Popularität der Kerzenanalyse für diejenigen, die ihr blind folgen, schädlich sein. Die Märkte stehen nicht still. Nicht nur die Marktdynamik hat sich nach 20 Jahren verändert, sondern auch die Faktoren, die die Marktbewegung beeinflussen. Einige Marktteilnehmer begannen, die Popularität der Kerzenanalyse zu nutzen und spielten gegen sie.

Das ist es, was wir in diesem Artikel tun werden. Betrachten wir einige bekannte Methoden zur Bestimmung der Marktbewegung und prüfen wir, ob sie in der heutigen Realität noch relevant und effektiv sind. 


Definition des Problems

Um die Effizienz eines Musters zu bewerten, lassen Sie uns einen universellen Algorithmus zur Bewertung seiner Leistung entwickeln. Abbildung 1 zeigt das allgemeine Aktionsschema. Lassen Sie uns einen genaueren Blick darauf werfen.


Abb.1 Algorithmus zur Leistungsbewertung der Muster

Schritt 1. Wählen Sie ein beliebtes Kerzenmuster aus, um seine erwartete Bedeutung und das tatsächliche Ergebnis zu vergleichen. Aus Gründen der Übersichtlichkeit liefert der Algorithmus ein Beispiel in Form des Kerzenmusters Harami Cross (Aufwärtsmuster), d.h. es wird ein Aufwärtstrend erwartet. 

Schritt 2. Definieren Sie das historische Zeitintervall und den Zeitrahmen. Dies ermöglicht eine tiefere Erkenntnis und Bestätigung der Effizienz des Musters. Dies kann auch helfen, eine Abhängigkeit von dem analysierten Umfang der Historie zu finden oder einen Zeitrahmen zu bestimmen, in dem das Muster effizient ist oder überhaupt nicht funktioniert.

Schritt 3. Zählen Sie die Anzahl der Mustervorkommen im ausgewählten Intervall. Diese Nummer wird für die kumulative Bewertung verwendet, die später besprochen wird.

Schritt 4. Analysieren der einzelnen Musterübereinstimmungen mit einem Aufwärtstrend, Abwärtstrend oder einer Seitwärtsbewegung. Hier müssen wir die Genauigkeit der Vorhersage definieren, d.h. um wie viele Punkte sich der Preis in die erwartete Richtung bewegt hat. Angenommen, der Trend wird aus einer Preisbewegung von nicht weniger als 50 Punkten in die eine oder andere Richtung gebildet. Wird der angegebene Bewegungsschwellenwert nicht erreicht, wird davon ausgegangen, dass sich der Trend nach dem Muster nicht gebildet hat.   

Schritt 5. Wie bestimmt man die Qualität der Trendbewegung? Der Preis kann den Schwellenwert von 50 Punkten nach der Musterbildung überschreiten, aber wie lange dauert das? Dies kann in einer Kerze des analysierten Zeitraums oder in 10 Kerzen erfolgen. Daher muss der Trend effektiv sein, denn das Finden des Musters und das Warten auf einen Gewinn nach dem Eintreten in das Mustersignal wäre sehr riskant und ineffizient. Zu diesem Zweck wurden die folgenden Kategorien für eine Trendeffizienz eingeführt.

Eine solche Kategorisierung der Trendergebnisse ermöglicht eine objektivere Beurteilung der Effizienz des aktuellen Musters.

Schritt 6. Berechnen Sie die folgenden Variablen:

Abbildung 2 zeigt ein Beispiel für das Finden, Zählen und Kategorisieren von Auf- und Abwärtstrends aus der Gesamtstichprobe der gefundenen Kerzenmuster.


Abb.2 Algorithmus und Beispiel für die Trenderkennung und -kategorisierung.

In diesem Beispiel haben wir die Stichprobe von 2000 Kerzen im H1-Zeitfenster analysiert (Abb.1) und 50 Übereinstimmungen für unser Muster gefunden. Nach diesem Muster gelingt es dem Preis, den Schwellenwert um 50 Punkte 20 mal nach oben und um das Zehnfache nach unten zu bewegen. Von all diesen 20 Fällen von Aufwärtsbewegung erreichte der Preis 50 Punkte innerhalb einer Kerze 5 mal, 7 mal wurde er innerhalb von 2 Kerzen gemacht und 8 mal wurde die Schwelle innerhalb von 3 Kerzen erreicht.

Dasselbe gilt für den Abwärtstrend. Aus Abbildung 2 ist ersichtlich, dass die Chance und Geschwindigkeit des Aufwärtstrends höher ist. Es ist jedoch nicht immer möglich, den Zustand auf einen Blick zu bestimmen. Eine solche Sichtprüfung kann trügerisch sein. Insbesondere können Sie leicht verwirrt sein, wenn Sie ein Muster auf verschiedenen Intervallen und Zeitrahmen analysieren.

Aus diesem Grund habe ich mich entschieden, einen kumulativen Koeffizienten für die allgemeine Bewertung einer beliebigen Mustereffizienz in einer bestimmten Trendrichtung einzuführen. Es sieht wie folgt aus:

Hier ist E die Trendeffizienz und P die Wahrscheinlichkeit eines Trends. Betrachten wir die Formel der Trendeffizienz:


Hier zeigen A, B und C , wie oft der gefundene Trend in einer der Kategorien gefunden wurde. k1, k2, k3 sind Gewichtskoeffizienten, da die Bedeutung des Einordnens in diese Kategorien unterschiedlich ist. Der Trend der Kategorie A, wenn der Schwellenwert innerhalb einer Kerze erreicht wird, ist signifikanter als bei Erreichen innerhalb von 3 Kerzen. Die Standardprioritäten sind wie folgt: k1 = 1, k2 = 0,5, k3 = 0,25. Dies ist eine subjektive Wahrnehmung, so dass Sie Ihre eigenen bevorzugten Werte einstellen können. S ist die Gesamtzahl der gefundenen Trends des gegebenen Typs. Die Möglichkeit der Trendentstehung P ist das Verhältnis der Anzahl der gefundenen Trends eines bestimmten Typs (A, B oder C) zur Gesamtzahl der gefundenen Kerzenmuster aus der gegebenen Probe. Dies ist eigentlich die Wahrscheinlichkeit, dass sich der Preis basierend auf den vorangegangenen Aktionen in der Geschichte in eine bestimmte Richtung bewegt. Lassen Sie uns den Wirkungsgrad für den Auf- und Abwärtstrend in unserem Beispiel aus Abbildung 2 berechnen.

Die Möglichkeit der Trendentstehung P ist das Verhältnis der Anzahl der gefundenen Trends eines bestimmten Typs (A, B oder C) zur Gesamtzahl der gefundenen Kerzenmuster aus der gegebenen Probe. Dies ist eigentlich die Wahrscheinlichkeit, dass sich der Preis basierend auf den vorangegangenen Aktionen in der Historie in eine bestimmte Richtung bewegt.

Lassen Sie uns die Effizienz für den Auf- und Abwärtstrend in unserem Beispiel aus Abbildung 2 berechnen.  


Abb.3 Die Ergebnisse der Effektivitätsberechnung.

Die folgenden Ergebnisse wurden aus den Berechnungen gewonnen:

  • Die Effizienz von Trend E war für den Aufwärtstrend höher, was auch optisch beobachtet wurde. Jetzt haben wir jedoch eine quantitative Bewertung.
  • Die Wahrscheinlichkeit der Trendentstehung P im Falle der Bildung dieses Musters beträgt 40% für einen Aufwärtstrend und 20% für einen Abwärtstrend.
  • Somit ist die allgemeine Effizienz des Musters für die Aufwärtsprognose mehr als doppelt so hoch. 

Für weitere Untersuchungen der Musterrelevanz werden wir auf zwei Hauptparameter achten: die Wahrscheinlichkeit, dass sich der Preis in die durch das Kerzenmuster vorhergesagte Richtung bewegt, und den berechneten Effizienzbewertungskoeffizienten. 

Dies wird drei wesentliche Schlussfolgerungen für unsere Forschung ermöglichen:

  1. Funktioniert das Muster unter den heutigen Marktbedingungen?
  2. Wenn es funktioniert, wie stehen die Chancen der Vorhersage, dass sie bei der Musterentstehung erfüllt wird?
  3. Wie viel und wie schnell können wir in diesem Fall verdienen?

 

Entwicklung einer Prototyp-Schnittstelle für die Musteranalyse der Kerzen

Um die bestehenden Muster innerhalb des vorgeschlagenen Modells zu untersuchen, ist es notwendig, eine geeignete grafische Oberfläche zu entwerfen, die auf den definierten Aufgaben basiert. Zu diesem Zweck werden wir die bestehende Bibliothek für die Erstellung von grafischen Oberflächen EasyAndFastGUI nutzen.

Bevor wir mit der praktischen Umsetzung fortfahren, müssen wir die externe Struktur definieren und einen Prototyp der zukünftigen grafischen Anwendung erstellen. Dann werden wir es mit der Software-Implementierung füllen.

Die allgemeine Struktur wird aus zwei Registerkarten bestehen. Die erste Registerkarte wird für die Analyse bestehender Muster verwendet und die zweite Registerkarte enthält die erforderlichen Setup-Elemente. Lassen Sie uns die erste Registerkarte genauer betrachten.


Abb.4 Die Struktur der Registerkarte Analyze.

Sie besteht aus fünf wichtigen Interaktionsobjekten:

  1. Umschalten zwischen den beiden zwei Registerkarten, Analyze (Analyse) und Settings (Einstellungen).
  2. Tool zur Suche nach Währungsinstrumenten, die für die Analyse benötigt werden.
  3. Ergebnistabelle, die den Namen des zu analysierenden Musters, die Anzahl der Übereinstimmungen im Stichprobenbereich, die Häufigkeit des Auftretens des Musters innerhalb der Studie, die Aufwärts- und Abwärtswahrscheinlichkeiten und den geschätzten Effizienzbewertungskoeffizienten für dieses Muster für den Aufwärtstrend und die Abwärtsrichtung enthält. Diese Informationen helfen uns zu verstehen, ob die Musterleistung den erwarteten Prognoseeigenschaften entspricht und ob die Ergebnisse mit den Prognosen übereinstimmen.
  4. Der Zeitrahmen, in dem die Kerzenmuster untersucht werden.
  5. Die Zeitspanne, oder die Anzahl der Kerzen des angegebenen Zeitraums, mit denen die Muster getestet werden.

Betrachten Sie dann die zweite Registerkarte Settings (Einstellungen). 


Abb.5 Die Struktur der Registerkarte Settings (Einstellungen).

Dieser Abschnitt enthält Einstellungen von Parametern, die die Ergebnisse der Musteranalyse beeinflussen.

  1. Die Liste der grundlegenden Kerzen, die bei der Musterbildung verwendet werden. 
  2. Dialogfenster. Es öffnet sich mit einem Klick auf das Zahnradsymbol. In diesem Fenster werden individuelle Einstellungen für die Parameter der an der Musterbildung beteiligten Grundkerzen vorgenommen.
  3. Einstellung von Gewichtskoeffizienten, die bei der Berechnung der Wirkungsgrade des zu analysierenden Musters verwendet werden.
  4. Trend-Schwellenwert in Punkten - wenn der Preis diese Schwelle erreicht, ist dies eine Bestätigung der Trendbewegung und das Muster gilt als erfolgreich.

Implementierung des Tools

Nach der Definition der theoretischen Grundlagen und der Erstellung des Prototypen müssen wir die Reihenfolge festlegen, in der die Anwendungselemente gebaut werden. Wie in Abbildung 5 zu sehen ist, haben wir zwei getrennte Fenster. Die erste hat zwei Registerkarten, Analyse und Einstellungen, während die zweite zusätzliche individuelle Einstellungen für Kerzentypen enthält. Daher sehen die beiden Verfahren zum Erstellen so aus:

//+------------------------------------------------------------------+
//| Erstellen der grafischen Schnittstelle des Programms             |
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Creating a panel
   if(!CreateWindow("Pattern Analyzer"))
      return(false);
//--- Creating a dialog window
   if(!CreateWindowSetting("Settings"))
      return(false);
//--- Beenden der Erstellung des GUI
   CWndEvents::CompletedGUI();
   return(true);
  }
//+-----------------------------------------------------------------

Lassen Sie uns nun einen genaueren Blick darauf werfen, was jede dieser Methoden beinhaltet. Wir werden nicht ins kleinste Detail von jede der Methoden eingehen, sondern auf die wichtigsten Merkmale eingehen, die in direktem Zusammenhang mit den Analysemethoden von Kerzen stehen. Jede Methode zur Erstellung des Hauptanwendungsfensters CreateWindow() besteht also aus den folgenden Methoden, die Oberflächenelemente implementieren:

  • CreateTabs() — Implementiert die Registerkarten Analysis und Settings.
  • CreateSymbolsFilter() — Ein Eingabefeld und ein Kontrollkästchen zur Suche nach dem gewünschten Symbol.
  • CreateRequest() — Die Schaltfläche, die durch einen Klick die Suche gestartet.
  • CreateRange() — Eingabefeld zur Angabe des Abtastbereichs.
  • CreateComboBoxTF() — Eine Dropdown-Liste zur Auswahl eines Zeitraums, in dem die Analyse durchgeführt werden soll.
  • CreateSymbTable() — Erstellt eine Tabelle mit den Ergebnissen der Symbolsuche.
  • CreateTable() — Eine Tabelle mit dem Kerzenmuster, das die Ergebnisse analysiert.
  • CreateStatusBar() — Eine Statusleiste, die das aktuell zur Analyse ausgewählte Symbol anzeigt; alternativ wird angezeigt, dass das Symbol nicht ausgewählt ist.

 Diese Liste von Methoden implementiert grafische Elemente auf der Registerkarte Analyse. Nachfolgend finden Sie die Methoden der Registerkarte Settings.

  • CreateCandle() — Das Verfahren zum Erzeugen eines Verbundelements, das aus dem Kerzenleuchtbild und einem Zahnradtaster besteht (Position 1 in Figur 4). 
  • CreateTextLabel() — Das Verfahren zur Visualisierung von Textheadern vor Gruppenkoeffizienten (Position 3 in Abbildung 4).
  • CreateCoef() — Die Methode zeigt ein Eingabefeld für den Gewichtskoeffizienten an.
  • CreateThresholdValue() — Das Verfahren wird zur Anzeige des Eingabefeldes für den Gewinnschwellenwert in Punkten verwendet.

Betrachten wir nun die Struktur des zweiten Fensters mit zusätzlichen Einstellungen, die mit der Methode CreateWindowSetting() implementiert wurden.

Wir haben eine Schnittstelle für die Interaktion geschaffen. Lassen Sie uns nun mit der Implementierung von Berechnungs- und Bewertungsmethoden fortfahren, die ganz am Anfang des Abschnitts zur Aufgabendefinition beschrieben wurden. Definieren wir die Entwicklungsstadien und Eingangsbedingungen, die für die Analyse von Kerzenmustern verwendet werden.


Abb.6 Ergebnis der Erstellung der grafischen Benutzeroberfläche.

Wie man weiß, gibt es Muster, die aus einer Kerze eines bestimmten Typs, aus zwei, drei und mehr Kerzen bestehen. Lassen Sie uns die grundlegenden Kerzentypen aufzählen, die in unseren Kerzenmustern verwendet werden:

  • Lange Kerze. Kerzenkörper > (durchschnittlicher Körper der letzten 5 Tagen)*K1, wobei K1 der einstellbare Koeffizient ist (Abb.4).
  • Kurze Kerze. Kerzenkörper < (durchschnittlicher Körper der letzten 5 Tagen)*K1.
  • Spinning Tops. Unterer Schatten > Körper*K1 und oberer Schatten > Körper*K1.
  • Doji. Doji Körper< (Bereich von Hoch bis Tief)*K1.
  • Marubozu. Unterer Schatten < Körper*K1 oder Oberer Schatten < Körper*K1.
  • Hammer. Unterer Schatten > Körper*K1 und Oberer Schatten < Körper*K2.

Betrachten wir nun die bekannten Candlestick-Muster, die auf unsere Analysemethode angewendet werden. Wir werden mit zwei Musterkategorien arbeiten: Diese bestehen aus einem Kerzenhalter und zwei Kerzen.

Muster mit einer Kerze:

  • Hammer (Aufwärtsmuster).
  • Hanging Man (Abwärtsmuster).
  • Inverted hammer (Aufwärtsmuster).

Muster mit zwei Kerzen:

  • Shooting Star (Abwärtsmuster).
  • Engulfing (Aufwärtsmuster).
  • Engulfing (Abwärtsmuster).
  • Harami Cross (Aufwärtsmuster).
  • Harami Cross (Abwärtsmuster).
  • Harami (Aufwärtsmuster).
  • Harami (Abwärtsmuster).
  • Doji Star (Aufwärtsmuster).
  • Doji Star (Abwärtsmuster).
  • Piercing (Aufwärtsmuster).
  • Dark Cloud Cover (Abwärtsmuster).

Diese Art von Kerzen und die Möglichkeiten, sie zu identifizieren, wurden im Artikel Analyse von Kerzenmustern ausführlich beschrieben. Diese Methoden wurden für den Analysealgorithmus der Kerzen angepasst.

Der Algorithmus selbst sieht wie folgt aus:

1. CandleType() bestimmt den grundlegenden Kerzentyp.

//--- Determine the candlestick type   
   res.type=CAND_NONE;
//--- long 
   if(res.bodysize>sum*m_long_coef)
      res.type=CAND_LONG;
//--- sort 
   if(res.bodysize<sum*m_short_coef)
      res.type=CAND_SHORT;
//--- doji
   if(res.bodysize<HL*m_doji_coef)
      res.type=CAND_DOJI;
//--- maribozu
   if((shade_low<res.bodysize*m_maribozu_coef || shade_high<res.bodysize*m_maribozu_coef) && res.bodysize>0)
      res.type=CAND_MARIBOZU;
//--- hammer
   if(shade_low>res.bodysize*m_hummer_coef2 && shade_high<res.bodysize*m_hummer_coef1)
      res.type=CAND_HAMMER;
//--- invert hammer
   if(shade_low<res.bodysize*m_hummer_coef1 && shade_high>res.bodysize*m_hummer_coef2)
      res.type=CAND_INVERT_HAMMER;
//--- spinning top
   if(res.type==CAND_SHORT && shade_low>res.bodysize*m_spin_coef && shade_high>res.bodysize*m_spin_coef)
      res.type=CAND_SPIN_TOP;

2. Die Methode PatternType() bestimmt das Muster basierend auf den von CandleType() bereitgestellten Daten der analysierten Kerze oder der zwei Kerzen, die eines der oben genannten Muster bilden.

for(int i=m_range_total;i>3;i--)
     {
      CandleType(symbol,cand2,i);                                                      // Vorherige Kerze
      CandleType(symbol,cand1,i-1);                                                    // Aktuelle Kerze

      //--- Inverted Hammer, Aufwärtsmuster
      if(cand2.trend==DOWN &&                                                             // Prüfen der Trendrichtung
         cand2.type==CAND_INVERT_HAMMER)                                                  // Prüfen des "Inverted Hammer"
        {
         m_invert_hummer_total++;
         GetCategory(symbol,i-3,invert_hummer_coef);
        }

      //--- Hanging man, abwärts
      if(cand2.trend==UPPER &&                                                            // Prüfen der Trendrichtung
         cand2.type==CAND_HAMMER)                                                         // Prüfen von "Hammer"
        {
         m_handing_man_total++;
         GetCategory(symbol,i-3,handing_man_coef);
        }
      //--- Hammer, Aufwärtsmuster
      if(cand2.trend==DOWN &&                                                             // Prüfen der Trendrichtung
         cand2.type==CAND_HAMMER)                                                         // Prüfen von "Hammer"
        {
         m_hummer_total++;
         GetCategory(symbol,i-3,hummer_coef);
        }
      //---
      //--- Shooting Star, Abwärtsmuster
      if(cand1.trend==UPPER && cand2.trend==UPPER &&                                      // Prüfen der Trendrichtung
         cand2.type==CAND_INVERT_HAMMER && cand1.close<=cand2.open)                       // Prüfen von "Inverted Hammer"
        {
         m_shooting_star_total++;
         GetCategory(symbol,i-4,shooting_star_coef);
        }

      //--- Engulfing, Aufwärtsmuster
      if(cand1.trend==DOWN && cand1.bull && cand2.trend==DOWN && !cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         cand1.bodysize>cand2.bodysize &&
         cand1.close>=cand2.open && cand1.open<cand2.close)
        {
         m_engulfing_bull_total++;
         GetCategory(symbol,i-4,engulfing_bull_coef);
        }

      //--- Engulfing, Abwärtsmuster
      if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         cand1.bodysize<cand2.bodysize &&
         cand1.close<=cand2.open && cand1.open>cand2.close)
        {
         m_engulfing_bear_total++;
         GetCategory(symbol,i-4,engulfing_bear_coef);
        }

      //--- Harami Cross, aufwärts
      if(cand2.trend==DOWN && !cand2.bull &&                                              // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // Prüfen auf eine Lange erste Kerze und der Doji-Kerze
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // Doji ist innerhalb des Körpers der vorherigen Kerze
        {
         m_harami_cross_bull_total++;
         GetCategory(symbol,i-4,harami_cross_bull_coef);
        }

      //--- Harami Cross, Abwärtsmuster
      if(cand2.trend==UPPER && cand2.bull &&                                              // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // Checking the "long" candlestick and doji
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // Doji ist innerhalb des Körpers der vorherigen Kerze 
        {
         m_harami_cross_bear_total++;
         GetCategory(symbol,i-4,harami_cross_bear_coef);
        }

      //--- Harami, aufwärts
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull &&                                // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU)  &&                         //Prüfen auf eine Lange erste Kerze
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // Die zweite Kerze ist kein Doji und der Körper der ersten Kerze ist größer als der der zweiten
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // Der Körper der zweiten Kerze ist innerhalb des Körpers der ersten
        {
         m_harami_bull_total++;
         GetCategory(symbol,i-4,harami_bull_coef);
        }

      //--- Harami, abwärts
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull &&                               // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) &&                          // Prüfen auf eine Lange erste Kerze
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // Die zweite Kerze ist kein Doji und der Körper der ersten Kerze ist größer als der der zweiten
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // Der Körper der zweiten Kerze ist innerhalb des Körpers der ersten 
        {
         m_harami_bear_total++;
         GetCategory(symbol,i-4,harami_bear_coef);
        }

      //--- Doji Star, aufwärts
      if(cand1.trend==DOWN && !cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // Prüfen der ersten "langen" Kerze und der zweiten Doji
         cand1.close<=cand2.open)                                                         // Der Eröffnungspreis des Open ist kleiner oder gleich dem Schlusskurs der ersten Kerze
        {
         m_doji_star_bull_total++;
         GetCategory(symbol,i-4,doji_star_bull_coef);
        }

      //--- Doji Star, abwärts
      if(cand1.trend==UPPER && cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // Prüfen der ersten "langen" Kerze und der zweiten Doji
         cand1.open>=cand2.close)                                                         //Der Eröffnungspreis des Open ist kleiner oder gleich dem Schlusskurs der ersten Kerze
        {
         m_doji_star_bear_total++;
         GetCategory(symbol,i-4,doji_star_bear_coef);
        }

      //--- Piercing, Aufwärtsmuster
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // Prüfen der "langen" Kerze
         cand1.close>(cand2.close+cand2.open)/2 && // 2te Kerze schließt über der Mitte der ersten Kerze
         cand2.open>cand1.close && cand2.close>=cand1.open)
        {
         m_piercing_line_total++;
         GetCategory(symbol,i-4,piercing_line_coef);
        }

      //--- Dark Cloud Cover, abwärts
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull && // Prüfen der Trendrichtung und der Kerzenrichtung
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // Prüfen der "langen" Kerze
         cand1.close<(cand2.close+cand2.open)/2 && // 2te Kerze schließt über der Mitte der ersten Kerze
         cand1.close<cand2.open && cand2.close<=cand1.open)
        {
         m_dark_cloud_cover_total++;
         GetCategory(symbol,i-4,dark_cloud_cover_coef);
        }
     }

3. Wie aus dem obigen Code ersichtlich ist, wird beim Bestimmen eines der angegebenen Muster die Historie mit der Methode GetCategory() überprüft. Es wird die Richtung des Preises nach der Signalentstehung überprüft. Das heißt, es werden für jedes der gefundenen Muster Preisbewegungskategorien ermittelt, wie in Abbildung 1 beschrieben.

//+------------------------------------------------------------------+
//| Festlegen der Gewinnkategorien                                   |
//+------------------------------------------------------------------+
bool CProgram::GetCategory(const string symbol,const int shift,int &category[])
  {
   MqlRates rt[];
   int copied=CopyRates(symbol,m_timeframe,shift,4,rt);
   int rating=0;
//--- Get details of the previous candlestick
   if(copied<4)
      return(false);
   double high1,high2,high3,low1,low2,low3,close0,point;
   close0=rt[0].close;
   high1=rt[1].high;
   high2=rt[2].high;
   high3=rt[3].high;
   low1=rt[1].low;
   low2=rt[2].low;
   low3=rt[3].low;
   if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point))
      return(false);

//--- Check if it is the Uptrend
   if((int)((high1-close0)/point)>=m_threshold_value)
     {
      category[0]++;
     }
   else if((int)((high2-close0)/point)>=m_threshold_value)
     {
      category[1]++;
     }
   else if((int)((high3-close0)/point)>=m_threshold_value)
     {
      category[2]++;
     }

//--- Check if it is the Downtrend

   if((int)((close0-low1)/point)>=m_threshold_value)
     {
      category[3]++;
     }
   else if((int)((close0-low2)/point)>=m_threshold_value)
     {
      category[4]++;
     }
   else if((int)((close0-low3)/point)>=m_threshold_value)
     {
      category[5]++;
     }
   return(true);
  }

4. Nach dem Bestimmen der Kategorie und dem Berechnen von "wie oft und in welche Richtung sich der Preis nach der Mustererkennung bewegt hat", werden weitere Parameter berechnet, wie z.B. das Auftreten, die Aufwärts- und Abwärtswahrscheinlichkeit sowie der Effizienzbewertungskoeffizient für dieses Muster für den Aufwärtstrend und die Abwärtsrichtung. Diese Berechnung wird mit der Methode CoefCalculation() durchgeführt.

//+------------------------------------------------------------------+
//| Berechnung der Effizienz der Bewertungskoeffizienten             |
//+------------------------------------------------------------------+
bool CProgram::CoefCalculation(const int row,int &category[],int found)
  {
   double p1,p2,k1,k2;
   int sum1=0,sum2=0;
   for(int i=0;i<3;i++)
     {
      sum1+=category[i];
      sum2+=category[i+3];
     }
//---
   p1=(found>0)?NormalizeDouble((double)sum1/found*100,2):0;
   p2=(found>0)?NormalizeDouble((double)sum2/found*100,2):0;
   k1=(found>0)?NormalizeDouble((m_k1*category[0]+m_k2*category[1]+m_k3*category[2])/found,3):0;
   k2=(found>0)?NormalizeDouble((m_k1*category[3]+m_k2*category[4]+m_k3*category[5])/found,3):0;

   m_table.SetValue(3,row,(string)p1,2);
   m_table.SetValue(4,row,(string)p2,2);
   m_table.SetValue(5,row,(string)k1,2);
   m_table.SetValue(6,row,(string)k2,2);
//--- Aktualisieren der Tabelle
   m_table.Update(true);
   m_table.GetScrollVPointer().Update(true);
   m_table.GetScrollHPointer().Update(true);
   return(true);
  }

Basierend auf diesen Berechnungen können wir beurteilen, ob das Muster den erwarteten Bewegungseigenschaften entspricht.


Ergebnisse der Studie

Um die Kerzenmuster zu analysieren, verwenden wir eine Reihe von Symbolen aus der Kategorie forex.major im MetaTrader 5 Terminal. Um sie nicht nacheinander einzugeben, wurde ein spezielles Schlüsselwort hinzugefügt, das die gesamte Liste enthält. Wenn Sie das Schlüsselwort Major eingeben, wird die gewünschte Liste, wie in Abb.7 gezeigt, angezeigt.


Abb.7 Schnellauswahl der wichtigsten Symbole.

Wir werden keine zusätzlichen Einstellungen für die Kerzenmuster vornehmen. Der einzige editierbare Parameter ist der Trendschwellenwert in Punkten. Die Profit-Targets für verschiedene Zeitrahmen sollten angepasst werden, da zu große Profit-Targets bei kleinen Zeitrahmen zu keinem Ergebnis führen, und zu kleine Profit-Targets für höhere Zeitrahmen zu dem entgegengesetzten Ergebnis führen. 

Um die obige Annahme zu testen, wählen wir zwei Zeitrahmen aus und ändern den Schwellenwert. Dies wird es uns ermöglichen, die Wirkung des Parameters zu sehen. Ich habe mich entschieden, eine kleine Teststichprobe in Betracht zu ziehen, denn wenn wir jedes Währungspaar auf die vorgeschlagenen 21 Zeitrahmen und Änderungsparameter betrachten, wird es viele verwirrende Informationen geben. Sie können das gewünschte Paar, den Zeitrahmen und das historische Zeitintervall auswählen, um verschiedene Schwellenwerte selbst zu testen.

Hier ist die erste Reihe von Nicht-Standardeinstellungen:

Testergebnisse für alle sieben Paare zeigt Abbildung 8.



Abb.8 Zeitrahmen M15 Testergebnisse.

Betrachten wir den EURUSD genauer und prüfen wir anhand seines Beispiels, ob die Kerzenmuster unter den gegebenen Bedingungen relevant sind. Muster im obigen Bild werden in einer bestimmten Farbe hervorgehoben, die den Charakter ihrer Bewegung anzeigt. Rote Farbe wird für die Muster verwendet, die einen möglichen Abwärtstrend anzeigen, während Grün für diejenigen verwendet wird, die einen Aufwärtstrend anzeigen. Lassen Sie uns sehen, ob die Farben mit dem Ergebnis übereinstimmen.


Abb.9 EURUSD Testergebnisse.

Das erste zu analysierende Muster ist Hammer. Entsprechend den Mustereigenschaften prognostiziert er eine Aufwärtsbewegung. Während unserer Tests wurde in 30% der Fälle eine Aufwärtsbewegung beobachtet und in 10% der Fälle eine Abwärtsbewegung. Beachten Sie, dass dies die Bewegung von nicht weniger als dem angegebenen Schwellenwert von 100 Points ist. Wenn man bedenkt, dass bei einer historischen Zeitspanne dem Muster in mehr als einem Drittel der Fälle eine Aufwärtsbewegung folgte, kann man davon ausgehen, dass es die Hypothese bestätigt, dass dieses Kerzenmuster einen Aufwärtstrend signalisiert.

Diese Beobachtung kann jedoch nicht automatisch auf alle anderen Zeiträume und Stichproben angewendet werden. Dies bezieht sich auf diesen konkreten Fall und das Ergebnis.

Betrachten wir nun das Abwärtsmuster Engulfing Bearish. Das Muster wird als Indikator für einen Abwärtstrend angesehen, so dass Sie danach eine Verkaufsposition eröffnen sollten. Das Ergebnis zeigt jedoch, dass das Verhalten dieses Kerzenmusters in den meisten Fällen völlig anders ist: In 20% der Fälle stieg der Preis nach dem Auftreten des Musters um mindestens 100 Punkte, während der Anteil der Abwärtsbewegungen nur 9% aller Fälle betrug, was mehr als doppelt so hoch ist. So zeigten die Tests, dass sich das Muster umgekehrt verhält.

Das dritte zu analysierende Muster ist der Aufwärts-Harami. Wie der Name und der grüne Tag andeuten, handelt es sich bei diesem Muster um ein Kaufsignal. Die Zahl der Fälle nach unten und nach oben ist jedoch nahezu gleich: 17% und 19%. Können wir sagen, dass dieses Muster ein bestimmtes Signal zeigt? Ich bezweifle, dass es keine eindeutige Prävalenz einer der Seiten gibt. Das Testergebnis deutet also darauf hin, dass Sie dieses Muster besser nicht für den EURUSD-Handel innerhalb des 15-Minuten-Zeitrahmens verwenden sollten.


Ergebnisse

Basierend auf den gewonnenen Ergebnissen lassen sich folgende Beobachtungen anstellen: Es ist schwierig, Kerzenmuster eindeutig zu interpretieren. Die Ergebnisse hängen stark von den Bedingungen ab, unter denen sie auftreten. So verhält sich ein Muster nicht nur im gesamten Markt gleich, sondern auch bei demselben Währungspaar mit unterschiedlichen Zeiträumen. Sie sollten die Signale der Muster immer erneut überprüfen.


Schlussfolgerungen

Das angehängte Archiv enthält alle besprochenen Dateien, die sich in den entsprechenden Ordnern befinden. Für den ordnungsgemäßen Betrieb müssen Sie lediglich den Ordner MQL5 in den Terminalverzeichnis speichern.

Programme, die im diesem Artikel verwendet werden

#
 Name
Typ
Erklärung
1
PatternAnalyzer.mq5 Grafische Benutzeroberfläche
 Werkzeugleiste für die Analyse der Kerzenmuster
2 MainWindow.mqh Bibliothek  GUI Bibliothek
3 Program.mqh Bibliothek  Bibliothek der Methoden für das Interface und der Berechnung der Elemente