大家好,今天我们来聊聊如何使用MQL5 Wizard来创建基于吞没形态和RSI指标的交易信号。这个工具可以帮助我们快速生成交易系统,尤其适合那些想要验证交易思路的朋友。
在使用MQL5 Wizard之前,我们需要了解如何创建自己的交易信号类。关于这一点的详细信息可以参考MQL5 Wizard: 如何创建交易信号模块。基本思路是,我们的交易信号类需要继承自CExpertSignal。然后,我们需要重写LongCondition()和ShortCondition()这两个虚方法。
我们将重点讨论“看涨吞没”和“看跌吞没”这两种反转蜡烛形态,并结合RSI指标进行确认。这里我们将利用CCandlePattern类来实现信号的生成。
1. 吞没形态的识别
1.1. 看涨吞没
看涨吞没形态是在下跌趋势中形成的,当一根小黑蜡烛后面跟随一根大白蜡烛,且大蜡烛完全吞没了前一天的蜡烛。小蜡烛的影线较短,使得大蜡烛的实体能够覆盖前一天的蜡烛。

图1. 看涨吞没蜡烛形态
在CCandlePattern类中的CheckPatternBullishEngulfing()方法实现了看涨吞没形态的识别。
//+------------------------------------------------------------------+ //| 检查“看涨吞没”蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishEngulfing() { //--- 看涨吞没 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); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING)方法用于检查“看涨吞没”蜡烛形态的形成。
1.2. 看跌吞没
看跌吞没形态是在上涨趋势中形成的,当一根小白蜡烛后面跟随一根大黑蜡烛,且大蜡烛完全吞没了前一天的蜡烛。小蜡烛的影线较短,使得大蜡烛的实体能够覆盖前一天的蜡烛。

图2. 看跌吞没蜡烛形态
在CCandlePattern类中的CheckPatternBearishEngulfing()方法实现了看跌吞没形态的识别。
//+------------------------------------------------------------------+ //| 检查“看跌吞没”蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishEngulfing() { //--- 看跌吞没 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); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING)方法用于检查“看跌吞没”蜡烛形态的形成。
2. 通过RSI指标确认交易信号
要打开多头或空头头寸,交易信号必须经过RSI指标的确认。RSI值必须低于/高于关键水平(多头为40,空头为60)。
已开头寸的平仓取决于RSI的值,平仓可以在以下两种情况下进行:
- 如果RSI达到相反的关键水平(多头为70,空头为30)
- 如果反转信号未确认(当RSI达到以下水平时:多头为30,空头为70)

图3. 看涨吞没形态,RSI确认
- int CBE_BE_RSI::LongCondition() - 检查开多头条件(返回80)和平空头条件(返回40);
- int CBE_BE_RSI::ShortCondition() - 检查开空头条件(返回80)和平多头条件(返回40)。
2.1. 开多头/平空头
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1) 市场进场(开多头,结果=80) | //| 2) 市场出场(平空头,结果=40) | //+------------------------------------------------------------------+ int CBE_BE_RSI::LongCondition() { int result=0; //--- idx用于确定EA工作模式 //--- idx=0 - EA每个tick检查交易条件 //--- idx=1 - EA仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开多头条件 //--- 看涨吞没形态和RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (RSI(1)<40)) result=80; //--- 检查平空头条件 //--- 超买/超卖水平的信号线交叉(向上30,向上70) if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) result=40; //--- 返回结果 return(result); }
2.2. 开空头/平多头
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1) 市场进场(开空头,结果=80) | //| 2) 市场出场(平多头,结果=40) | //+------------------------------------------------------------------+ int CBE_BE_RSI::ShortCondition() { int result=0; //--- idx用于确定EA工作模式 //--- idx=0 - EA每个tick检查交易条件 //--- idx=1 - EA仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开空头条件 //--- 看跌吞没形态和RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (RSI(1)>60)) result=80; //--- 检查平多头条件 //--- 超买/超卖水平的信号线交叉(向下70,向下30) if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) result=40; //--- 返回结果 return(result); }
2.3. 使用MQL5 Wizard创建专家顾问
CBE_BE_RSI类不在标准库类中使用,要想使用它,需要下载acml_rsi.mqh文件(见附件)并将其保存到client_terminal_data\MQL5\Include\Expert\Signal\MySignals文件夹中。同样需要对acandlepatterns.mqh文件进行相同的操作。重启MetaEditor后即可在MQL5 Wizard中使用。
创建专家顾问的步骤如下:启动MQL5 Wizard:

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

图5. 专家顾问的基本属性
之后需要选择所用的交易信号模块。

图6. 专家顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加“基于RSI确认的看涨吞没/看跌吞没信号”交易信号模块:

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

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

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

图10. 专家顾问的资金管理属性
按下“完成”按钮后,我们将得到生成的专家顾问代码,保存在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.04,PeriodRSI=11,MA_period=5)。
在创建专家顾问时,我们使用了固定交易量(以固定手数交易,0.1),不使用跟踪止损算法(未使用跟踪)。

图11. 基于看涨吞没/看跌吞没+RSI的专家顾问测试结果
使用MetaTrader 5的策略测试器可以找到最佳的输入参数设置。
由MQL5 Wizard创建的专家顾问代码附在expert_abe_be_rsi.mq5中。
评论 0