Home Systeemhandel Bericht

Handelen met MQL5 Wizard: Signalen op Basis van Prijsoverschrijding met MA en ADX

Bijlage
258.zip (3.23 KB, Downloaden 0 keer)

MQL5 Wizard stelt je in staat om automatisch de code van Expert Advisors (EA) te genereren. Voor meer informatie kun je kijken naar Het maken van kant-en-klare Expert Advisors in MQL5 Wizard.

In dit artikel bespreken we een strategie die gebaseerd is op prijsoverschrijding met de Moving Average (MA) indicator, bevestigd door de ADX indicator. Deze strategie wordt aangeduid als "Signalen op Basis van Prijsoverschrijding met MA Bevestigd door ADX" (zoals je het automatisch aanmaakt in MQL5 Wizard).

De handelsignalen:

  • Kopen: de sluitprijs van de laatst voltooide candle is hoger dan de moving average, en de moving average stijgt op de huidige en laatst voltooide candles.
  • Verkopen: de sluitprijs van de laatst voltooide candle is lager dan de moving average, en de moving average daalt op de huidige en laatst voltooide candles.
  • Om valse signalen te filteren, controleren we de trendkracht (ADX>ADXmin) en de trendrichting met behulp van de Directional Movement Indexes (DI+ en DI-).

Deze strategie is geïmplementeerd in de CSignalADX_MA klasse (deze moet worden geplaatst in de terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Figuur 1. Handelsignalen op basis van prijsoverschrijding met Moving Average, bevestigd door ADX

Figuur 1. Handelsignalen op basis van prijsoverschrijding met Moving Average, bevestigd door ADX

Handelsignalen

De handelsstrategie is geïmplementeerd in de CSignalADX_MA klasse, die enkele beschermde methoden bevat om de toegang tot indicatoren en prijswaarden te vereenvoudigen:

double   PlusADX(int ind)     // retourneert de waarde van de DI+ lijn van de candle
double   MainADX(int ind)     // retourneert de waarde van de hoofd lijn van de candle
double   MinusADX(int ind)    // retourneert de waarde van de DI- lijn van de candle
double   EMA(int ind)         // retourneert de waarde van de moving average van de candle
double   Close(int ind)       // retourneert de waarde van de sluitprijs van de candle
double   StateADX(int ind)    // retourneert het verschil tussen de DI+ en DI- lijnen
double   StateEMA(int ind)    // retourneert een positieve waarde als EMA stijgt en negatief als het daalt
double   StateClose(int ind)  // retourneert het verschil tussen de sluitprijs en de moving average
Het kenmerk van deze implementatie is de extra controle op de trend (met behulp van de Directional Movement Indicator). Dit stelt ons in staat om valse signalen te filteren en de handelsvoorwaarden te controleren met behulp van de waarden van de huidige (onvoltooide) candle.


1. Open een lange positie

Voorwaarden om een lange positie te openen:

  1. StateEMA(0)<0 en StateEMA(1)>0: moving average stijgt op de huidige en laatst voltooide candles;
  2. StateClose(1)>0: de sluitprijs van de laatst voltooide candle is hoger dan de moving average;
  3. MainADX(0)>minimum_ADX: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (voor het controleren van de trend);
  4. StateADX(0)>0: De DI+ is groter dan DI- van de huidige candle.
//+------------------------------------------------------------------+
//| Controleert de voorwaarden om een lange positie (kopen) te openen                    |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- voorwaarde 1: moving average stijgt op de huidige en laatst voltooide candles 
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- voorwaarde 2: sluitprijs van de laatst voltooide candle is hoger dan moving average 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- voorwaarde 3: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (trenddrempel) 
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- voorwaarde 4: de waarde van DI+ is groter dan DI- van de huidige candle
    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;
//--- controle van alle voorwaarden
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }


2. Sluit lange positie

Voorwaarden om een lange positie te sluiten:

  1. StateEMA(0)<0 en StateEMA(1)<0: moving average daalt op de huidige en laatst voltooide candles;
  2. StateClose(1)<0: de sluitprijs van de voltooide candle is lager dan de moving average;
  3. MainADX(0)>minimum_ADX: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (voor het controleren van de trend);
  4. StateADX(0)<0: De DI- is groter dan DI+ van de huidige candle.
//+------------------------------------------------------------------+
//| Controleert de voorwaarden om een lange positie te sluiten         |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
//--- voorwaarde 1: de moving average daalt op de huidige en laatst voltooide candles 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- voorwaarde 2: sluitprijs van de voltooide candle is lager dan moving average 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- voorwaarde 3: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (trenddrempel) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- voorwaarde 4: de waarde van DI- is groter dan DI- van de huidige candle
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
//--- controle van alle voorwaarden
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


3. Open een korte positie

De voorwaarden om een korte positie te openen zijn dezelfde als de sluitvoorwaarden voor lange posities.

//+------------------------------------------------------------------+
//| Controleert de voorwaarden om een korte positie te openen (verkopen)                  |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- voorwaarde 1: de moving average daalt op de huidige en laatst voltooide candles 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- voorwaarde 2: sluitprijs van de voltooide candle is lager dan moving average 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- voorwaarde 3: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (trenddrempel) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- voorwaarde 4: de waarde van DI- is groter dan DI- van de huidige candle
   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;
//--- controle van alle voorwaarden
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


4. Sluit korte positie

De voorwaarden om een korte positie te sluiten zijn dezelfde als de openingsvoorwaarden voor lange posities.

//+------------------------------------------------------------------+
//| Controleert de voorwaarden om een korte positie te sluiten        |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
//--- voorwaarde 1: moving average stijgt op de huidige en laatst voltooide candles
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- voorwaarde 2: sluitprijs van de laatst voltooide candle is hoger dan moving average 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- voorwaarde 3: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (trenddrempel)
    bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- voorwaarde 4: de waarde van DI+ is groter dan DI- van de huidige candle
   bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
//--- controle van alle voorwaarden
  return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

Een Expert Advisor maken met MQL5 Wizard

Om een handelsrobot te creëren op basis van deze strategie, moet je de signaleigenschappen selecteren als "Signalen op Basis van Prijsoverschrijding met MA Bevestigd door ADX" in de optie "Kant-en-klare Expert Advisors maken" van MQL5 Wizard:

Figuur 2. Kies

Figuur 2. Kies "Signalen op Basis van Prijsoverschrijding met MA Bevestigd door ADX" in MQL5 Wizard

Vervolgens moet je het benodigde trailing stop algoritme en het geld- en risicobeheer systeem specificeren. De code van de Expert Advisor wordt automatisch aangemaakt, je kunt deze compileren en testen in de Strategietester van de MetaTrader 5 client terminal.


Testresultaten

Laten we de backtesting van de Expert Advisor op historische data beschouwen (EURUSD H1, testperiode: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).

Bij het maken van de Expert Advisor hebben we een vast volume gebruikt (Trading Fixed Lot, 0.1), de Trailing Stop-algoritme is niet gebruikt (Trailing niet gebruikt).

Figuur 3. Historische backtestingresultaten van de Expert Advisor, gebaseerd op prijsoverschrijding met MA bevestigd door ADX

Figuur 3. Historische backtestingresultaten van de Expert Advisor, gebaseerd op prijsoverschrijding met MA bevestigd door ADX


Bijlagen: De SignalADX-MA.mqh met de CSignalADX_MA klasse moet worden geplaatst in de terminal_data_folder\MQL5\Include\Expert\Signal\.

De ma_crossover_adx.mq5 bevat de code van de Expert Advisor, gemaakt met behulp van MQL5 Wizard.


Gerelateerde berichten

Reactie (0)