MQL5 Wizard – Candlestick Patterns Class – library MetaTrader 5

The MQL5 Wizard allows creating ready-made Expert Advisors based on the Standard library classes delivered together with the client terminal. It allows to check your trade ideas quickly, all you need is to create your own trading signals class. The structure of this class and example can be found in the article MQL5 Wizard: How to Create a Module of Trading Signals.

The generic idea is the following: the class of trading signals is derived from CExpertSignal, the next, it’s necessary to override the LongCondition() and ShortCondition() virtual methods with your own methods.

There is a book “Strategies of best traders” (in Russian), there are many trading strategies are considered there, we will focus on reversal candlestick patterns, confirmed by Stochastic, CCI, MFI and RSI oscillators.

The best way is to create the separate class, derived from CExpertSignal for checking of formation of candlestick patterns. For confirmation of trade signals, generated by candlestick patterns, it’s sufficient to write the class, derived from CCandlePattern and add the necessary features (for example, confirmation by oscillators) there.

Here we will consider the CCandlePattern class, it allows to simplify the creation of trade signal classes with candlestick patterns for MQL5 Wizard.


CCandlePattern class

The CCandlePattern class is derived from the CExpertSignal class (base class of trading signals)

class CCandlePattern : public CExpertSignal
  {
protected:
   //--- indicators
   CiMA              m_MA;
   //--- time series
   CiOpen            m_open;
   CiHigh            m_high;
   CiLow             m_low;
   CiClose           m_close;
   //--- input parameters
   int               m_ma_period;

public:
   //--- constructor
                     CCandlePattern();
   //--- method of input parameter setting
   void              MAPeriod(int period)             { m_ma_period=period;                 } 
   //--- initialization methods
   virtual bool      ValidationSettings();
   virtual bool      InitIndicators(CIndicators *indicators);

   //--- check formation of a certain candlestick pattern
   bool              CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern);
   //--- check formation of bullish/bearish candlestick pattern
   bool              CheckPatternAllBullish();
   bool              CheckPatternAllBearish();

protected:
   //--- initialization of indicators and time series
   bool              InitMA(CIndicators *indicators);
   bool              InitOpen(CIndicators *indicators);
   bool              InitHigh(CIndicators *indicators);
   bool              InitLow(CIndicators *indicators);
   bool              InitClose(CIndicators *indicators);
   //--- methods, used for candlestick checking
   double            AvgBodySize(int ind);
   double            MA(int ind)                const { return(m_MA.Main(ind));             }
   double            Open(int ind)              const { return(m_open.GetData(ind));        }
   double            High(int ind)              const { return(m_high.GetData(ind));        }
   double            Low(int ind)               const { return(m_low.GetData(ind));         }
   double            Close(int ind)             const { return(m_close.GetData(ind));       }
   double            CloseAvg(int ind)          const { return(MA(ind));                    }
   double            MidPoint(int ind)          const { return(0.5*(High(ind)+Low(ind)));   }
   double            MidOpenClose(int ind)      const { return(0.5*(Open(ind)+Close(ind))); }
   //--- methods for checking of a certain candlestick model
   bool              CheckPatternThreeBlackCrows();
   bool              CheckPatternThreeWhiteSoldiers();
   bool              CheckPatternDarkCloudCover();
   bool              CheckPatternPiercingLine();
   bool              CheckPatternMorningDoji();
   bool              CheckPatternEveningDoji();
   bool              CheckPatternBearishEngulfing();
   bool              CheckPatternBullishEngulfing();
   bool              CheckPatternEveningStar();
   bool              CheckPatternMorningStar();
   bool              CheckPatternHammer();
   bool              CheckPatternHangingMan();
   bool              CheckPatternBearishHarami();
   bool              CheckPatternBullishHarami();
   bool              CheckPatternBearishMeetingLines();
   bool              CheckPatternBullishMeetingLines();
  };

Using CCandlePattern in trade signal classes for MQL5 Wizard

The CCandlePattern class can be used a parent class for trade signal classes for MQL5 Wizard. It’s necessary to derive the trade signal class from CCandlePattern class, also it’s necessary to add methods for checking of long/short position opening/closing (in addition to indicators, etc…).

