在交易中,想要快速验证你的交易想法吗?MQL5 Wizard 提供了一种便捷的方法来创建基于标准库的现成专家顾问(EA)。只需创建你自己的交易信号类,便可快速检查交易思路。有关该类结构和示例,请参考文章 MQL5 Wizard: 如何创建交易信号模块。
交易信号类通常是从 CExpertSignal 派生而来。接下来,你需要重写 LongCondition() 和 ShortCondition() 虚方法,以便实现你自己的逻辑。
在这里,我们将重点介绍基于“牛市/熊市会晤线”反转蜡烛图形态的信号,这些信号由 CCI(商品通道指数)指标进行确认。交易信号模块基于 CCandlePattern 类,下面将详细介绍它的使用方法。
1. “会晤线”反转蜡烛图形态
1.1. 牛市会晤线
这一形态由两根蜡烛图(第一根为下跌,第二根为上涨)组成,其收盘价相等(或非常接近)。这两根蜡烛的实体长度必须大于平均实体长度。
牛市会晤线形态表示下跌趋势的反转。

图1. 牛市会晤线形态
牛市会晤线的识别是在 CheckPatternBullishMeetingLines() 方法中实现的,具体实现方式如下:
//+--------------------------------------------------------------------+ //| 检查“牛市会晤线”蜡烛图形态的形成 | //+--------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishMeetingLines() { //--- 牛市会晤线 if((Open(2)-Close(2)>AvgBody(1)) && // 长黑 ((Close(1)-Open(1))>AvgBody(1)) && // 长白 (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // 十字星收盘 return(true); //--- return(false); }
在 CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) 方法中检查“牛市会晤线”蜡烛图形态的形成。
1.2. 熊市会晤线
这一形态由两根蜡烛图(第一根为上涨,第二根为下跌)组成,其收盘价相等(或非常接近)。这两根蜡烛的实体长度也必须大于平均实体长度。
熊市会晤线形态表示上涨趋势的反转。

图2. 熊市会晤线形态
熊市会晤线的识别是在 CheckPatternBearishMeetingLines() 方法中实现的,具体实现方式如下:
//+--------------------------------------------------------------------+ //| 检查“熊市会晤线”蜡烛图形态的形成 | //+--------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishMeetingLines() { //--- 熊市会晤线 if((Close(2)-Open(2)>AvgBody(1)) && // 长白 ((Open(1)-Close(1)>AvgBody(1)) && // 长黑 (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // 十字星收盘 return(true); //--- return(false); }
在 CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) 方法中检查“熊市会晤线”蜡烛图形态的形成。
2. 由 CCI 指标确认的交易信号
开多或空头头寸的交易信号必须由 CCI 指标确认。CCI 的值必须高于/低于关键水平(多头头寸为 -50,空头头寸为 50)。
已开头寸的平仓依赖于 CCI 的值,平仓条件有两个:
- 当 CCI 线达到相反的关键水平(多头头寸为 80,空头头寸为 -80)
- 当反向信号未得到确认(当 CCI 达到以下水平:多头头寸为 -80,空头头寸为 80)

图3. 牛市会晤线形态,由 CCI 指标确认
int CML_CCI::LongCondition()- 检查开多头寸的条件(返回 80)和空头头寸的平仓条件(返回 40);int CML_CCI::ShortCondition()- 检查开空头寸的条件(返回 80)和多头头寸的平仓条件(返回 40)。
2.1. 开多头寸/平空头寸
“牛市会晤线”形态必须由 CCI 指标确认:CCI(1)<-50(最后一根完成的 K 线的 CCI 值必须低于 -50)。
当 CCI 指标向上突破关键水平 -80 或向下突破关键水平 80 时,必须平掉空头头寸。
//+------------------------------------------------------------------+ //| 检查进出市场的条件 | //| 1) 市场进场(开多头寸,结果=80) | //| 2) 市场出场(平空头寸,结果=40) | //+------------------------------------------------------------------+ int CML_CCI::LongCondition() { int result=0; //--- idx可用于确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个 tick 中检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻 K 线中检查交易条件 int idx =StartIndex(); //--- 检查开多头寸的条件 //--- 牛市会晤线形态和 CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) && (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. 开空头寸/平多头寸
//+------------------------------------------------------------------+ //| 检查进出市场的条件 | //| 1) 市场进场(开空头寸,结果=80) | //| 2) 市场出场(平多头寸,结果=40) | //+------------------------------------------------------------------+ int CML_CCI::ShortCondition() { int result=0; //--- idx可用于确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个 tick 中检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻 K 线中检查交易条件 int idx =StartIndex(); //--- 检查开空头寸的条件 //--- 熊市会晤线形态和 CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) && (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 创建专家顾问
CML_CCI 类不包含在标准库类中,因此需要下载 acml_cci.mqh 文件(见附件)并将其保存到 client_terminal_data\MQL5\Include\Expert\Signal\MySignals 文件夹中。同样,candlepatterns.mqh 文件也需要如此。重启 MetaEditor 后,可以在 MQL5 Wizard 中使用这些文件。
要创建一个专家顾问,启动 MQL5 Wizard:

图4. 使用 MQL5 Wizard 创建专家顾问
接下来,我们需要指定专家顾问的名称:

图5. 专家顾问的一般属性
然后我们需要选择使用的交易信号模块。

图6. 专家顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加“基于牛市/熊市会晤线确认的 CCI”的交易信号模块:

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

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

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

图10. 专家顾问的资金管理属性
按下“完成”按钮后,我们会得到生成的专家顾问代码,位于 Expert_AML_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,测试周期:2000.01.01-2011.03.16,PeriodCCI=18,MA_period=3)上的专家顾问回测。
在创建专家顾问时,我们使用了固定的交易量(固定手数交易, 0.1),未使用追踪止损算法(未使用追踪)。

图11. 基于牛市/熊市会晤线 + CCI 的专家顾问测试结果
最佳输入参数组合可以通过 MetaTrader 5 客户端的策略测试器 找到。
由 MQL5 Wizard 创建的专家顾问代码附在 expert_aml_cci.mq5 中。