Met de MQL5 Wizard kun je kant-en-klare Expert Advisors (EA's) maken, gebaseerd op de Standaard bibliotheek die bij de clientterminal wordt geleverd. Dit stelt je in staat om je handelsideeën snel te controleren. Alles wat je hoeft te doen is je eigen klasse voor handelsignalen te creëren. De structuur van deze klasse en een voorbeeld zijn te vinden in het artikel MQL5 Wizard: Hoe een Module van Handelsignalen te Creëren.
Het idee is als volgt: de klasse van handelsignalen is afgeleid van CExpertSignal. Vervolgens moet je de LongCondition() en ShortCondition() virtuele methoden overschrijven met je eigen methoden.
Er is een boek genaamd "Strategieën van de Beste Traders" (in het Russisch), waarin verschillende handelsstrategieën worden besproken. We zullen ons richten op omkeer candlestick patronen, bevestigd door de Stochastische, CCI, MFI en RSI oscillators.
De beste manier is om een aparte klasse te creëren, afgeleid van CExpertSignal, om de vorming van candlestick patronen te controleren. Voor de bevestiging van handelsignalen, gegenereerd door candlestick patronen, is het voldoende om de klasse, afgeleid van CCandlePattern, te schrijven en de nodige functies (bijvoorbeeld bevestiging door oscillators) daar toe te voegen.
Hier zullen we de signalen bekijken die gebaseerd zijn op de "Bullish Harami/Bearish Harami" omkeer candlestick patronen, bevestigd door de CCI indicator. De module van handelsignalen is gebaseerd op de CCandlePattern klasse, een eenvoudig voorbeeld van het gebruik ervan voor het creëren van handelsignalen met candlestick patronen.
1. Bullish Harami en Bearish Harami omkeer candlestick patronen
1.1. Bullish Harami
Het Bullish Harami omkeerpatroon vormt zich in een neerwaartse trend wanneer een grote candlestick wordt gevolgd door een kleinere candlestick waarvan het lichaam zich binnen het verticale bereik van het grotere lichaam bevindt. Dit patroon geeft aan dat de dalende trend (downtrend) mogelijk aan het omkeren is, en het signaleert dat het een goed moment is om een long positie in te nemen. De tweede candlestick opent met een gap naar boven. Hoe kleiner de tweede (witte) candlestick, hoe waarschijnlijker de omkering.

Fig. 1. Bullish Harami candlestick patroon
De herkenning van het "Bullish Harami" patroon wordt geïmplementeerd in de CheckPatternBullishHarami() methode van de CCandlePattern klasse:
//+------------------------------------------------------------------+ //| Controleert de vorming van het "Bullish Harami" candlestick patroon | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishHarami() { //--- Bullish Harami if((Close(1)>Open(1)) && // de laatste voltooide bar is bullish (witte dag) ((Open(2)-Close(2))>AvgBody(1)) && // de vorige candle is bearish, zijn lichaam is groter dan gemiddeld (lange zwarte) ((Close(1)<Open(2)) && // sluitingsprijs van de bullish candle is lager dan openingsprijs van de bearish candle (Open(1)>Close(2))) && // openingsprijs van de bullish candle is hoger dan sluitingsprijs van de bearish candle (MidPoint(2)<CloseAvg(2))) // neerwaartse trend return(true); //--- return(false); }
De CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) methode van de CCandlePattern klasse wordt gebruikt om de vorming van het "Bullish Harami" candlestick patroon te controleren.
1.2. Bearish Harami
Het Bearish Harami omkeerpatroon vormt zich in een opwaartse trend wanneer een grote candlestick wordt gevolgd door een kleinere candlestick waarvan het lichaam zich binnen het verticale bereik van het grotere lichaam bevindt. Dit patroon geeft aan dat de stijgende trend (uptrend) mogelijk aan het omkeren is, en het signaleert dat het een goed moment is om een short positie in te nemen. De tweede candlestick opent met een gap naar beneden.
Hoe kleiner de tweede (zwarte) candlestick, hoe waarschijnlijker de omkering.

