Der MQL5 Wizard ermöglicht es dir, fertige Expert Advisors (EAs) auf Basis der Standardbibliotheksklassen zu erstellen, die zusammen mit dem Client-Terminal geliefert werden (detaillierte Informationen findest du in MQL5 Wizard: Fertige Expert Advisors erstellen). Damit kannst du deine Handelsideen schnell überprüfen, indem du eine eigene Klasse für Handelssignale erstellst. Die Struktur dieser Klasse sowie ein Beispiel findest du im Artikel MQL5 Wizard: Modul von Handelssignalen erstellen.
Die allgemeine Idee ist wie folgt: Die Klasse der Handelssignale wird von CExpertSignal abgeleitet. Anschließend musst du die virtuellen Methoden LongCondition() und ShortCondition() mit deinen eigenen Methoden überschreiben.
Es gibt ein Buch namens "Strategien der besten Trader" (in Russisch), in dem viele Handelsstrategien behandelt werden. Wir konzentrieren uns auf Umkehrkerzenmuster, die durch Stochastic, CCI, MFI und RSI Oszillatoren bestätigt werden.
Die beste Vorgehensweise ist, eine separate Klasse abzuleiten, die von CExpertSignal abgeleitet ist, um die Bildung von Kerzenmustern zu überprüfen. Zur Bestätigung der Handelssignale, die durch Kerzenmuster generiert werden, reicht es aus, die Klasse, die von CCandlePattern abgeleitet ist, zu schreiben und die erforderlichen Funktionen (z. B. Bestätigung durch Oszillatoren) hinzuzufügen.
Hier betrachten wir die Signale, die auf dem Umkehrkerzenmuster "Hammer/Hängender Mann" basieren, bestätigt durch den Stochastic-Indikator. Das Modul der Handelssignale basiert auf der Klasse CCandlePattern, die ein einfaches Beispiel für die Verwendung zur Erstellung von Handelssignalen mit Kerzenmustern ist.
1. Umkehrkerzenmuster "Hammer" und "Hängender Mann"
1.1. Hammer
Der "Hammer" ist eine Kerze mit kleinem Körper und langem unteren Schatten, die nach einem Abwärtstrend gebildet wird. Das "Hammer"-Muster signalisiert das Ende eines Bärenmarktes.
Die Farbe des Kerzenkörpers ist nicht entscheidend, aber ein bullischer Hammer zeigt ein höheres bullisches Potenzial an. Der Körper des "Hammer"-Musters wird oft in der Nähe des Minimums der vorherigen Kerze gebildet. Ein längerer unterer Schatten und ein kürzerer oberer Schatten führen zu einem höheren Potenzial für das Umkehrmuster.

Abbildung 1. "Hammer" Kerzenmuster
Die Erkennung des "Hammer"-Musters wird in der Methode CheckPatternHammer() der CCandlePattern-Klasse implementiert:
//+------------------------------------------------------------------+ //| Überprüft die Bildung des "Hammer" Kerzenmusters | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- Hammer if((MidPoint(1)<CloseAvg(2)) && // Abwärtstrend (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // Körper im oberen 1/3 (Close(1)<Close(2)) && (Open(1)<Open(2))) // Körperlücke return(true); //--- return(false); }
Die Methode CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) der CCandlePattern-Klasse wird verwendet, um die Bildung des "Hammer"-Kerzenmusters zu überprüfen.
1.2. Hängender Mann
Der "Hängende Mann" ist eine Kerze mit kleinem Körper und langem unteren Schatten, die nach einem Aufwärtstrend gebildet wird. Das "Hängende Mann"-Muster signalisiert das Ende eines Bullenmarktes.
Die Farbe des Kerzenkörpers ist nicht entscheidend, aber eine bärische Kerze weist auf ein höheres bärisches Potenzial hin. Der Körper des "Hängenden Mannes" wird oft in der Nähe des Maximums der vorherigen Kerze gebildet. Ein längerer unterer Schatten und ein kürzerer oberer Schatten führen zu einem höheren Potenzial für das Umkehrmuster.

