大家好!今天我们来聊聊如何利用MQL5 Wizard来创建基于标准库类的现成交易顾问(EA)。这个工具能够快速检验你的交易想法,你只需创建自己的交易信号类即可。关于这个类的结构和示例可以参考MQL5 Wizard: 如何创建交易信号模块这篇文章。
基本思路是:交易信号类继承自CExpertSignal,然后你需要重写LongCondition()和ShortCondition()这两个虚拟方法,添加你自己的逻辑。
有一本书《最佳交易者策略》(俄文),书中讨论了多种交易策略,我们将聚焦于反转蜡烛形态,结合随机指标、CCI、MFI和RSI等振荡指标进行确认。
最好的做法是创建一个独立的类,继承自CExpertSignal,用于检查蜡烛形态的形成。为了确认由蜡烛形态生成的交易信号,只需编写一个继承自CCandlePattern的类,并添加必要的功能(例如,振荡指标确认)即可。
接下来,我们将讨论基于“暗云盖/刺透形态”的反转蜡烛形态,结合CCI指标进行确认。这个交易信号模块基于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); }
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); }
CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE)方法用于检查“刺透形态”蜡烛形态的形成。
2. 由CCI指标确认的交易信号
开启多头或空头仓位的交易信号必须由CCI指标确认。CCI的值必须高于/低于临界水平(多头仓位为-50,空头仓位为50)。
已开仓位的平仓取决于CCI的值。平仓可以在两种情况下进行:
- 如果CCI线达到相反的临界水平(多头80,空头-80)
- 如果反转信号未得到确认(当CCI达到以下水平时:多头-80,空头80)

图3. 暗云盖形态确认的CCI指标
- int CDC_PL_CCI::LongCondition() - 检查开启多头仓位的条件(返回80)和关闭空头仓位的条件(返回40);
- int CDC_PL_CCI::ShortCondition() - 检查开启空头仓位的条件(返回80)和关闭多头仓位的条件(返回40)。
2.1. 开启多头仓位/关闭空头仓位
“刺透形态”的形成必须由CCI指标确认:CCI(1)<-50(最后一根完成蜡烛的CCI值必须小于-50)。
如果CCI指标向上穿越临界水平-80或向下穿越临界水平80,则必须关闭空头仓位。
//+------------------------------------------------------------------+ //| 检查进场及退场条件 | //| 1) 进场(开启多头仓位,结果=80) | //| 2) 退场(关闭空头仓位,结果=40) | //+------------------------------------------------------------------+ int CDC_PL_CCI::LongCondition() { int result=0; //--- idx可以用来确定EA工作模式 //--- idx=0 - 在这种情况下,EA在每个tick检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件 int idx =StartIndex(); //--- 检查开启多头仓位的条件 //--- “刺透形态”的形成和CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE) && (CCI(1)<-50)) result=80; //--- 检查关闭空头仓位的条件 //--- 信号线穿越超买/超卖水平(向下-80,向下-80) if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)<80) && (CCI(2)>80))) result=40; //--- 返回结果 return(result); }
2.2. 开启空头仓位/关闭多头仓位
“暗云盖”的形成必须由CCI指标确认:CCI(1)>50(最后一根完成蜡烛的CCI值必须大于50)。
如果CCI指标向下穿越-80或80水平,则必须关闭多头仓位。
//+------------------------------------------------------------------+ //| 检查进场及退场条件 | //| 1) 进场(开启空头仓位,结果=80) | //| 2) 退场(关闭多头仓位,结果=40) | //+------------------------------------------------------------------+ int CDC_PL_CCI::ShortCondition() { int result=0; //--- idx可以用来确定EA工作模式 //--- idx=0 - 在这种情况下,EA在每个tick检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件 int idx =StartIndex(); //--- 检查开启空头仓位的条件 //--- “暗云盖”的形成和CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER) && (CCI(1)>50)) result=80; //--- 检查关闭多头仓位的条件 //--- 信号线穿越超买/超卖水平(向下-80,向上80) if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) result=40; //--- 返回结果 return(result); }
2.3. 使用MQL5 Wizard创建交易顾问
CDC_PL_CCI类并不包含在标准库类中,要使用它,需要下载acdc_pl_cci.mqh文件(见附件),并将其保存到client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals。candlepatterns.mqh文件也需要这样处理。重启MetaEditor后,就可以在MQL5 Wizard中使用它。
要创建一个交易顾问,请启动MQL5 Wizard:

图4. 创建交易顾问
接下来,指定交易顾问的名称:

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

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

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

图8. 交易顾问的信号属性
你可以选择任何跟踪属性,但我们将使用“未使用跟踪止损”:

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

图10. 交易顾问的资金管理属性
按下“完成”按钮,我们将获得生成的交易顾问代码,位于Expert_ADC_PL_CCI.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 Wizard生成的交易顾问使用来自交易信号模块的“投票”来开仓和平仓。主模块(作为容器,包含所有添加的模块)的投票结果也会被使用,但其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,PeriodCCI=15,MA_period=19)上的交易顾问回测。
在创建交易顾问时,我们使用了固定的交易量(固定交易手数,0.1),未使用跟踪止损算法(未使用跟踪)。

图11. 基于暗云盖/刺透形态 + CCI的交易顾问测试结果
最佳的输入参数组合可以利用MetaTrader 5客户端的策略测试器找到。
生成的交易顾问代码已附在expert_adc_pl_cci.mq5文件中。