在交易过程中,MQL5向导可以帮助我们快速创建基于标准库类的专家顾问(EA)。这个工具不仅能节省我们的时间,还是验证交易理念的好帮手。需要做的就是创建自己的交易信号类,具体结构和示例可以参考MQL5向导:如何创建交易信号模块。
基本思路是,从CExpertSignal派生出交易信号类,然后重写LongCondition()和ShortCondition()这两个虚方法,以便实现我们的交易逻辑。
我们将重点关注反转蜡烛形态,特别是三只乌鸦和三只白兵形态,并使用相对强弱指数(RSI)进行确认。
1. 三只乌鸦与三只白兵反转蜡烛形态
1.1 三只乌鸦
三只乌鸦是一个看跌蜡烛形态,用于预测当前上涨趋势的反转。该形态由三根连续的长实体蜡烛组成,每根蜡烛的收盘价都低于前一根蜡烛的收盘价,并且每次开盘都在前一根蜡烛的实体内。

图 1. 三只乌鸦蜡烛形态
在CCandlePattern类中的CheckPatternThreeBlackCrows方法可以识别三只乌鸦形态,代码如下:
//+------------------------------------------------------------------+ //| 检查三只乌鸦蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeBlackCrows() { //--- 3 Black Crows if((Open(3)-Close(3)>AvgBody(1)) && (Open(2)-Close(2)>AvgBody(1)) && (Open(1)-Close(1)>AvgBody(1)) && (MidPoint(2)3)) && (MidPoint(1) 2))) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS)方法用于检查三只乌鸦蜡烛形态的形成。
1.2 三只白兵蜡烛形态
三只白兵是一个看涨蜡烛形态,用于预测当前下跌趋势的反转。该形态由三根连续的长实体蜡烛组成,每根蜡烛的收盘价高于前一根蜡烛,并且每次开盘都在前一根蜡烛的实体内。

图 2. 三只白兵蜡烛形态
识别三只白兵形态的方法如下:
//+------------------------------------------------------------------+ //| 检查三只白兵蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeWhiteSoldiers() { //--- 3 White Soldiers if((Close(3)-Open(3)>AvgBody(1)) && (Close(2)-Open(2)>AvgBody(1)) && (Close(1)-Open(1)>AvgBody(1)) && (MidPoint(2)>MidPoint(3)) && (MidPoint(1)>MidPoint(2))) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS)方法用于检查三只白兵蜡烛形态的形成。
2. 由RSI指标确认的交易信号
要打开多头或空头头寸,必须由RSI指标确认交易信号。RSI的值必须低于40(多头)或高于60(空头)。
关闭头寸的条件取决于RSI的值,主要有两种情况:
- 如果RSI达到相反的临界水平(多头70,空头30);
- 如果反转信号未得到确认(当RSI达到以下水平:多头30,空头70)。

图 3. 三只乌鸦蜡烛形态,RSI指标确认
- int CML_RSI::LongCondition() - 检查打开多头头寸的条件(返回80),并关闭空头头寸(返回40);
- int CML_RSI::ShortCondition() - 检查打开空头头寸的条件(返回80),并关闭多头头寸(返回40)。
2.1 打开多头头寸/关闭空头头寸
三只白兵形态的形成必须由RSI指标确认:RSI(1)<40(最新完成的K线的RSI值必须小于40)。
如果RSI指标向上穿越70或30的临界水平,则必须关闭空头头寸。
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场进入(打开多头头寸,结果=80) | //| 2) 市场退出(关闭空头头寸,结果=40) | //+------------------------------------------------------------------+ int CBC_WS_RSI::LongCondition() { int result=0; //--- idx可以用来确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个跳动时检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻K线时检查交易条件 int idx =StartIndex(); //--- 检查打开多头头寸的条件 //--- 三只白兵形态和RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (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 打开空头头寸/关闭多头头寸
三只乌鸦形态的形成必须由RSI指标确认:RSI(1)>60(最新完成的K线的RSI值必须大于60)。
如果RSI指标向下穿越70或30的临界水平,则必须关闭多头头寸。
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场进入(打开空头头寸,结果=80) | //| 2) 市场退出(关闭多头头寸,结果=40) | //+------------------------------------------------------------------+ int CBC_WS_RSI::ShortCondition() { int result=0; //--- idx可以用来确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个跳动时检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻K线时检查交易条件 int idx =StartIndex(); //--- 检查打开空头头寸的条件 //--- 三只乌鸦形态和RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (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向导创建专家顾问
CML_RSI类不包含在标准库类中,使用前需下载acml_rsi.mqh文件(见附件),并将其保存到client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals中。也需对candlepatterns.mqh文件进行相同操作。重启MetaEditor后可以在MQL5向导中使用。
创建专家顾问时,启动MQL5向导:

图 4. 使用MQL5向导创建专家顾问
指定专家顾问的名称:

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

图 6. 专家顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加“基于三只乌鸦/三只白兵的信号”交易信号模块:

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

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

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

图 10. 专家顾问的资金管理属性
点击“完成”按钮后,我们将获得生成的专家顾问代码,保存在terminal_data_folder\MQL5\Experts\下的Expert_ABC_WS_RSI.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。
MQL5向导生成的专家顾问通过来自交易信号模块的“投票”来开仓和关仓。主模块的投票(作为容器,它包含所有添加的模块)也会使用,但其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.02.02,PeriodRSI=37,MA_period=51)上的专家顾问回测。
在创建专家顾问时,我们使用了固定的交易量(固定手数交易,0.1),未使用跟随止损算法(未使用跟随)。

图 11. 基于三只乌鸦/三只白兵 + RSI的专家顾问测试结果
通过MetaTrader 5客户端的策略测试器可以找到最佳的输入参数。
生成的专家顾问代码附在expert_abc_ws_rsi.mq5中。