在外汇交易中,MQL5 Wizard 可以帮助我们快速创建基于现成策略的智能交易顾问(EA)。它结合了 标准库 类,能够有效地检验交易想法。想要快速开始,只需创建自己的交易信号类,相关结构和示例请参考MQL5 Wizard: 如何创建交易信号模块。
交易信号的基本思路是:信号类应继承自CExpertSignal,然后重写 LongCondition() 和 ShortCondition() 方法为自己的逻辑。
我们将重点关注基于反转蜡烛形态(例如晨星和暮星)以及通过CCI指标确认的交易信号,这些信号模块基于CCandlePattern类,为我们提供了蜡烛形态生成交易信号的简单示例。
1. “晨星”和“暮星”反转蜡烛形态
1.1. 晨星
晨星形态表示下跌趋势的反转,由三根蜡烛组成(见图1)。在一根长黑蜡烛之后,出现一根小身体的蜡烛(颜色无关紧要),它的位置在黑蜡烛之外。小身体的蜡烛表示多头与空头的力量相对平衡,市场准备改变趋势。
该形态的第三根蜡烛是多头蜡烛,其身体不与第二根蜡烛的身体重叠,并且收盘价位于第一根蜡烛(空头蜡烛)的身体内部。图1展示了这个形态。
如果第二根蜡烛是十字蜡烛,该模型则称为“晨十字星”。

图1. “晨星”和“晨十字星”蜡烛形态
“晨星”形态的识别通过CCandlePattern类中的CheckPatternMorningStar()和CheckPatternMorningDoji()方法实现。
//+------------------------------------------------------------------+ //| 检查“晨星”形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningStar() { //--- 晨星 if((Open(3)-Close(3)>AvgBody(1)) && // 空头蜡烛,其身体大于平均蜡烛身体 (MathAbs(Close(2)-Open(2)<AvgBody(1*0.5)) && // 第二根蜡烛身体小于平均蜡烛身体的一半 (Close(2)<Close(3)) && // 第二根蜡烛收盘价低于第一根蜡烛收盘价 (Open(2)<Open(3)) && // 第二根蜡烛开盘价低于第一根蜡烛开盘价 (Close(1)>MidOpenClose(3))) // 最后一根完成蜡烛的收盘价高于第一根蜡烛的中间价 return(true); //--- return(false); }
1.2. 暮星
暮星形态表示上涨趋势的反转,同样由三根蜡烛组成(见图2)。在一根长白蜡烛之后,出现一根小身体的蜡烛(颜色无关紧要),它的位置在白蜡烛之外。小身体的蜡烛表示多头与空头的力量相对平衡,市场准备改变趋势。
该形态的第三根蜡烛是空头蜡烛,其身体不与第二根蜡烛的身体重叠,并且收盘价位于第一根蜡烛(多头蜡烛)的身体内部。图2展示了这个形态。
如果第二根蜡烛是十字蜡烛,该模型则称为“暮十字星”。

图2. “暮星”和“暮十字星”蜡烛形态
“暮星”和“暮十字星”形态的识别通过CCandlePattern类中的CheckPatternEveningStar()和CheckPatternEveningDoji()方法实现。
2. CCI指标确认的交易信号
开多或空头仓位的交易信号需要通过CCI指标确认。CCI值必须高于/低于关键水平(多头仓位为-50,空头仓位为50)。
仓位的平仓取决于CCI的值,可通过以下两种情况实现:
- 当CCI曲线达到相反的关键水平(多头仓位为80,空头仓位为-80)时;
- 当反向信号未被确认(当CCI达到以下水平:多头仓位为-80,空头仓位为80时)。

图3. 通过CCI指标确认的暮星形态
3. 使用MQL5 Wizard创建智能交易顾问
为了使用CMS_ES_CCI类,需下载acms_es_cci.mqh文件并将其保存到客户端数据文件夹中的MQL5\Include\Expert\Signal\MySignals文件夹下。相同的操作也适用于candlepatterns.mqh文件。重新启动MetaEditor后,便可在MQL5 Wizard中使用。
启动MQL5 Wizard以创建智能交易顾问:

图4. 使用MQL5 Wizard创建智能交易顾问
指定智能交易顾问的名称:

图5. 设置智能交易顾问的一般属性
接下来,选择所用的交易信号模块。

图6. 智能交易顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加“基于晨星/暮星形态并由CCI确认的信号”交易信号模块:

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

图8. 智能交易顾问的信号属性
您可以选择任何移动止损属性,但我们将使用“未使用移动止损”:

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

图10. 智能交易顾问的资金管理属性
点击“完成”按钮,将生成的智能交易顾问的代码保存在terminal_data_folder\MQL5\Experts\下,文件名为Expert_AMS_ES_CCI.mq5。
生成的智能交易顾问的默认输入参数:
//--- 主信号的输入参数 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。
生成的智能交易顾问通过交易信号模块的“投票”来开平仓。主模块的投票(作为容器,包含所有添加的模块)也会使用,但其LongCondition()和ShortCondition()方法始终返回0。
主模块的投票结果也用于“投票”平均。在我们的案例中,主模块+1个交易信号模块,因此在设置阈值时需要考虑这一点。因此,ThresholdOpen和ThresholdClose应设置为40=(0+80)/2和20=(0+40)/2。
Signal_StopLevel和Signal_TakeLevel输入参数的值设置为0,意味着仓位的关闭将仅在平仓条件满足时进行。
3.1. 历史回测结果
让我们考虑在历史数据上的智能交易顾问回测(EURUSD H1,测试周期:2009.01.01-2011.03.16,PeriodCCI=25,MA_period=5)。

图11. 基于晨星/暮星+CCI的智能交易顾问测试结果
最佳输入参数集可通过使用MetaTrader 5客户端的策略测试器找到。
附上由MQL5 Wizard生成的智能交易顾问代码expert_ams_es_cci.mq5。