Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Expert Advisors

MQL5 Wizard- Handelssignale basierend auf der Kreuzung zweier EMA mit einem Zeitfilter - Experte für den MetaTrader 5

Ansichten:
1615
Rating:
(39)
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.
Die Handelsstrategie wird in der Klasse CSignal2EMA_ITF implementiert.
Die Sortierung wird in der Klasse CSignalITF implementiert. Die Klasse CSignal2EMA_ITF (die eine Instanz der Klasse CSignalITF enthält), mit der wir uns weiter beschäftigen werden, ist ein gutes Beispiel für die Umsetzung der Filter für Einstieg je nach Zeit im Modul von Handelssignalen.

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

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:

  1. 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).
  2. 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).
  3. 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

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 EMA ohne ITF Filter beruht

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 3. Testergebnisse des EAs, der auf der Strategie der Kreuzung zweier EMA mit einem Zeitfilter basiert (BadHoursofDay=16777152)

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

MQL5 Wizard- Handelssignale basierend auf der Kreuzung der Hauptlinie und der Signallinie des MACD Indikators MQL5 Wizard- Handelssignale basierend auf der Kreuzung der Hauptlinie und der Signallinie des MACD Indikators

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).

MQL5 Wizard - Handelssignale basierend auf der Kreuzung von zwei exponentiell geglätteten gleitenden Durchschnitten MQL5 Wizard - Handelssignale basierend auf der Kreuzung von zwei exponentiell geglätteten gleitenden Durchschnitten

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

MQL5 Wizard - Handelssignale basierend auf der Kreuzung der Linien des Alligator Indikators MQL5 Wizard - Handelssignale basierend auf der Kreuzung der Linien des Alligator Indikators

Handelssignale basierend auf der Kreuzung der Linien des Alligator Indikators.

MQL5 Wizard - Handelssignale basierend auf Umkehrkerzenformationen MQL5 Wizard - Handelssignale basierend auf Umkehrkerzenformationen

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