MetaTrader 5 / 程序库

MQL5 向导 - 蜡烛(K 线)形态类 - MetaTrader 5程序库

7560
(83)

MQL5 向导 允许创建现成的交易程序,此程序基于随客户端附带的 标准类库。 它可以快速检验我们的交易想法,所有您要做的就是创建您的交易信号子类。这个类的构造及使用例子请参见文章 MQL5 向导:如何创建一个交易信号模块

通常做法如下:交易信号子类由 CExpertSignal 衍生出来,之后,必须用您自己的方法重写类中的 LongCondition()ShortCondition() 虚方法。

有本书 "Strategies of best traders(交易者最佳策略)"(俄语版),书中论述了许多交易策略,我们将注意力集中在反转 K 线形态上,并用 Stochastic, CCI, MFIRSI 振荡指标来确认。

最佳途径是创建分离的子类,此类由 CExpertSignal 中衍生,用于检查 K 线的形态结构。用于验证 K 线形态生成的交易信号,写一个 CCandlePattern 的衍生子类就足够了,并加入必要的特性(如,振荡指标确认)。

在此,我们考虑 CCandlePattern 类,利用 MQL5 向导,可简单的利用它创建 K 线形态的交易信号子类。


CCandlePattern 类

CCandlePattern 类衍生于 CExpertSignal 类(交易信号基类)

class CCandlePattern : public CExpertSignal   { protected:    //--- 指标    CiMA              m_MA;    //--- 时间序列    CiOpen            m_open;    CiHigh            m_high;    CiLow             m_low;    CiClose           m_close;    //--- 输入参数    int               m_ma_period; public:  //--- 构造函数                      CCandlePattern();    //--- 输入参数设置方法    void              MAPeriod(int period)             { m_ma_period=period;                 }    //--- 初始化方法    virtual bool      ValidationSettings();    virtual bool      InitIndicators(CIndicators *indicators);    //--- 检查确认形态的形状    bool              CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern);    //--- 检查牛/熊形态的形状    bool              CheckPatternAllBullish();    bool              CheckPatternAllBearish(); protected:    //--- 初始化指标和时间序列    bool              InitMA(CIndicators *indicators);    bool              InitOpen(CIndicators *indicators);    bool              InitHigh(CIndicators *indicators);    bool              InitLow(CIndicators *indicators);    bool              InitClose(CIndicators *indicators);    //--- 形态检查方法    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))); }    //--- 检查确定形态模型方法    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();   };


MQL5 向导:交易信号子类中使用 CCandlePattern

在 MQL5 向导中,CCandlePattern 类可作为交易信号子类的父类。必须从 CCandlePattern 类中衍生出交易信号类,也必须加入方法来检查多/空仓位的开单/平仓(附加的指标,等等)。

反转 K 线形态结构可用于交易信号,但最好配合其它条件确认(比如,使用振荡器)。

