MQL5 Wizard ermöglicht es, den Code für Expert Advisors automatisch zu erstellen. Detaillierte Informationen findest du hier: Bereitgestellte Expert Advisors im MQL5 Wizard erstellen.
Die Handelsignale der Strategie basieren auf dem Crossover von zwei gleitenden Durchschnitten und werden in MQL5 Wizard - Handelsignale basierend auf dem Crossover von zwei exponentiell geglätteten gleitenden Durchschnitten behandelt. Gleitende Durchschnitte sind effektiv bei Trends, können jedoch in anderen Fällen viele falsche Signale liefern. Eine Möglichkeit, die Strategie zu verbessern, ist die Verwendung von Zeitfiltern (zum Beispiel das Öffnen neuer Positionen während der europäischen Handelszeit).
Hier betrachten wir die Strategie, die auf dem Crossover von zwei exponentiell geglätteten gleitenden Durchschnitten (schnelle EMA und langsame EMA) mit einem intraday Zeitfilter basiert. Die Strategie trägt den Namen "Signale basierend auf dem Crossover von zwei EMA mit intraday Zeitfilter" (bei der automatischen Erstellung eines EA im MQL5 Wizard).
Handelsignale:
- Long-Position eröffnen: Die schnelle EMA kreuzt die langsame EMA nach oben und die Bedingungen des intraday Zeitfilters sind nicht erfüllt.
- Short-Position eröffnen: Die schnelle EMA kreuzt die langsame EMA nach unten und die Bedingungen des intraday Zeitfilters sind nicht erfüllt.
Diese Strategie ist in der Klasse CSignal2EMA_ITF implementiert.
Das Handelssystem basiert auf Pending Orders, wobei die Preisniveaus abhängig von den Werten der gleitenden Durchschnitte berechnet werden, und die ATR-Einheiten (Average True Range) verwendet werden.

Abbildung 1. Handelsignale, basierend auf dem Crossover von zwei EMA mit intraday Zeitfilter
Handelsignale
Die Handelsstrategie ist in CSignal2EMA_ITF implementiert und verfügt über einige geschützte Methoden, um den Zugriff auf die Indikatorwerte zu vereinfachen:
double FastEMA(int ind) // gibt den Wert der schnellen EMA der Kerze zurück double SlowEMA(int ind) // gibt den Wert der langsamen EMA der Kerze zurück double StateFastEMA(int ind) // gibt den positiven/negativen Wert zurück, wenn die schnelle EMA gestiegen/gefallen ist double StateSlowEMA(int ind) // gibt den positiven/negativen Wert zurück, wenn die langsame EMA gestiegen/gefallen ist double StateEMA(int ind) // gibt die Differenz zwischen schneller und langsamer EMA zurück double ATR(int ind) // gibt den Wert der ATR der Kerze zurück
- Limit>0. Es wird bei einer Rückbewegung eingestiegen, wenn der falsche Durchbruch der gleitenden Durchschnitte besser ist als der Marktpreis (Buy Limit- und Sell Limit-Orders werden abhängig vom Handelssignal platziert).
- Limit<0. Es wird in Richtung der Preisbewegung eingestiegen (Buy Stop- und Sell Stop-Orders werden abhängig vom Handelssignal platziert).
- Limit=0. In diesem Fall wird mit den Marktpreisen gehandelt.
1. Long-Position eröffnen
Es werden die Bedingungen zur Eröffnung einer Long-Position geprüft: Wenn sich die Differenz zwischen der schnellen und langsamen EMA an der letzten abgeschlossenen Kerze von "-" nach "+" geändert hat (StateEMA(1)>0 && StateEMA(2)<0).
Anschließend werden die Bedingungen des intraday Zeitfilters geprüft, indem die Methode CheckOpenLong() der Klasse CSignalITF aufgerufen wird. Wenn der Handel erlaubt ist, wird das Basispreisniveau (der Wert des gleitenden Durchschnitts) und der ATR-Bereich der letzten abgeschlossenen Kerze berechnet.
Je nach Vorzeichen des Limit-Eingabeparameters wird eine Kauf-Pending-Order platziert. Der Preis der Order, Take Profit- und Stop Loss-Niveaus werden relativ zum Basispreisniveau (in ATR-Einheiten) berechnet. Die Ablaufzeit der Order wird durch den Parameter Expiration (in Kerzen) definiert.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen zur Eröffnung einer Long-Position (Kauf) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. Long-Position schließen
In unserem Fall gibt die Funktion, die die Bedingungen zum Schließen einer Long-Position prüft, immer false zurück, d.h. es wird angenommen, dass die Long-Position durch Take Profit oder Stop Loss geschlossen wird. Bei Bedarf kannst du deinen eigenen Code zur Implementierung dieser Methode schreiben.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen zum Schließen einer Long-Position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Short-Position eröffnen
Es werden die Bedingungen zur Eröffnung einer Short-Position geprüft: Wenn sich die Differenz zwischen der schnellen und langsamen EMA an der letzten abgeschlossenen Kerze von "+" nach "-" geändert hat (StateEMA(1)<0 && StateEMA(2)>0).
Anschließend werden die Bedingungen des intraday Zeitfilters geprüft, indem die Methode CheckOpenLong() der Klasse CSignalITF aufgerufen wird. Wenn der Handel erlaubt ist, wird das Basispreisniveau (der Wert des gleitenden Durchschnitts) und der ATR-Bereich der letzten abgeschlossenen Kerze berechnet.
Je nach Vorzeichen des Limit-Eingabeparameters wird eine Verkaufs-Pending-Order platziert. Der Preis der Order, Take Profit- und Stop Loss-Niveaus werden relativ zum Basispreisniveau (in ATR-Einheiten) berechnet. Die Ablaufzeit der Order wird durch den Parameter Expiration (in Kerzen) definiert.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen zur Eröffnung einer Short-Position (Verkauf) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. Short-Position schließen
In unserem Fall gibt die Funktion, die die Bedingungen zum Schließen einer Short-Position prüft, immer false zurück, d.h. es wird angenommen, dass die Position durch Take Profit oder Stop Loss geschlossen wird. Bei Bedarf kannst du deinen eigenen Code zur Implementierung dieser Methode schreiben.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen zum Schließen einer Short-Position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop für Kauf-Pending-Order
Der Expert Advisor wird Pending Orders in Abhängigkeit vom aktuellen Wert des gleitenden Durchschnitts und der ATR verfolgen.
//+--------------------------------------------------------------------+ //| Überprüft die Bedingungen zur Modifizierung einer Pending Kauf-Order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Trailing Stop für Verkaufs-Pending-Order
Der Expert Advisor wird Pending Orders in Abhängigkeit vom aktuellen Wert des gleitenden Durchschnitts und der ATR verfolgen.
Die Order wird ausgeführt, wenn der Marktpreis den Orderpreis erreicht.
//+--------------------------------------------------------------------+ //| Überprüft die Bedingungen zur Modifizierung einer Pending Verkaufs-Order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
Erstellung eines Expert Advisors mit MQL5 Wizard
Um einen Handelsroboter basierend auf der Strategie zu erstellen, musst du die Signalparameter als "Signale basierend auf dem Crossover von zwei EMA mit intraday Zeitfilter" in der Option "Bereitgestellte Expert Advisors erstellen" des MQL5 Wizards auswählen:

Abbildung 2. Wähle "Signale basierend auf dem Crossover von zwei EMA mit intraday Zeitfilter" im MQL5 Wizard
Als Nächstes musst du den benötigten Trailing Stop-Algorithmus und das Geld- und Risikomanagement-System angeben. Der Code des Expert Advisors wird automatisch erstellt, du kannst ihn kompilieren und im Strategietester des MetaTrader 5-Clientterminals testen.
Testergebnisse
Betrachten wir das Backtesting des Expert Advisors auf historischen Daten (EUenSD H1, Testzeitraum: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
Bei der Erstellung des Expert Advisors verwendeten wir das feste Volumen (Handel mit festem Lot, 0.1). Der Trailing Stop-Algorithmus wird nicht verwendet (Trailing nicht verwendet).

Abbildung 3. Testergebnisse des Expert Advisors mit Handelsignalen, basierend auf dem Crossover von zwei EMA ohne Verwendung des ITF-Filters
Der intraday Filter wird nicht verwendet, daher gibt es viele falsche Signale. Die Handelsignale können verbessert werden, wenn wir die Analyse der Deal-Ergebnisse in Abhängigkeit von den Handelszeiten durchführen.
In unserem Fall haben wir festgestellt, dass das Crossover von zwei EMA viele falsche Signale zwischen 6:00 und 23:59 liefert. Wir können den intraday Zeitfilter festlegen, indem wir die Filterparameter einstellen.
Zum Beispiel können wir einen Zeitfilter festlegen, der das Öffnen von Positionen nur von 0:00 bis 5:59 erlaubt. Dies kann durch die Festlegung des Wertes von BadHoursOfDay=16777152=111111111111111111000000b erfolgen. Alle anderen Handelsstunden sind "schlecht", daher ist es besser, das Öffnen neuer Positionen von 6:00 bis zum Ende des Tages zu verbieten.
Wenn wir den Wert von BadHoursOfDay=16777152 festlegen, filtern wir viele falsche Signale:

Abbildung 4. Testergebnisse des Expert Advisors mit Handelsignalen, basierend auf dem Crossover von zwei EMA mit Zeitfilter (BadHoursofDay=16777152)
Die CSignalITF bietet viele andere Zeitfiltrationsmerkmale (einfach die "guten" und "schlechten" Minuten innerhalb der Stunde, Stunden innerhalb des Tages, Tage innerhalb der Woche angeben).
Anhänge: Die Signal2EMA-ITF.mqh mit der Klasse CSignal2EMA_ITF muss in den Ordner terminal_data_folder\MQL5\Include\Expert\Signal platziert werden.
Die expert_2ema_itf.mq5 enthält den Code des Expert Advisors, der mit MQL5 Wizard erstellt wurde.
Verwandte Beiträge
- So integrierst du hochkarätige Wirtschaftsdaten in deinen EA für MetaTrader 4
- Erstelle einen Expert Advisor basierend auf dem Center of Gravity Indikator für MetaTrader 4
- MQL5 Wizard: Handels-Signale mit 3 schwarzen Krähen / 3 weißen Soldaten + CCI für MetaTrader 5
- MQL5 Wizard: Handelssignale durch 3 Schwarze Krähen/3 Weiße Soldaten + RSI
- MQL5 Wizard: Handelssignale mit 3 schwarzen Krähen/3 weißen Soldaten und Stochastik erstellen