Formation of reversal candlestick pattern can be used as a trade signal, but it’s better to check confirmation (for example, using the oscillators).

  • bool CheckOpenLong(double &price,double &sl,double &tp,datetime &expiration) – Checks conditions of long position opening;
  • bool CheckCloseLong(double &price)  – Checks conditions of long position closing;
  • bool CheckOpenShort(double &price,double &sl,double &tp,datetime &expiration) – Checks conditions of short position opening;
  • bool CheckCloseShort(double &price) – Checks conditions of short position closing;
//+------------------------------------------------------------------+
//|                                          CSampleCandleSignal.mqh |
//+------------------------------------------------------------------+
// include CCandlePattern class
// the candlepatterns.mqh must be located in the same folder
#include "CandlePatterns.mqh"
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Test signal                                                |
//| Type=Signal                                                      |
//| Name=CSampleCandleSignal                                         |
//| Class=CSampleCandleSignal                                        |
//| Page=                                                            |
//| Parameter=param1,int,9                                           |
....
//| Parameter=paramN,int,13                                          |
//| Parameter=MAPeriod,int,12                                        |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
class CSampleCandleSignal : public CCandlePattern
  {
protected:
   //--- indicators
   ....
   //--- input parameters
   ...
public:
   //--- constructor
                     CTestClass();
   //--- methods for setting of input parameters
   ...
   //--- initialization of indicators and time series/checking of input parameters
   virtual bool      ValidationSettings();
   virtual bool      InitIndicators(CIndicators *indicators);
   //--- checking of trade signals
   virtual bool      CheckOpenLong(double &price,double &sl,double &tp,datetime &expiration);
   virtual bool      CheckCloseLong(double &price);
   virtual bool      CheckOpenShort(double &price,double &sl,double &tp,datetime &expiration);
   virtual bool      CheckCloseShort(double &price);

protected:
   //--- methods of indicators initialization
   ...
   //--- methods for access to indicator's values
   ...
  };

The details about the structure of trading signal classes, used in MQL5 Wizard, can be found in the article MQL5 Wizard: How to Create a Module of Trading Signals.

Alternative:  Schaff TCD RSX - indicator MetaTrader 5

Take a look at the line:

//| Parameter=MAPeriod,int,12                                        |

in the wizard description section.

The MAPeriod method is used in the CCandlePattern parent class for calculation of average closing price and averaged values of the candle’s body. By default, m_ma_period=12 is set in CCandlePattern() class constructor. However, it’s better to set it using the input parameter, it will allow you to use it in Strategy Tester of MetaTrader 5.

Don’t forget to call ValidationSettings() and InitIndicators() of parent class

Note, that it’s necessary to call the CCandlePattern::ValidationSettings and CCandlePattern::InitIndicators methods of parent class in the corresponding class methods.

It’s better to call these methods first:

bool CSampleCandleSignal ::ValidationSettings()
  {
//--- call of ValidationSettings of parent CCandlePattern class
   if(!CCandlePattern::ValidationSettings()) return(false);
//--- your code
..
//--- ok
   return(true);
  }

The same is for the InitIndicators() method:

bool CSampleCandleSignal ::InitIndicators(CIndicators *indicators)
  {
//--- call of InitIndicators of parent CCandlePattern class
   if(!CCandlePattern::InitIndicators(indicators)) return(false);   
//--- your code
...
//--- ok
   return(true);
  }


Checking candlestick patterns

To check the formation of a certain candlestick pattern it’s necessary to call the CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern) method with pattern, passed to the function.

Also you can check formation of one of the bullish/bearish candlestick patterns using the CheckPatternAllBullish() and CheckPatternAllBearish() methods.

To simplify the work of candlestick patterns, the ENUM_CANDLE_PATTERNS enumeration is used:

enum ENUM_CANDLE_PATTERNS  // candlestick patterns list
  {
   CANDLE_PATTERN_THREE_BLACK_CROWS     = 1,
   CANDLE_PATTERN_THREE_WHITE_SOLDIERS  = 2,
   CANDLE_PATTERN_DARK_CLOUD_COVER      = 3,
   CANDLE_PATTERN_PIERCING_LINE         = 4,
   CANDLE_PATTERN_MORNING_DOJI          = 5,
   CANDLE_PATTERN_EVENING_DOJI          = 6,
   CANDLE_PATTERN_BEARISH_ENGULFING     = 7,
   CANDLE_PATTERN_BULLISH_ENGULFING     = 8,
   CANDLE_PATTERN_EVENING_STAR          = 9,
   CANDLE_PATTERN_MORNING_STAR          = 10,
   CANDLE_PATTERN_HAMMER                = 11,
   CANDLE_PATTERN_HANGING_MAN           = 12,
   CANDLE_PATTERN_BEARISH_HARAMI        = 13,
   CANDLE_PATTERN_BULLISH_HARAMI        = 14,
   CANDLE_PATTERN_BEARISH_MEETING_LINES = 15,
   CANDLE_PATTERN_BULLISH_MEETING_LINES = 16
  };

