今天,我们来聊聊如何利用MQL5 Wizard创建基于牛市与熊市哈拉米形态的交易信号,同时结合RSI指标进行确认。这种方法可以帮助我们快速验证交易理念,构建属于自己的交易信号类。
要实现这一点,我们的交易信号类需要继承自CExpertSignal。接下来,我们需要重写LongCondition()和ShortCondition()这两个虚拟方法,以便实现自己的交易逻辑。
参考一本关于交易策略的书籍《最佳交易者的策略》,其中讨论了许多交易策略。我们将重点关注反转蜡烛形态,并通过RSI等指标进行确认。
1. 牛市与熊市哈拉米反转蜡烛形态
1.1 牛市哈拉米
牛市哈拉米反转形态通常出现在下跌趋势中,由一根大蜡烛后跟随一根小蜡烛,且小蜡烛的实体位于大蜡烛的实体范围内。这种形态提示我们下跌趋势可能会反转,是进入多头仓位的好时机。第二根蜡烛通常是向上跳空开盘的。
第二根(白色)蜡烛越小,反转的可能性越大。

图1. 牛市哈拉米蜡烛形态
“牛市哈拉米”形态的识别方法实现于CCandlePattern类中的CheckPatternBullishHarami()方法。
//+------------------------------------------------------------------+ //| 检查"牛市哈拉米"蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishHarami() { //--- 牛市哈拉米 if((Close(1)>Open(1)) && // 最后一根蜡烛是上涨的(白天) ((Open(2)-Close(2)>AvgBody(1)) && // 前一根蜡烛是下跌的,且其实体大于平均值(长黑) ((Close(1)<Open(2)) && // 牛市蜡烛的收盘价低于熊市蜡烛的开盘价 (Open(1)>Close(2))) && // 牛市蜡烛的开盘价高于熊市蜡烛的收盘价 (MidPoint(2)<CloseAvg(2))) // 下跌趋势 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI)方法用于检查“牛市哈拉米”蜡烛形态的形成。
1.2 熊市哈拉米
熊市哈拉米反转形态出现在上涨趋势中,由一根大蜡烛后跟随一根小蜡烛,且小蜡烛的实体位于大蜡烛的实体范围内。该形态提示我们上涨趋势可能会反转,是进入空头仓位的好时机。第二根蜡烛通常是向下跳空开盘的。
第二根(黑色)蜡烛越小,反转的可能性越大。

图2. 熊市哈拉米蜡烛形态
“熊市哈拉米”形态的识别方法实现于CCandlePattern类中的CheckPatternBearishHarami()方法。
//+------------------------------------------------------------------+ //| 检查"熊市哈拉米"蜡烛形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishHarami() { //--- 熊市哈拉米 if((Close(1)<Open(1)) && // 最后一根蜡烛是下跌的(黑天) ((Close(2)-Open(2)>AvgBody(1)) && // 前一根蜡烛是上涨的,且其实体大于平均值(长白) ((Close(1)>Open(2)) && // 熊市蜡烛的收盘价高于牛市蜡烛的开盘价 (Open(1)<Close(2))) && // 熊市蜡烛的开盘价低于牛市蜡烛的收盘价 (MidPoint(2)>CloseAvg(2))) // 上涨趋势 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI)方法用于检查“熊市哈拉米”蜡烛形态的形成。
2. 通过RSI指标确认的交易信号
打开多头或空头仓位的交易信号必须得到RSI指标的确认。RSI值需低于40(开多头)或高于60(开空头)。
平仓时机取决于RSI的值,主要有以下两种情况:
- 当RSI到达相反的临界水平(多头仓位70,空头仓位30)
- 当反转信号未能确认(RSI达到30(多头)或70(空头))

图3. 通过RSI确认的“牛市哈拉米”形态
- int CBH_BH_RSI::LongCondition() - 检查打开多头仓位的条件(返回80)和平空头仓位的条件(返回40);
- int CBH_BH_RSI::ShortCondition() - 检查打开空头仓位的条件(返回80)和平多头仓位的条件(返回40)。
2.1. 打开多头仓位/平空头仓位
//+------------------------------------------------------------------+ //| 检查市场的入场与出场条件 | //| 1) 市场入场(打开多头仓位,结果=80) | //| 2) 市场出场(平空头仓位,结果=40) | //+------------------------------------------------------------------+ int CBH_BH_RSI::LongCondition() { int result=0; //--- idx可以用于确定EA的工作模式 //--- idx=0 - EA在每个tick上检查交易条件 //--- idx=1 - EA仅在新闻蜡烛上检查交易条件 int idx =StartIndex(); //--- 检查打开多头仓位的条件 //--- 牛市哈拉米形态和RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (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 CBH_BH_RSI::ShortCondition() { int result=0; //--- idx可以用于确定EA的工作模式 //--- idx=0 - EA在每个tick上检查交易条件 //--- idx=1 - EA仅在新闻蜡烛上检查交易条件 int idx =StartIndex(); //--- 检查打开空头仓位的条件 //--- 熊市哈拉米形态和RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (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创建专家顾问
CBH_BH_RSI类不包含在标准库中,要使用它,需要下载acml_rsi.mqh文件(见附件),并将其保存在client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals文件夹中。acandlepatterns.mqh文件也应如此处理。在重启MetaEditor后,可以在MQL5 Wizard中使用。
要创建一个专家顾问,启动MQL5 Wizard:

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

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

图6. 专家顾问的信号属性
在我们的案例中,我们只使用一个交易信号模块。
添加“基于牛市与熊市哈拉米形态确认的信号”交易信号模块:

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

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

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

图10. 专家顾问的资金管理属性
按下“完成”按钮后,我们将获取生成的专家顾问代码,该代码位于Expert_ABH_BH_RSI.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,测试周期:2010.01.01-2011.03.11,PeriodRSI=37,MA_period=7)上的专家顾问回测。
在创建专家顾问时,我们使用了固定交易量(固定手数交易,0.1),未使用移动止损算法(未使用移动止损)。

图11. 基于牛市与熊市哈拉米形态的专家顾问测试结果
最佳输入参数集可以通过MetaTrader 5客户端的策略测试器找到。
使用MQL5 Wizard创建的专家顾问代码已附在expert_aml_rsi.mq5中。