Fig. 2. Bearish Harami candlestick patroon
De herkenning van het "Bearish Harami" patroon wordt geïmplementeerd in de CheckPatternBearishHarami() methode van de CCandlePattern klasse:
//+------------------------------------------------------------------+ //| Controleert de vorming van het "Bearish Harami" candlestick patroon | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishHarami() { //--- Bearish Harami if((Close(1)<Open(1)) && // laatste voltooide bar is bearish (zwarte dag) ((Close(2)-Open(2))>AvgBody(1)) && // de vorige candle is bullish, zijn lichaam is groter dan gemiddeld (lange witte) ((Close(1)>Open(2)) && // sluitingsprijs van de bearish candle is hoger dan openingsprijs van de bullish candle (Open(1)<Close(2))) && // openingsprijs van de bearish candle is lager dan sluitingsprijs van de bullish candle (MidPoint(2)>CloseAvg(2))) // opwaartse trend return(true); //--- return(false); }
De CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) methode van de CCandlePattern klasse wordt gebruikt om de vorming van het "Bearish Harami" candlestick patroon te controleren.
2. Handelsignalen, bevestigd door de CCI indicator
De handelsignalen om een long of short positie te openen moeten worden bevestigd door de CCI indicator. De waarde van CCI moet hoger/lager zijn dan de kritieke niveaus (-50 voor long positie en 50 voor short positie).
Het sluiten van geopende posities hangt af van de waarden van CCI. Dit kan op 2 manieren worden gedaan:
- Als de CCI-lijn het tegenovergestelde kritieke niveau heeft bereikt (80 voor long positie en -80 voor short positie)
- Als het omgekeerde signaal niet wordt bevestigd (wanneer CCI de volgende niveaus bereikt: -80 voor long positie en 80 voor short positie)

Fig. 3. Bullish Harami patroon, bevestigd door CCI indicator
- int CBH_BH_CCI::LongCondition() - controleert de voorwaarden om een long positie te openen (geeft 80 terug) en sluit de short positie (geeft 40 terug);
- int CBH_BH_CCI::ShortCondition() - controleert de voorwaarden om een short positie te openen (geeft 80 terug) en sluit de long positie (geeft 40 terug).
2.1. Open long positie/Sluit short positie
De vorming van het "Bullish Harami" patroon moet worden bevestigd door de CCI indicator: CCI(1)<-50 (de waarde van de CCI van de laatste voltooide bar moet minder zijn dan -50).
De short positie moet worden gesloten als de CCI indicator omhoog het kritieke niveau -80 heeft gekruist of omlaag het kritieke niveau 80 heeft gekruist.
//+------------------------------------------------------------------+ //| Controleert de voorwaarden voor toegang en uitgang van de markt | //| 1) Markttoegang (open long positie, resultaat=80) | //| 2) Marktsluiting (sluit short positie, resultaat=40) | //+------------------------------------------------------------------+ int CBH_BH_CCI::LongCondition() { int result=0; //--- idx kan worden gebruikt om de werkmodus van de Expert Advisor te bepalen //--- idx=0 - in dit geval controleert EA handelsvoorwaarden bij elke tick //--- idx=1 - in dit geval controleert EA handelsvoorwaarden alleen bij nieuws bars int idx =StartIndex(); //--- controle van voorwaarden om long positie te openen //--- vorming van Bullish Harami patroon en CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (CCI(1)<-50)) result=80; //--- controle van voorwaarden om short positie te sluiten //--- signaallijn crossover van overbought/oversold niveaus (omlaag -80, omlaag -80) if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)<80) && (CCI(2)>80))) result=40; //--- retourneer resultaat return(result); }
2.2. Open short positie/Sluit long positie
De vorming van het "Bearish Harami" patroon moet worden bevestigd door de CCI indicator: CCI(1)>50 (de waarde van de CCI indicator van de laatste voltooide bar moet groter zijn dan 50).
De long positie moet worden gesloten als de CCI indicator omlaag het -80 of 80 niveau heeft gekruist.
//+------------------------------------------------------------------+ //| Controleert de voorwaarden voor toegang en uitgang van de markt | //| 1) Markttoegang (open short positie, resultaat=80) | //| 2) Marktsluiting (sluit long positie, resultaat=40) | //+------------------------------------------------------------------+ int CBH_BH_CCI::ShortCondition() { int result=0; //--- idx kan worden gebruikt om de werkmodus van de Expert Advisor te bepalen //--- idx=0 - in dit geval controleert EA handelsvoorwaarden bij elke tick //--- idx=1 - in dit geval controleert EA handelsvoorwaarden alleen bij nieuws bars int idx =StartIndex(); //--- controle van voorwaarden om short positie te openen //--- vorming van Bearish Harami patroon en CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (CCI(1)>50)) result=80; //--- controle van voorwaarden om long positie te sluiten //--- signaallijn crossover van overbought/oversold niveaus (omlaag -80, omlaag 80) if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) result=40; //--- retourneer resultaat return(result); }
2.3. Een Expert Advisor maken met MQL5 Wizard
De CBH_BH_CCI klasse is niet opgenomen in de Standaard Bibliotheek klassen. Om deze te gebruiken, is het nodig om het acbh_bh_cci.mqh bestand te downloaden (zie bijlagen) en op te slaan in de client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals. Hetzelfde geldt voor het candlepatterns.mqh bestand. Je kunt het gebruiken in MQL5 Wizard na het opnieuw opstarten van de MetaEditor.
Om een Expert Advisor te creëren, start je de MQL5 Wizard:

Fig. 4. Een Expert Advisor maken met MQL5 Wizard
Laten we de naam van de Expert Advisor specificeren:

Fig. 5. Algemene eigenschappen van de Expert Advisor
Daarna moeten we de modules van handelsignalen selecteren die worden gebruikt.

Fig. 6. Signaal eigenschappen van de Expert Advisor
In ons geval gebruiken we slechts één module van handelsignalen.
Voeg de "Signalen gebaseerd op Bullish Harami/Bearish Harami bevestigd door CCI" module van handelsignalen toe:

Fig. 7. Signaal eigenschappen van de Expert Advisor
Module van handelsignalen toegevoegd:

Fig. 8. Signaal eigenschappen van de Expert Advisor
Je kunt verschillende trailing eigenschappen selecteren, maar wij zullen "Trailing Stop niet gebruikt" gebruiken:

Fig. 9. Trailing eigenschappen van de Expert Advisor
Wat betreft de geldbeheer eigenschappen, zullen we "Handelen met vaste handelsvolume" gebruiken:

Fig. 10. Geldbeheer eigenschappen van de Expert Advisor
Door op de "Voltooien" knop te drukken, krijgen we de code van de gegenereerde Expert Advisor, die is opgeslagen in terminal_data_folder\MQL5\Experts\.
De standaard invoerparameters van de gegenereerde Expert Advisor:
//--- invoerparameters voor hoofd signaal input int Signal_ThresholdOpen =10; // Signaal drempelwaarde om te openen [0...100] input int Signal_ThresholdClose =10; // Signaal drempelwaarde om te sluiten [0...100] input double Signal_PriceLevel =0.0; // Prijsniveau om een deal uit te voeren input double Signal_StopLevel =50.0; // Stop Loss niveau (in punten) input double Signal_TakeLevel =50.0 // Take Profit niveau (in punten)
moet worden vervangen door:
//--- invoerparameters voor hoofd signaal input int Signal_ThresholdOpen =40; // Signaal drempelwaarde om te openen [0...100] input int Signal_ThresholdClose =20; // Signaal drempelwaarde om te sluiten [0...100] input double Signal_PriceLevel =0.0; // Prijsniveau om een deal uit te voeren input double Signal_StopLevel =0.0; // Stop Loss niveau (in punten) input double Signal_TakeLevel =0.0 // Take Profit niveau (in punten)
De Signal_ThresholdOpen/Signal_ThresholdClose invoerparameters stellen de drempelwaarden in voor het openen en sluiten van posities.
In de code van de LongCondition() en ShortCondition() methoden van de handelsignalen klasse hebben we de vaste waarden van de drempel gespecificeerd:
- Open positie: 80;
- Sluit positie: 40.
De Expert Advisor, gegenereerd door MQL5 Wizard, opent en sluit posities met behulp van de "stemmen" van de modules van handelsignalen. De stem van de hoofdmodule (als container, bestaande uit alle toegevoegde modules) wordt ook gebruikt, maar de LongCondition() en ShortCondition() methoden geven altijd 0 terug.
De stemresultaten van de hoofdmodule worden ook gebruikt in de "stemmen"-gemiddelden. In ons geval hebben we: hoofdmodule + 1 module van handelsignalen, dus we moeten deze factor in aanmerking nemen bij het instellen van de drempelwaarden. Vanwege deze reden moeten de ThresholdOpen en ThresholdClose worden ingesteld op 40=(0+80)/2 en 20=(0+40)/2.