Checking bullish candlestick patterns:

///--- Check formation of "3 White Soldiers" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS)

///--- Check formation of "Piercing Line" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE)

///--- Check formation of "Morning Doji" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI)

///--- Check formation of "Bullish Engulfing" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING)

///--- Check formation of "Bullish Haramii" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI)

///--- Check formation of "Morning Star" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR)

///--- Check formation of "Bullish Meeting Lines" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES)

///--- Check formation of "Hammer" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_HAMMER)

///--- Check formation of one of the bullish candlestick patterns
  CheckPatternAllBullish();

Checking bearish candlestick patterns:

///--- Check formation of "3 Black Crows" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS)

///--- Check formation of "Dark Cloud Cover" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER)

///--- Check formation of "Evening Doji" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI)

///--- Check formation of "Bearish Engulfing" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING)

///--- Check formation of "Evening Star" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR)

///--- Check formation of "Hanging Man" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN)

///--- Check formation of "Bearish Harami" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI)

///--- Check formation of "Bearish Meeting Lines" pattern:
  CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES)

///--- Check formation of one of the bearish patterns
  CheckPatternAllBearish();

Here are examples of use of the methods:

Alternative:  Copy Tick and History From MT4 to MT5 real time. - EA MetaTrader 5

1. Open long position

//+------------------------------------------------------------------+
//| Checking condition of long position opening                      |
//+------------------------------------------------------------------+
bool CSampleCandleSignal::CheckOpenLong(double &price,double &sl,double &tp,datetime &expiration)
  {
//--- check conditions to open long position
//--- it's better to use this code in addition to indicator's checking
//--- for example, let's check formation of "3 white soldiers" pattern:
   if CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) return(true):
//--- no signal
   return(false);
  }

2. Close long position

//-------------------------------------------------------------------+
//| Checking condition of long position closing                      |
//+------------------------------------------------------------------+
bool CSampleCandleSignal::CheckCloseLong(double &price)
  {
//--- check conditions to close long position
//--- for example, let's check formation of one of the bearish pattern:
   if CheckPatternAllBearish() return(true):
//--- no signal
   return(false);
  }

3. Open short position

//-------------------------------------------------------------------+
//| Checking condition of short position opening                     |
//+------------------------------------------------------------------+
bool CSampleCandleSignal::CheckOpenShort(double &price,double &sl,double &tp,datetime &expiration)
  {
//--- check conditions to open short position
//--- it's better to use this code in addition to indicator's checking
//--- for example, let's check formation of "3 black crows" pattern:
    if CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) return(true):
//--- no signal
   return(false);
  }

4. Close short position

//-------------------------------------------------------------------+
//| Checking condition of short position closing                     |
//+------------------------------------------------------------------+
bool CSampleCandleSignal::CheckCloseShort(double &price)
  {
//--- check conditions to close short position
//--- it's better to use this code in addition to indicator's checking
//--- for example, let's check formation of one of the bullish pattern:
   if CheckPatternAllBullish() return(true):
//--- no signal
   return(false);
  }

Recommendations

To reduce false signals, the reversal candlestick patterns must be confirmed by other indicators, such as oscillators.

The following patterns are considered in the “Strategies of best traders” book:

  • 3 Black Crows/3 White Soldiers
  • Dark Cloud Cover/Piercing Line
  • Morning Doji/Evening Doji
  • Bearish Engulfing/Bullish Engulfing
  • Evening Star/Morning Star
  • Hammer/Hanging Man
  • Bearish Harami/Bullish Harami
  • Bearish Meeting Lines/Bullish Meeting Lines

confirmed by Stochastic, CCI, MFI and RSI oscillators.

Later we will provide the classes of trade signals for use in MQL5 Wizard.


📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks