首页 系统交易 帖子

使用MQL5向导创建基于三只乌鸦/三只白兵形态的RSI交易信号专家顾问

附件
288.zip (6.49 KB, 下载 0次)

在交易过程中,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)。

三只乌鸦蜡烛形态,RSI指标确认

图 3. 三只乌鸦蜡烛形态,RSI指标确认

  • int CML_RSI::LongCondition() - 检查打开多头头寸的条件(返回80),并关闭空头头寸(返回40);
  • int CML_RSI::ShortCondition() - 检查打开空头头寸的条件(返回80),并关闭多头头寸(返回40)。

2.1 打开多头头寸/关闭空头头寸

  1. 三只白兵形态的形成必须由RSI指标确认:RSI(1)<40(最新完成的K线的RSI值必须小于40)。

  2. 如果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 打开空头头寸/关闭多头头寸

  1. 三只乌鸦形态的形成必须由RSI指标确认:RSI(1)>60(最新完成的K线的RSI值必须大于60)。

  2. 如果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向导

使用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),未使用跟随止损算法(未使用跟随)。

基于三只乌鸦/三只白兵 + RSI的专家顾问测试结果

图 11. 基于三只乌鸦/三只白兵 + RSI的专家顾问测试结果

通过MetaTrader 5客户端的策略测试器可以找到最佳的输入参数。

生成的专家顾问代码附在expert_abc_ws_rsi.mq5中。

相关帖子

评论 (0)