Startseite Systemhandel Beitrag

MQL5 Wizard: Trade Signale auf Basis von Kurs-Crossover mit gleitendem Durchschnitt und ADX Bestätigung

Anhang
258.zip (3.23 KB, Herunterladen 0 mal)

MQL5 Wizard ermöglicht es, den Code für Expert Advisors automatisch zu erstellen. Detaillierte Informationen findest du in Erstellung von Fertigen Expert Advisors im MQL5 Wizard.

In diesem Artikel betrachten wir eine Strategie, die auf dem Crossover von Kursen mit dem gleitenden Durchschnitt basiert und durch den ADX-Indikator bestätigt wird. Diese Strategie trägt den Namen „Signale basierend auf Kurs-Crossover mit MA und ADX-Bestätigung“ (beim automatischen Erstellen eines EAs im MQL5 Wizard).

Handelssignale:

  • Kaufen: Der Schlusskurs der letzten abgeschlossenen Kerze liegt über dem gleitenden Durchschnitt, und der gleitende Durchschnitt steigt sowohl in der aktuellen als auch in der letzten abgeschlossenen Kerze.
  • Verkaufen: Der Schlusskurs der letzten abgeschlossenen Kerze liegt unter dem gleitenden Durchschnitt, und der gleitende Durchschnitt fällt sowohl in der aktuellen als auch in der letzten abgeschlossenen Kerze.
  • Um falsche Signale zu filtern, wird die Trendstärke (ADX > ADXmin) und die Trendrichtung mithilfe der Directional Movement Indizes (DI+ und DI-) überprüft.

Diese Strategie ist in der Klasse CSignalADX_MA implementiert (sie muss in den Ordner terminal_data_folder/MQL5/Include/Expert/Signal/SignalADX-MA.mqh eingefügt werden).

Abbildung 1. Handelssignale basierend auf Kurs-Crossover mit gleitendem Durchschnitt, bestätigt durch ADX

Abbildung 1. Handelssignale basierend auf Kurs-Crossover mit gleitendem Durchschnitt, bestätigt durch ADX

Handelssignale

Die Handelsstrategie ist in der Klasse CSignalADX_MA implementiert. Sie enthält einige geschützte Methoden, die den Zugriff auf Indikatoren und Kurswerte erleichtern:

double   PlusADX(int ind)     // gibt den Wert der DI+-Linie der Kerze zurück
double   MainADX(int ind)     // gibt den Wert der Hauptlinie der Kerze zurück
double   MinusADX(int ind)    // gibt den Wert der DI--Linie der Kerze zurück
double   EMA(int ind)         // gibt den Wert des gleitenden Durchschnitts der Kerze zurück
double   Close(int ind)       // gibt den Wert des Schlusskurses der Kerze zurück
double   StateADX(int ind)    // gibt die Differenz zwischen den DI+- und DI--Linien zurück
double   StateEMA(int ind)    // gibt einen positiven Wert zurück, wenn die EMA steigt, und negativ, wenn sie fällt
double   StateClose(int ind)  // gibt die Differenz zwischen dem Schlusskurs und dem gleitenden Durchschnitt zurück
Das Besondere an dieser Implementierung ist die zusätzliche Überprüfung der Trendpräsenz (mithilfe des Directional Movement Indicators). Dadurch können falsche Signale gefiltert und die Handelsbedingungen anhand der Werte der aktuellen (noch nicht abgeschlossenen) Kerze überprüft werden.

1. Lange Position eröffnen

Die Bedingungen für das Öffnen einer langen Position:

  1. StateEMA(0) < 0 und StateEMA(1) > 0: der gleitende Durchschnitt steigt in der aktuellen und der letzten abgeschlossenen Kerze;
  2. StateClose(1) > 0: der Schlusskurs der letzten abgeschlossenen Kerze liegt über dem gleitenden Durchschnitt;
  3. MainADX(0) > minimum_ADX: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (zur Überprüfung der Trendpräsenz);
  4. StateADX(0) > 0: Der DI+ ist größer als DI- der aktuellen Kerze.
//+------------------------------------------------------------------+
//| Überprüft die Bedingungen für das Öffnen einer langen Position (Kauf) |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- Bedingung 1: gleitender Durchschnitt steigt in der aktuellen und der letzten abgeschlossenen Kerze 
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- Bedingung 2: Schlusskurs der letzten abgeschlossenen Kerze liegt über dem gleitenden Durchschnitt 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- Bedingung 3: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (Trend-Schwelle) 
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- Bedingung 4: der Wert von DI+ ist größer als DI- der aktuellen Kerze
    bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
   sl   =m_symbol.Ask()-m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Ask()+m_take_profit*m_adjusted_point;
//--- Überprüfung aller Bedingungen
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }


2. Lange Position schließen

Die Bedingungen zum Schließen einer langen Position:

  1. StateEMA(0) < 0 und StateEMA(1) < 0: der gleitende Durchschnitt fällt in der aktuellen und der letzten abgeschlossenen Kerze;
  2. StateClose(1) < 0: der Schlusskurs der abgeschlossenen Kerze liegt unter dem gleitenden Durchschnitt;
  3. MainADX(0) > minimum_ADX: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (zur Überprüfung der Trendpräsenz);
  4. StateADX(0) < 0: Der DI- ist größer als DI+ der aktuellen Kerze.
//+------------------------------------------------------------------+
//| Überprüft die Bedingungen zum Schließen einer langen Position     |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
//--- Bedingung 1: der gleitende Durchschnitt fällt in der aktuellen und der letzten abgeschlossenen Kerze 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- Bedingung 2: Schlusskurs der abgeschlossenen Kerze liegt unter dem gleitenden Durchschnitt 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- Bedingung 3: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (Trend-Schwelle) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- Bedingung 4: der Wert von DI- ist kleiner als DI- der aktuellen Kerze
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
//--- Überprüfung aller Bedingungen
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


3. Kurze Position eröffnen

Die Bedingungen für das Öffnen einer kurzen Position sind die gleichen wie die Bedingungen zum Schließen einer langen Position.

//+------------------------------------------------------------------+
//| Überprüft die Bedingungen für das Öffnen einer kurzen Position (Verkauf)|
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- Bedingung 1: der gleitende Durchschnitt fällt in der aktuellen und der letzten abgeschlossenen Kerze 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- Bedingung 2: Schlusskurs der abgeschlossenen Kerze liegt unter dem gleitenden Durchschnitt 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- Bedingung 3: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (Trend-Schwelle) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- Bedingung 4: der Wert von DI- ist kleiner als DI- der aktuellen Kerze
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
   sl   =m_symbol.Bid()+m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Bid()-m_take_profit*m_adjusted_point;
//--- Überprüfung aller Bedingungen
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


4. Kurze Position schließen

Die Bedingungen zum Schließen einer kurzen Position sind die gleichen wie die Bedingungen zum Öffnen einer langen Position.

//+------------------------------------------------------------------+
//| Überprüft die Bedingungen zum Schließen einer kurzen Position       |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
//--- Bedingung 1: der gleitende Durchschnitt steigt in der aktuellen und der letzten abgeschlossenen Kerze
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- Bedingung 2: Schlusskurs der letzten abgeschlossenen Kerze liegt über dem gleitenden Durchschnitt 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- Bedingung 3: der ADX-Wert der aktuellen Kerze liegt über dem festgelegten Minimalwert (Trend-Schwelle)
    bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- Bedingung 4: der Wert von DI+ ist größer als DI- der aktuellen Kerze
   bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
//--- Überprüfung aller Bedingungen
  return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

Erstellung eines Expert Advisors mit MQL5 Wizard

Um einen Handelsroboter basierend auf der Strategie zu erstellen, musst du die Signalparameter als „Signale basierend auf Kurs-Crossover mit MA bestätigt durch ADX“ in der Option „Erstellung von Fertigen Expert Advisors“ im MQL5 Wizard auswählen:

Abbildung 2. Wählen Sie

Abbildung 2. Wählen Sie "Signale basierend auf Kurs-Crossover mit MA bestätigt durch ADX" im MQL5 Wizard

Anschließend musst du den benötigten Trailing-Stop-Algorithmus sowie das Geld- und Risikomanagement-System angeben. Der Code des Expert Advisors wird automatisch erstellt, du kannst ihn kompilieren und im Strategietester der MetaTrader 5-Clientterminal testen.


Testergebnisse

Betrachten wir das Backtesting des Expert Advisors auf historischen Daten (EURUSD H1, Testzeitraum: 01.01.2010 - 05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).

Bei der Erstellung des Expert Advisors verwendeten wir das feste Volumen (Trading Fixed Lot, 0.1), der Trailing-Stop-Algorithmus wurde nicht verwendet (Trailing nicht verwendet).

Abbildung 3. Historische Backtesting-Ergebnisse des Expert Advisors, basierend auf Kurs-Crossover mit MA und ADX-Bestätigung

Abbildung 3. Historische Backtesting-Ergebnisse des Expert Advisors, basierend auf Kurs-Crossover mit MA und ADX-Bestätigung


Anlagen: Die SignalADX-MA.mqh mit der Klasse CSignalADX_MA muss in terminal_data_folder/MQL5/Include/Expert/Signal/ platziert werden.

Die ma_crossover_adx.mq5 enthält den Code des Expert Advisors, der mit MQL5 Wizard erstellt wurde.


Verwandte Beiträge

Kommentar (0)