在交易领域中,MQL5向导为我们提供了一种便捷的方式来创建基于标准库类的现成专家顾问(EA)。通过这个工具,您可以快速验证您的交易想法,只需创建自己的交易信号类即可。有关更多信息,请参阅MQL5向导:如何创建交易信号模块。
基本思路是:交易信号类从CExpertSignal派生,接下来需要重写LongCondition()和ShortCondition()虚方法,使用您自己的方法。
关于交易策略,有一本书《最佳交易者策略》(俄语),其中探讨了多种交易策略。在这里,我们将重点关注由随机指标、CCI、市场便利指数(MFI)和相对强弱指数(RSI)确认的反转蜡烛图模式。
最佳实践是创建一个单独的类,从CExpertSignal派生,用于检查蜡烛图模式的形成。为了确认由蜡烛图模式生成的交易信号,只需编写一个从CCandlePattern派生的类,并在其中添加必要的功能(例如,通过振荡器确认)。
在这里,我们将讨论基于市场便利指数(MFI)指标确认的“暗云盖/刺透线”反转蜡烛图模式的信号。交易信号模块基于CCandlePattern类,是使用蜡烛图模式创建交易信号的简单示例。
1. “暗云盖”和“刺透线”反转蜡烛图模式
1.1. 暗云盖
暗云盖是一种看跌的蜡烛图反转形态,发生在上升趋势的末端。第一天形成一根长白蜡烛,第二天出现向上的缺口。然而,第二天的收盘价低于第一天的中点。

图1:暗云盖蜡烛图模式
“暗云盖”模式的识别在CCandlePattern类中的CheckPatternDarkCloudCover()方法中实现:
//+------------------------------------------------------------------+ //| 检查“暗云盖”蜡烛图模式的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternDarkCloudCover() { //--- 暗云盖 if((Close(2)-Open(2)>AvgBody(1)) && // (长白蜡烛) (Close(1)<Close(2)) && // (Close(1)>Open(2)) && // (收盘在前一根蜡烛体内) (MidOpenClose(2)>CloseAvg(1)) && // (上升趋势) (Open(1)>High(2))) // (开盘在新高) return(true); //--- return(false); }
CCandlePattern类中的CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER)方法用于检查“暗云盖”蜡烛图模式的形成。
1.2. 刺透线
第二天的缺口向下延续了下跌趋势,然而第二天的收盘价高于第一天蜡烛体的中点。这向空头暗示,底部可能正在形成。在柱状图上,这种价格行为不如在蜡烛图上明显,第二天收盘价越深入第一天的蜡烛体,反转信号成功的可能性就越高。

图2:刺透线蜡烛图模式
“刺透线”模式的识别在CCandlePattern类中的CheckPatternPiercingLine()方法中实现:
//+------------------------------------------------------------------+ //| 检查“刺透线”蜡烛图模式的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternPiercingLine() { //--- 刺透线 if((Close(1)-Open(1)>AvgBody(1)) && // (长白蜡烛) (Open(2)-Close(2)>AvgBody(1)) && // (长黑蜡烛) (Close(1)>Close(2)) && // (Close(1)<Open(2)) && // (收盘在前一根蜡烛体内) (MidOpenClose(2)<CloseAvg(2)) && // (下跌趋势) (Open(1)<Low(2))) // (开盘低于前一根蜡烛的低点) return(true); //--- return(false); }
CCandlePattern类中的CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE)方法用于检查“刺透线”蜡烛图模式的形成。
2. 通过MFI指标确认的交易信号
开多或空头头寸的交易信号必须由MFI指标确认。MFI指标的值必须低于40(对于多头)或高于60(对于空头)。
已开仓位的平仓取决于MFI指标的值。可以在以下两种情况下完成:
- 如果MFI达到相反的临界水平(多头为70,空头为30)
- 如果反向信号未得到确认(当MFI指标达到以下水平:多头为30,空头为70)

