大家好!今天我们来聊聊如何利用MQL5 Wizard创建一个基于吞没形态和CCI指标的交易信号的智能交易系统(EA)。这个工具可以帮助我们快速验证交易想法,下面我将为大家详细介绍如何操作。
这个过程主要是通过创建一个交易信号类来实现的。这个类需要从CExpertSignal派生,并重写其中的LongCondition()和ShortCondition()方法,以满足我们自己的需求。
1. 吞没形态(Bullish Engulfing 和 Bearish Engulfing)
1.1. Bullish Engulfing
Bullish Engulfing模式通常出现在下跌趋势中,形态由一个小的黑色蜡烛跟随一个完全吞没它的白色蜡烛形成。小蜡烛的影线(尾巴)较短,使得大蜡烛的实体能够完全覆盖前一日的蜡烛。

图1. Bullish Engulfing蜡烛图形态
在CCandlePattern类中,我们通过CheckPatternBullishEngulfing()方法来识别Bullish Engulfing模式。
//+------------------------------------------------------------------+ //| 检查Bullish Engulfing蜡烛图形态 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishEngulfing() { //--- Bullish Engulfing if((Open(2)>Close(2)) && // 前一根蜡烛是看跌 (Close(1)-Open(1)>AvgBody(1)) && // 看涨蜡烛的实体大于平均值 (Close(1)>Open(2)) && // 看涨蜡烛的收盘价高于看跌蜡烛的开盘价 (MidOpenClose(2)<CloseAvg(2)) && // 确保处于下跌趋势 (Open(1)<Close(2))) // 看涨蜡烛的开盘价低于看跌蜡烛的收盘价 return(true); //--- return(false); }
在CCandlePattern类中,我们使用CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING)方法来检查Bullish Engulfing形态的形成。
1.2. Bearish Engulfing
Bearish Engulfing模式出现在上涨趋势中,形态由一个小的白色蜡烛跟随一个完全吞没它的大黑蜡烛形成。小蜡烛的影线(尾巴)较短,使得大蜡烛的实体能够完全覆盖前一日的蜡烛。

图2. Bearish Engulfing蜡烛图形态
在CCandlePattern类中,通过CheckPatternBearishEngulfing()方法识别Bearish Engulfing模式。
//+------------------------------------------------------------------+ //| 检查Bearish Engulfing蜡烛图形态 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishEngulfing() { //--- Bearish Engulfing if((Open(2)<Close(2)) && // 前一根蜡烛是看涨 (Open(1)-Close(1)>AvgBody(1)) && // 看跌蜡烛的实体大于平均值 (Close(1)<Open(2)) && // 看跌蜡烛的收盘价低于看涨蜡烛的开盘价 (MidOpenClose(2)>CloseAvg(2)) && // 确保处于上涨趋势 (Open(1)>Close(2))) // 看跌蜡烛的开盘价高于看涨蜡烛的收盘价 return(true); //--- return(false); }
在CCandlePattern类中,我们使用CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING)方法来检查Bearish Engulfing形态的形成。
2. 交易信号确认与CCI指标
在开仓或者平仓时,我们需要用到CCI指标来确认交易信号。当CCI的值高于50时,我们可以开短仓;低于-50时,可以开多仓。
平仓的条件有两个:
- 当CCI到达相反的临界水平时(多仓为80,空仓为-80)
- 如果反向信号没有得到确认(当CCI到达-80或80时)

图3. 通过CCI指标确认Bullish Engulfing模式的交易信号
- int CBE_BE_CCI::LongCondition() - 检查开多仓的条件(返回80)和关闭空仓的条件(返回40);
- int CBE_BE_CCI::ShortCondition() - 检查开空仓的条件(返回80)和关闭多仓的条件(返回40)。
2.1. 开多仓/平空仓
Bullish Engulfing形态必须被CCI指标确认:CCI(1)<-50(最后一根完成的蜡烛的CCI值必须小于-50)。
如果CCI指标穿越了临界水平-80向上,或穿越了80向下,则平空仓。
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场进入(开多仓,结果=80) | //| 2) 市场退出(平空仓,结果=40) | //+------------------------------------------------------------------+ int CBE_BE_CCI::LongCondition() { int result=0; //--- idx用于确定EA工作模式 //--- idx=0 - EA每次tick时检查交易条件 //--- idx=1 - EA仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开多仓条件 //--- Bullish Engulfing形态和CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (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. 开空仓/平多仓
Bearish Engulfing形态必须被CCI指标确认:CCI(1)>50(最后一根完成的蜡烛的CCI值必须大于50)。
如果CCI指标穿越了-80或80水平向下,则平多仓。
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场进入(开空仓,结果=80) | //| 2) 市场退出(平多仓,结果=40) | //+------------------------------------------------------------------+ int CBE_BE_CCI::ShortCondition() { int result=0; //--- idx用于确定EA工作模式 //--- idx=0 - EA每次tick时检查交易条件 //--- idx=1 - EA仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开空仓条件 //--- Bearish Engulfing形态和CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (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创建智能交易系统
CBE_BE_CCI类不在标准库中,要使用它需要下载acbe_be_cci.mqh文件(见附件),并将其保存到client_terminal_data\MQL5\Include\Expert\Signal\MySignals文件夹中。candlepatterns.mqh文件也需同样处理。重启MetaEditor后即可在MQL5 Wizard中使用。
创建智能交易系统的步骤如下:

图4. 创建智能交易系统步骤
接下来,指定智能交易系统的名称:

图5. 智能交易系统的基本属性
接下来选择所用的交易信号模块。

图6. 智能交易系统的信号属性
在我们的案例中,我们只使用一个交易信号模块。
添加“基于吞没形态与CCI的交易信号”模块:

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

图8. 智能交易系统的信号属性
可以选择任何跟踪属性,但我们将使用“不使用跟踪止损”:

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

图10. 智能交易系统的资金管理属性
按下“完成”按钮后,我们将获得生成的智能交易系统代码,位置为Expert_ABE_BE_CCI.mq5,保存于terminal_data_folder\MQL5\Experts\。
生成的智能交易系统的默认输入参数:
//--- 交易信号的输入参数 input int Signal_ThresholdOpen =10; // 开仓信号阈值 input int Signal_ThresholdClose =10; // 平仓信号阈值 input double Signal_PriceLevel =0.0; // 执行交易的价格水平 input double Signal_StopLevel =50.0; // 止损水平(点数) input double Signal_TakeLevel =50.0; // 盈利水平(点数)
需要替换为:
//--- 交易信号的输入参数 input int Signal_ThresholdOpen =40; // 开仓信号阈值 input int Signal_ThresholdClose =20; // 平仓信号阈值 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生成的智能交易系统会根据交易信号模块的“投票”来开平仓。主模块的投票结果也会被用于“投票”平均化。在我们的案例中:主模块 + 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=49,MA_period=11)回测智能交易系统的结果。
在创建智能交易系统时,我们使用了固定的交易量(固定交易手数,0.1),未使用跟踪止损算法(未使用跟踪)。

图11. 基于吞没形态与CCI的智能交易系统回测结果
最佳的输入参数组合可以通过MetaTrader 5策略测试器找到。
通过MQL5 Wizard创建的智能交易系统代码已附在expert_abe_be_cci.mq5中。