- 显示:
- 7197
- 等级:
- 已发布:
- 2013.09.30 11:25
- 已更新:
- 2016.12.26 15:21
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
MQL5 向导 允许创建现成的交易程序,此程序基于随客户端附带的 标准类库。 它可以快速检验我们的交易想法,所有您要做的就是创建您的交易信号子类。这个类的构造及使用例子请参见文章 MQL5 向导:如何创建一个交易信号模块。
通常做法如下:交易信号子类由 CExpertSignal 衍生出来,之后,必须用您自己的方法重写类中的 LongCondition() 和 ShortCondition() 虚方法。
有本书 "Strategies of best traders(交易者最佳策略)"(俄语版),书中论述了许多交易策略,我们将注意力集中在反转 K 线形态上,并用 Stochastic, CCI, MFI 和 RSI 振荡指标来确认。
最佳途径是创建分离的子类,此类由 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

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

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