  • bool CheckOpenLong(double &price,double &sl,double &tp,datetime &expiration) - 检查多单开仓条件;
  • bool CheckCloseLong(double &price)  - 检查多单平仓条件;
  • bool CheckOpenShort(double &price,double &sl,double &tp,datetime &expiration) - 检查空单开仓条件;
  • bool CheckCloseShort(double &price) - 检查空单平仓条件;
//+------------------------------------------------------------------+ //|                                          CSampleCandleSignal.mqh | //+------------------------------------------------------------------+ // 包含 CCandlePattern 类 // 这个 candlepatterns.mqh 必须位于同一目录 #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:    //--- 指标    ....    //--- 输入参数    ... public:    //--- 构造器                      CTestClass();    //--- 输入参数设置方法    ...    //--- 初始化指标和时间序列/检查输入参数    virtual bool      ValidationSettings();    virtual bool      InitIndicators(CIndicators *indicators);    //--- 检查交易信号    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:    //--- 初始化指标方法    ...    //--- 存取指标值方法    ...   };

在 MQL5 向导中使用交易信号子类结构的细节,可参阅文章 MQL5 向导:如何创建交易信号模块

请看这一行:

//| Parameter=MAPeriod,int,12                                        | 

在向导的描述部分。

这个 MAPeriod 方法在 CCandlePattern 父类中用于计算平均收盘价以及 K 线实体的均值。省缺时,在 CCandlePattern() 类的构造函数中设置 m_ma_period=12。 不过,最好使用输入参数对它进行设置,这样做您可以在 MetaTrader 5 的 策略测试员 中使用它。


不要忘记调用父类中的 ValidationSettings() 和 InitIndicators()

提示,必须在相应的类方法中调用父类的 CCandlePattern::ValidationSettings 和 CCandlePattern::InitIndicators 方法。

最好首先调用这些方法:

bool CSampleCandleSignal ::ValidationSettings()   { //--- 调用父类 CCandlePattern 的 ValidationSettings    if(!CCandlePattern::ValidationSettings()) return(false); //--- 您的代码 .. //--- ok    return(true);   }

同样,对于 InitIndicators() 方法:

bool CSampleCandleSignal ::InitIndicators(CIndicators *indicators)   { //--- 调用父类 CCandlePattern 的 InitIndicators    if(!CCandlePattern::InitIndicators(indicators)) return(false);   //--- 您的代码 ... //--- ok    return(true);   }


检测 K 线形态

为检测确定 K 线形态的形状,必须调用 CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern) 方法,将形态作为参数传递到函数。

同样,您也可以使用 CheckPatternAllBullish() 和 CheckPatternAllBearish() 方法,来检测牛(多)/ 熊(空)的 K 线形态。

为了让 K 线形态检测工作简单,这个 ENUM_CANDLE_PATTERNS 枚举类型会被用到:

enum ENUM_CANDLE_PATTERNS  // 形态清单   {    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   };

检测 K 线牛市(多头)形态:

///--- 检查形状 "3 白兵" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) ///--- 检查形状 "穿刺线" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE) ///--- 检查形状 "早晨十字星" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) ///--- 检查形状 "牛市吞噬" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) ///--- 检查形状 "牛市孕育" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) ///--- 检查形状 "早晨之星" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) ///--- 检查形状 "牛市约会线Bullish Meeting Lines" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) ///--- 检查形状 "锤头" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) ///--- 检查形状 牛市形态之一   CheckPatternAllBullish(); 

检测 K 线熊市(空头)形态:

///--- 检查形状 "3 乌鸦" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) ///--- 检查形状 "乌云盖顶" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER) ///--- 检查形状 "黄昏十字星" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) ///--- 检查形状 "熊市吞噬" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) ///--- 检查形状 "黄昏之星" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) ///--- 检查形状 "上吊线" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) ///--- 检查形状 "熊市孕育" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) ///--- 检查形状 "熊市约会线" 形态:   CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) ///--- 检查形状 熊市形态之一   CheckPatternAllBearish(); 

以下是使用这些方法的例子:

1. 开多单

//+------------------------------------------------------------------+ //| Checking condition of long position opening    | //+------------------------------------------------------------------+ bool CSampleCandleSignal::CheckOpenLong(double &price,double &sl,double &tp,datetime &expiration)   { //--- 检查开多单条件 //--- 最好使用此代码加进指标检查 //--- 例如,让我们来检查 "3 白兵" 形态的形状:    if CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) return(true): //--- 无信号    return(false);   } 

2. 平多仓

//-------------------------------------------------------------------+ //| Checking condition of long position closing    | //+------------------------------------------------------------------+ bool CSampleCandleSignal::CheckCloseLong(double &price)   { //--- 检查平多仓条件 //--- 例如,检查熊市形态之一:    if CheckPatternAllBearish() return(true): //--- 无信号    return(false);   } 

3. 开空单

//-------------------------------------------------------------------+ //| Checking condition of short position opening    | //+------------------------------------------------------------------+ bool CSampleCandleSignal::CheckOpenShort(double &price,double &sl,double &tp,datetime &expiration)   { //--- 检查开空单条件 //--- 最好使用此代码加进指标检查 //--- 例如,检查 "3 乌鸦" 形态的形状:     if CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) return(true): //--- 无信号    return(false);   } 

4. 平空仓

//-------------------------------------------------------------------+ //| Checking condition of short position closing   | //+------------------------------------------------------------------+ bool CSampleCandleSignal::CheckCloseShort(double &price)   { //--- 检查平空仓条件 //--- 最好使用此代码加进指标检查 //--- 例如,检查牛市形态之一:    if CheckPatternAllBullish() return(true): //--- 无信号    return(false);   } 

推荐

为减少错误信号,反转 K 线形态必须配合其它指标进行确认,比如振荡器。

在 "Strategies of best traders(交易者最佳策略)" 一书中已经论述以下形态:

  • 3 乌鸦/3 白兵
  • 乌云盖顶/穿刺线
  • 十字启明星/十字黄昏星
  • 熊市鲸吞/牛市鲸吞
  • 黄昏之星/早晨之星
  • 锤头线/上吊线
  • 熊市孕育线/牛市孕育线
  • 熊市约会线/牛市约会线

确认可用 Stochastic, CCI, MFI and RSI 振荡器。

稍后我们将提供可用于 MQL5 向导的交易信号类。

由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/291