下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2013.09.30 11:25
程序库

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

| Chinese English Русский Español Deutsch 日本語 Português

显示:
1286
等级:
投票: 41

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 Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/291

演示 创建 OBJ_BITMAP 脚本 演示 创建 OBJ_BITMAP 脚本

图表背景图的例子,使用对象 OBJ_BITMAP 类型创建。

演示 交易程序中创建 OBJ_BITMAP_LABEL 演示 交易程序中创建 OBJ_BITMAP_LABEL

按钮例子:使用对象 OBJ_BITMAP_LABEL 类型创建按钮。

EA 资源演示 EA 资源演示

使用资源的例子。它将使用 OBJ_BITMAP_LABEL 对象类型创建一个按钮。

DRAW_ZIGZAG演示 DRAW_ZIGZAG演示

简单例子:使用 DRAW_ZIGZAG 绘图样式。