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
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
1. Open een lange positie
Voorwaarden om een lange positie te openen:
- StateEMA(0)<0 en StateEMA(1)>0: moving average stijgt op de huidige en laatst voltooide candles;
- StateClose(1)>0: de sluitprijs van de laatst voltooide candle is hoger dan de moving average;
- MainADX(0)>minimum_ADX: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (voor het controleren van de trend);
- 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:
- StateEMA(0)<0 en StateEMA(1)<0: moving average daalt op de huidige en laatst voltooide candles;
- StateClose(1)<0: de sluitprijs van de voltooide candle is lager dan de moving average;
- MainADX(0)>minimum_ADX: de ADX waarde van de huidige candle is groter dan de opgegeven minimale waarde (voor het controleren van de trend);
- 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 "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
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
- MQL5 Wizard: Handelsignalen Geïnspireerd Door Morning/Evening Stars + MFI voor MetaTrader 5
- MQL5 Wizard: Creëer Handelsstrategieën met Bullish en Bearish Engulfing Candlestick Patronen en Stochastic
- MQL5 Wizard: Handelsignalen Geïnspireerd door Morning/Evening Stars en RSI voor MetaTrader 5
- Efficiënt Trendvolgend Handelsysteem met Exp_X2MA_JFatl voor MetaTrader 5
- Close Cross MA: Efficiënt Orders Sluiten met MetaTrader 4