图3:由MFI指标确认的暗云盖模式
- int CDC_PL_MFI::LongCondition() - 检查开多头寸的条件(返回80)和平空头寸的关闭条件(返回40);
- int CDC_PL_MFI::ShortCondition() - 检查开空头寸的条件(返回80)和平多头寸的关闭条件(返回40)。
2.1. 开多头寸/平空头寸
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1)市场进入(开多头寸,结果=80) | //| 2)市场退出(平空头寸,结果=40) | //+------------------------------------------------------------------+ int CDC_PL_MFI::LongCondition() { int result=0; //--- idx用于确定EA的工作模式 //--- idx=0 - 在这种情况下,EA在每个滴答时检查交易条件 //--- idx=1 - 在这种情况下,EA只在新闻柱上检查交易条件 int idx =StartIndex(); //--- 检查开多头寸的条件 //--- 刺透线模式和MFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE) && (MFI(1)<40)) result=80; //--- 检查平空头寸的条件 //--- 信号线交叉超买/超卖水平(向上30,向上70) if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) result=40; //--- 返回结果 return(result); }
2.2. 开空头寸/平多头寸
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1)市场进入(开空头寸,结果=80) | //| 2)市场退出(平多头寸,结果=40) | //+------------------------------------------------------------------+ int CDC_PL_MFI::ShortCondition() { int result=0; //--- idx用于确定EA的工作模式 //--- idx=0 - 在这种情况下,EA在每个滴答时检查交易条件 //--- idx=1 - 在这种情况下,EA只在新闻柱上检查交易条件 int idx =StartIndex(); //--- 检查开空头寸的条件 //--- 暗云盖模式和MFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER) && (MFI(1)>60)) result=80; //--- 检查平多头寸的条件 //--- 信号线交叉超买/超卖水平(向上70,向下30) if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30))) result=40; //--- 返回结果 return(result); }
2.3. 使用MQL5向导创建专家顾问
CDC_PL_MFI类不包含在标准库类中,使用前需要下载adc_pl_mfi.mqh文件(见附件)并将其保存到client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals。对acandlepatterns.mqh文件也需进行相同操作。您可以在重启MetaEditor后在MQL5向导中使用它。
要创建一个专家顾问,请启动MQL5向导:

图4:使用MQL5向导创建专家顾问
让我们指定专家顾问的名称:

图5:专家顾问的一般属性
接下来,我们需要选择使用的交易信号模块。

图6:专家顾问的信号属性
在我们的案例中,我们只使用一个交易信号模块。
添加“基于暗云盖/刺透线并由MFI确认的信号”交易信号模块:

图7:专家顾问的信号属性
交易信号模块已添加:

图8:专家顾问的信号属性
您可以选择任何跟踪属性,但我们将使用“不使用跟踪止损”:

图9:专家顾问的跟踪属性
关于资金管理属性,我们将使用“固定交易量交易”:

图10:专家顾问的资金管理属性
点击“完成”按钮后,我们将获得生成的专家顾问代码,位于Expert_ADC_PL_MFI.mq5文件中,保存于terminal_data_folder\MQL5\Experts\。
生成的专家顾问的默认输入参数:
//--- 主要信号的输入 input int Signal_ThresholdOpen =10; // 开盘信号阈值 [0...100] input int Signal_ThresholdClose =10; // 平仓信号阈值 [0...100] input double Signal_PriceLevel =0.0; // 执行交易的价格水平 input double Signal_StopLevel =50.0; // 止损水平(点数) input double Signal_TakeLevel =50.0 // 盈利水平(点数)
必须替换为:
//--- 主要信号的输入 input int Signal_ThresholdOpen =40; // 开盘信号阈值 [0...100] input int Signal_ThresholdClose =20; // 平仓信号阈值 [0...100] input double Signal_PriceLevel =0.0 // 执行交易的价格水平 input double Signal_StopLevel =0.0 // 止损水平(点数) input double Signal_TakeLevel =0.0 // 盈利水平(点数)
Signal_ThresholdOpen/Signal_ThresholdClose输入参数允许您指定开仓和平仓的阈值水平。
在交易信号类的LongCondition()和ShortCondition()方法中,我们已指定了阈值的固定值:
- 开仓:80;
- 平仓:40。
MQL5向导生成的专家顾问使用“投票”机制来开平仓位。主要模块的投票结果(作为容器,包含所有添加的模块)也会被使用,但其LongCondition()和ShortCondition()方法始终返回0。
主要模块的投票结果也用于“投票”平均计算。在我们的案例中,我们有一个主要模块 + 1个交易信号模块,因此在设置阈值时需要考虑这一点。因此,ThresholdOpen和ThresholdClose必须设置为40=(0+80)/2和20=(0+40)/2。
Signal_StopLevel和Signal_TakeLevel输入参数的值设置为0,这意味着仅在平仓条件成立时才会平仓。
2.4. 历史回测结果
我们来看看在历史数据上对专家顾问进行的回测(EURUSD H1,测试周期:2010.01.01-2011.03.16,PeriodMFI=49,MA_period=11)。
在创建专家顾问时,我们使用了固定交易量(固定手数交易,0.1),未使用跟踪止损算法(不使用跟踪)。

图11:基于暗云盖/刺透线 + MFI的专家顾问测试结果
最佳输入参数集可以通过MetaTrader 5客户端终端的策略测试器找到。
由MQL5向导生成的专家顾问代码附在expert_adc_pl_mfi.mq5中。
评论 0