Abbildung 2. "Hängender Mann" Kerzenmuster
Die Erkennung des "Hängenden Mann"-Musters wird in der Methode CheckPatternHangingMan() der CCandlePattern-Klasse implementiert:
//+------------------------------------------------------------------+ //| Überprüft die Bildung des "Hängenden Mann" Kerzenmusters | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- Hängender Mann if((MidPoint(1)>CloseAvg(2)) && // Aufwärtstrend (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // Körper im oberen 1/3 (Close(1)>Close(2)) && (Open(1)>Open(2))) // Körperlücke return(true); //--- return(false); }
Die Methode CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) der CCandlePattern-Klasse wird verwendet, um die Bildung des "Hängenden Mann"-Kerzenmusters zu überprüfen.
2. Handelssignale, bestätigt durch den Stochastic-Indikator
Die Handelssignale zum Eröffnen einer Long- oder Short-Position müssen durch den Stochastic-Oszillator bestätigt werden. Die %D-Linie muss einen entsprechenden kritischen Wert (30 oder 70) überschreiten/unterschreiten.
Der Abschluss einer offenen Position hängt von den Werten des %D-Indikators ab. Dies kann in zwei Fällen erfolgen:
- Wenn die %D-Linie das gegenüberliegende kritische Niveau (80 für Long-Position und 20 für Short-Position) erreicht hat.
- Wenn das Umkehrsignal nicht bestätigt wird (wenn die %D-Linie die folgenden Level erreicht: 20 für Long-Position und 80 für Short-Position).

Abbildung 3. "Hammer" Muster, bestätigt durch den Stochastic-Indikator
- int CH_HM_Stoch::LongCondition() - überprüft die Bedingungen zum Öffnen einer Long-Position (gibt 80 zurück) und das Schließen der Short-Position (gibt 40 zurück);
- int CH_HM_Stoch::ShortCondition() - überprüft die Bedingungen zum Öffnen einer Short-Position (gibt 80 zurück) und das Schließen der Long-Position (gibt 40 zurück).
2.1. Long-Position eröffnen/Short-Position schließen
Die Bildung des "Hammer"-Musters muss durch den Stochastic-Indikator bestätigt werden: StochSignal(1)<30 (der Wert der Signallinie des Stochastic-Indikators der letzten abgeschlossenen Kerze muss weniger als 30 betragen).
Die Short-Position muss geschlossen werden, wenn die Signallinie des Stochastic-Indikators die 20 oder 80 Niveaus nach oben überschreitet.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen für den Markteintritt und -ausstieg | //| 1) Markteintritt (Long-Position eröffnen, Ergebnis=80) | //| 2) Marktausgang (Short-Position schließen, Ergebnis=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::LongCondition() { int result=0; //--- idx kann verwendet werden, um den Arbeitsmodus des Expert Advisors zu bestimmen //--- idx=0 - in diesem Fall überprüft der EA die Handelsbedingungen bei jedem Tick //--- idx=1 - in diesem Fall überprüft der EA die Handelsbedingungen nur bei Nachrichtenbalken int idx =StartIndex(); //--- Überprüfung der Bedingungen zum Öffnen einer Long-Position //--- Bildung des Hammer-Musters und Signallinie<30 if (CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) && (StochSignal(1)<30)) result=80; //--- Überprüfung der Bedingungen zum Schließen der Short-Position //--- Signallinienüberkreuzung der überkauften/überverkauften Niveaus (abwärts 20, aufwärts 80) if((((StochSignal(1)>20) && (StochSignal(2)<20)) || ((StochSignal(1)>80) && (StochSignal(2)<80)))) result=40; //--- Ergebnis zurückgeben return(result); }
2.2. Short-Position eröffnen/Long-Position schließen
Die Bildung des "Hängenden Mann"-Musters muss durch den Stochastic-Indikator bestätigt werden: StochSignal(1)>70 (der Wert der Signallinie des Stochastic-Indikators der letzten abgeschlossenen Kerze muss größer als 70 sein).
Die Long-Position muss geschlossen werden, wenn die Signallinie des Stochastic-Indikators die 80 oder 20 Niveaus nach unten überschreitet.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen für den Markteintritt und -ausstieg | //| 1) Markteintritt (Short-Position eröffnen, Ergebnis=80) | //| 2) Marktausgang (Long-Position schließen, Ergebnis=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::ShortCondition() { int result=0; //--- idx kann verwendet werden, um den Arbeitsmodus des Expert Advisors zu bestimmen //--- idx=0 - in diesem Fall überprüft der EA die Handelsbedingungen bei jedem Tick //--- idx=1 - in diesem Fall überprüft der EA die Handelsbedingungen nur bei Nachrichtenbalken int idx =StartIndex(); //--- Überprüfung der Bedingungen zum Öffnen einer Short-Position //--- Bildung des Hängenden Mannes-Musters und Signallinie>70 if (CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) && (StochSignal(1)>70)) result=80; //--- Überprüfung der Bedingungen zum Schließen der Long-Position //--- Signallinienüberkreuzung der überkauften/überverkauften Niveaus (abwärts 80, aufwärts 20) if((((StochSignal(1)<80) && (StochSignal(2)>80)) || ((StochSignal(1)<20) && (StochSignal(2)>20)))) result=40; //--- Ergebnis zurückgeben return(result); }
2.3. Erstellung eines Expert Advisors mit MQL5 Wizard
Die Klasse CH_HM_Stoch ist nicht in den Klassen der Standardbibliothek enthalten. Um sie verwenden zu können, ist es notwendig, die Datei ach_hm_stoch.mqh herunterzuladen (siehe Anhänge) und im client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals zu speichern. Dasselbe sollte mit der Datei candlepatterns.mqh getan werden. Du kannst sie im MQL5 Wizard nach einem Neustart des MetaEditors verwenden.
Um einen Expert Advisor zu erstellen, starte den MQL5 Wizard:

Abbildung 4. Erstellung eines Expert Advisors mit MQL5 Wizard
Lass uns den Namen des Expert Advisors festlegen:

Abbildung 5. Allgemeine Eigenschaften des Expert Advisors
Danach müssen wir die verwendeten Module für Handelssignale auswählen.

Abbildung 6. Signal-Eigenschaften des Expert Advisors
In unserem Fall verwenden wir nur ein Modul für Handelssignale.
Hinzufügen des Moduls "Signale basierend auf Hammer/Hängendem Mann, bestätigt durch Stochastic" für Handelssignale:

Abbildung 7. Signal-Eigenschaften des Expert Advisors
Modul der Handelssignale hinzugefügt:

Abbildung 8. Signal-Eigenschaften des Expert Advisors
Du kannst beliebige Trailing-Eigenschaften auswählen, aber wir verwenden "Trailing Stop nicht verwendet":

Abbildung 9. Trailing-Eigenschaften des Expert Advisors
Was die Geldmanagement-Eigenschaften betrifft, verwenden wir "Handel mit festem Handelsvolumen":

Abbildung 10. Geldmanagement-Eigenschaften des Expert Advisors
Durch Drücken der Schaltfläche "Fertigstellen" erhalten wir den Code des generierten Expert Advisors, der in Expert_AH_HM_Stoch.mq5 zu finden ist und im terminal_data_folder\MQL5\Experts\ gespeichert wird.
Die Standardparameter des generierten Expert Advisors:
//--- Eingaben für das Hauptsignal input int Signal_ThresholdOpen =10; // Signalgrenzwert, um zu öffnen [0...100] input int Signal_ThresholdClose =10 // Signalgrenzwert, um zu schließen [0...100] input double Signal_PriceLevel =0.0 // Preisniveau, um einen Handel auszuführen input double Signal_StopLevel =50.0 // Stop-Loss-Niveau (in Punkten) input double Signal_TakeLevel =50.0 // Take-Profit-Niveau (in Punkten)
muss ersetzt werden durch:
//--- Eingaben für das Hauptsignal input int Signal_ThresholdOpen =40 // Signalgrenzwert, um zu öffnen [0...100] input int Signal_ThresholdClose =20 // Signalgrenzwert, um zu schließen [0...100] input double Signal_PriceLevel =0.0 // Preisniveau, um einen Handel auszuführen input double Signal_StopLevel =0.0 // Stop-Loss-Niveau (in Punkten) input double Signal_TakeLevel =0.0 // Take-Profit-Niveau (in Punkten)
Die Signal_ThresholdOpen/Signal_ThresholdClose Eingabeparameter ermöglichen es, Grenzwerte für das Öffnen und Schließen von Positionen festzulegen.
Im Code der LongCondition()- und ShortCondition()-Methoden der Handelssignalklasse haben wir die festen Werte der Schwelle angegeben:
- Position öffnen: 80;
- Position schließen: 40.
Der durch den MQL5 Wizard generierte Expert Advisor öffnet und schließt Positionen unter Verwendung der "Stimmen" aus den Modulen der Handelssignale. Die Stimme des Hauptmoduls (als Container, das alle hinzugefügten Module umfasst) wird ebenfalls verwendet, aber seine LongCondition()- und ShortCondition()-Methoden geben immer 0 zurück.
Die Abstimmungsergebnisse des Hauptmoduls werden auch bei der "Stimmen"-Durchschnittsbildung verwendet. In unserem Fall haben wir: Hauptmodul + 1 Modul von Handelssignalen, also müssen wir diese Tatsache bei der Festlegung der Schwellenwerte berücksichtigen. Aufgrund dieser Tatsache müssen die ThresholdOpen und ThresholdClose auf 40=(0+80)/2 und 20=(0+40)/2 gesetzt werden.
