und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5

MQL5 Wizard- Handelssignale basierend auf der Kreuzung zweier EMA mit einem Zeitfilter - Experte für den MetaTrader 5
- Ansichten:
- 1780
- Rating:
- Veröffentlicht:
- 2016.09.02 10:57
- Aktualisiert:
- 2016.11.22 07:34
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Der Artikel Der MQL5-Assistent: Erstellen von Expert-Systemen ohne Programmierung beschreibt Schritte der automatischen Erstellung des Codes eines Expert Advisors mithilfe von MQL5 Wizard.
Die Grundidee des Moduls der Handelssignale basierend auf der Kreuzung zweier gleitender Durchschnitte wurde in "MQL5 Wizard - Handelssignale auf der Basis der Kreuzung zweier EMA" erläutert. Die auf gleitenden Durchschnitten basierenden Systeme funktionieren effektiv nur bei Trendbewegungen, anderenfalls werden viele falsche Signale die Effektivität des Handels reduzieren. Eine der Methoden zur Verbesserung von Handelswerten ist die Sortierung von Trades nach Zeit, indem man Einstieg nur zu bestimmten Zeiten erlaubt (z.B. Positionen nur während der europäischen Handelszeiten eröffnen).
Hier betrachten wir eine Trendstrategie, die auf der Kreuzung zweier (des schnellen und des langsamen) EMA mit einem Zeitfilter beruht. Diese Strategie ist im Standardpaket des Terminals enthalten und heißt "Signals based on crossover of two EMA with intraday time filter".
Handelssignale:
- Eröffnen einer Long-Position: wenn der schnelle EMA den langsamen EMA von unten nach oben kreuzt, und die Bedingung für die Sortierung nach Zeit nicht erfüllt wird.
- Eröffnen einer Short-Position: wenn der schnelle EMA den langsamen EMA von oben nach unten kreuzt, und die Bedingung für die Sortierung nach Zeit nicht erfüllt wird.
Eine weitere Besonderheit dieses Moduls besteht darin, dass es mit Pending Orders arbeitet, deren Preislevels hinsichtlich des aktuellen Wertes des gleitenden Durchschnitts berechnet und im ATR-Bereich (Average True Range) gesetzt werden.
Abbildung 1. Handelssignale der Strategie auf der Basis der Kreuzung zweier EMA mit einem Zeitfilter
Handelssignale
Das Modul von Handelssignalen nach dieser Strategie wird in der Klasse CSignal2EMA_ITF implementiert. Diese Klasse enthält mehrere geschützte (protected) Methoden, die für den Zugang zu Werten von Kursen und Indikatoren genutzt werden:
double FastEMA(int ind) // gibt den Wert des schnellen EMA auf dem angegebenen Balken zurück double SlowEMA(int ind) // gibt den Wert des langsamen EMA auf dem angegebenen Balken zurück double StateFastEMA(int ind) // gibt einen positiven Wert zurück, wenn EMA steigt und einen negativen, wenn EMA sinkt double StateSlowEMA(int ind) // gibt einen positiven/negativen Wert zurück, wenn der langsame EMA steigt/sinkt zurück double StateEMA(int ind) // gibt die Differenz zwischen dem schnellen und langsamen EMA zurück double ATR(int ind) // gibt den ATR-Wert auf dem angegebenen Balken zurück
Die Besonderheit dieses Systems besteht darin, dass der Eingabeparameter Limit den Handel bestimmt. Je nach dem Wert dieses Parameters gibt es drei Einstiegsmöglichkeiten:
- Limit>0. Eröffnet eine Position bei einem falschen Breakdown des gleitenden Durchschnitts zu einem besseren Preis als der Marktpreis (Buy Limit und Sell Limit Pending Orders werden je nach dem Handelssignal platziert).
- Limit<0. Einstieg in der Richtung der Kursbewegung zu einem schlechteren Preis als der Marktpreis (Buy Stop und Sell Stop Pending Orders werden je nach dem Handelssignal platziert).
- Limit=0. Einstieg zum aktuellen Marktpreis.
1. Eröffnen einer Long-Position
Zuerst werden die Bedingungen für das Eröffnen einer Long-Position überprüft: diese sind erfüllt, wenn die Differenz zwischen dem schnellen und langsamen EMA auf dem letzten vollständigen Balken ihr Zeichen von "-" zu "+" gewechselt hat (StateEMA(1)>0 && StateEMA(2)<0).
Dann werden die Bedingungen des Zeitfilters überprüft, indem die Funktion CheckOpenLong() der Klasse CSignalITF aufgerufen wird. Wenn die in den Input-Parametern festgelegten Bedingungen für den Einstieg nach Zeit nicht erfüllt sind, werden der Basis-Preislevel (der Wert des gleitenden Durchschnitts) und der ATR-Bereich auf dem letzten vollständigen Balken berechnet.
Eine Kauforder wird zu dem Preis platziert, der durch den Wert des Inputsparameters Limit definiert wird, angegeben in ATR-Einheiten. Die Take Profit und Stop Loss Levels werden auch hinsichtlich des Basispreises berechnet. Die "Life Time" der zu platzierenden Order wird durch den Inputprameter Expiration definiert und in Balken des aktuellen Zeitrahmens gesetzt.
//+--------------------------------------------------------------------------------+ //| Methode zur Überprüfung der Bedingungen für das Eröffnen einer Long-Position | //+--------------------------------------------------------------------------------+ 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. Schließen einer Long-Position
In dieser Implementierung wird die Funktion, die die Bedingungen für das Schließen einer Long-Position immer false liefern, d.h. es ist angenommen, dass die Position zu Take Profit oder Stop Loss geschlossen wird. Wenn nötig können auch weitere Regeln für Schließen hinzugefügt werden.
//+---------------------------------------------------------------------------------+ //| Methode zur Überprüfung der Bedingungen für das Schließen einer Long-Position | //+---------------------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Eröffnen einer Short-Position
Auch wie bei der Überprüfung der Kaufbedingungen werden zunächst die Bedingungen für das Eröffnen einer Long-Position überprüft: diese sind erfüllt, wenn die Differenz zwischen dem schnellen und langsamen EMA das Zeichen von "+" zu "-" auf dem letzten vollständigen Balken (StateEMA(1)<0 && StateEMA(2)>0) gewechselt hat.
Dann werden die Bedingungen des Zeitfilters überprüft, indem die Funktion CheckOpenLong() der Klasse CSignalITF aufgerufen wird. Wenn die in den Input-Parametern festgelegten Bedingungen für den Einstieg nach Zeit nicht erfüllt sind, werden der Basis-Preislevel (der Wert des gleitenden Durchschnitts) und der ATR-Bereich auf dem letzten vollständigen Balken berechnet.
Eine Verkaufsorder wird zu dem Preis platziert, der durch den Wert des Inputparameters Limit definiert wird, angegeben in ATR Einheiten. Die Take Profit und Stop Loss Levels werden auch hinsichtlich des Basispreises berechnet. Die "Life Time" der zu platzierenden Order wird durch den Inputprameter Expiration definiert und in Balken des aktuellen Zeitrahmens gesetzt.
//+---------------------------------------------------------------------------------+ //| Methode zur Überprüfung der Bedingungen für das Eröffnen einer Short-Position | //+---------------------------------------------------------------------------------+ 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. Schließen einer Short-Position
In dieser Implementierung wird die Funktion, die die Bedingungen für das Schließen einer Short-Position überprüft, immer false liefern, d.h. die Position wird zu Take Profit oder Stop Loss geschlossen. Wenn nötig können auch weitere Regeln für Schließen hinzugefügt werden.
//+------------------------------------------------------------------+ //| Überprüft die Bedingungen für das Schließen einer Short-Position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop von Buy Pending Order
Wenn es eine Buy Pending Order gibt, wird die Order verwaltet: der Orderpreis wird entsprechend den aktuellen Werten des gleitenden Durchschnitts und dem ATR-Bereich korrigiert.
Wichtig: das System arbeitet mit Pending Ordern, welche entsprechend dem Basispreis verwaltet werden (nach dem gleitenden Durchschnitt), aus diesem Grund wird die Pending Order nur dann ausgelöst, wenn sich der Preis in die Richtung der Order bewegt.
//+-------------------------------------------------------------------+ //| Bestimmt die Notwendigkeit, Buy Pending Order zu modifizieren | //+-------------------------------------------------------------------+ 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 von Sell Pending Order
Wenn eine Sell Pending Order vorhanden ist, wird diese verwaltet: der Orderpreis wird entsprechend den aktuellen Werten des gleitenden Durchschnitts und des ATR-Bereichs korrigiert. Auch wie bei der Kauforder, wird die Order nur dann ausgelöst, wenn sich der Preis in die Richtung der Order bewegt.
//+-------------------------------------------------------------------+ //| Bestimmt die Notwendigkeit, Buy Pending Order zu modifizieren | //+-------------------------------------------------------------------+ 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 mithilfe von MQL5 Wizard
Um einen Handelsroboter nach dieser Strategie mithilfe von MQL5 Wizard zu erstellen, wählen Sie "Signals based on crossover of two EMA with intraday time filter" im zweiten Schritt aus:
Abbildung 2. Auswahl des Moduls der Handelssignale basierend auf der Kreuzung zweier EMA mit einem Zeitfilter in MQL5 Wizard
Geben Sie den gewünschten Typ von Trailing Stop und Kapitalmanagement in den nächsten Schritten an. Der Code des Expert Advisors wird automatisch generiert, er muss kompiliert werden und dann können Sie mit dem Testen anfangen.
Testergebnisse
Die Ergebnisse des EAs bei einem Test unter Verwendung von historischen Daten (EURUSD H1, Zeitraum: 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) sind auf der Abb. 3. angeführt.
Dieser Expert Advisor benutzt das Modul für den Handel mit einer festgelegten Lotgröße von 0.1 Lot (Trading Fixed Lot), ein Trailing Stop wurde nicht verwendet (Trailing not used).
Abbildung 3. Testergebnisse des EAs, der auf der Strategie der Kreuzung von zwei EMAs ohne ITF Filter beruht
Die Sortierung nach Zeit wurde nicht verwendet. Die Handelsergebnisse können verbessert werden, wenn man den Zusammenhang zwischen den Ergebnissen und der Tageszeit analysiert.
In unserem Fall sind Handelssignale während der ersten sechs Stunden jedes Tages besonders effektiv. Diese Tatsache kann für die Erstellung eines Zeitfilters genutzt werden, der durch einige Eingabeparameter definiert wird.
Um den Zeitfilter festzulegen, muss man den Handel innerhalb der ersten sechs Stunden "erlauben", indem man den Parameter BadHoursOfDay=16777152=111111111111111111000000b setzt. Alle Stunden nach den ersten sechs Stunden gelten als unerwünscht für den Einstieg.
Der Filter für den Einstieg nach Uhrzeit (BadHoursOfDay=16777152) hilft Handelsergebnisse zu verbessern:
Abbildung 4. Testergebnisse des EAs, der auf der Strategie der Kreuzung zweier EMA mit einem Zeitfilter basiert (BadHoursofDay=16777152)
Die Klasse CSignalITF ermöglicht es, auch kompliziertere Zeitfilter ("gute" und "schlechte" Minuten für Handel innerhalb einer Stunde, Stunden innerhalb eines Tages oder konkrete Wochentage) umzusetzen.
Der Mechanismus von Zeitfiltern lässt die Effektivität verschiedener Handelssignale erhöhen und die Spezifik von Marktbewegungen in bestimmten Zeiträumen berücksichtigen (z.B., Besonderheiten von Handelszeiten).
Die Datei Signal2EMA-ITF.mqh, die die Klasse von Handelssignalen CSignal2EMA_ITF enthält muss nach client_terminal_data\folder\MQL5\Include\Expert\Signal kopiert werden.
Der mithilfe von MQL5 Wizard generierte Code für den Expert Advisor ist angefügt als Datei: expert_2ema_itf.mq5.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/264

Handelsignale auf der Basis der Kreuzung der Hauptlinie und der Signallinie des MACD Indikators "Signals based on crossover of main and signal MACD lines" (die Klasse CSignalMACD ist in der Standardbibliothek enthalten).

Handelssignale basierend auf der Kreuzung von zwei exponentiellen gleitenden Durchschnitten "Signals based on crossover of two EMA".

Handelssignale basierend auf der Kreuzung der Linien des Alligator Indikators.

Handelssignale basierend auf Umkehrkerzenformationen "Signals based on reversal candlestick patterns".