首页 系统交易 帖子

使用MQL5 Wizard创建基于吞没形态和MFI的交易信号

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

在交易中,快速验证你的交易想法是至关重要的,而 MQL5 Wizard 就是一个很好的工具。通过它,你可以根据 标准库 创建现成的交易系统(详见 在MQL5 Wizard中创建现成的交易系统)。只需创建自己的交易信号类,即可快速检查你的交易策略。

通用的思路是:交易信号类源自 CExpertSignal,接下来,你需要重写 LongCondition()ShortCondition() 的虚方法。

在一本名为 “最佳交易者的策略”(俄文)的书中,讨论了许多交易策略,我们将重点关注吞没形态的反转烛台模式,并结合 随机指标CCIMFIRSI 等振荡器确认信号。

最佳的方法是创建一个单独的类,该类派生自 CExpertSignal,用于检查烛台模式的形成。为了确认由烛台模式生成的交易信号,只需编写一个派生自 CCandlePattern 的类,并在其中添加必要的特性(例如,通过振荡器确认信号)。

1. 吞没形态的反转烛台模式

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. 看跌吞没烛台形态

图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. 由MFI指标确认的交易信号

交易信号的开启必须得到 MFI 指标的确认。对于开多单,MFI值需低于40;对于开空单,MFI值需高于60。

关闭已开仓位的条件取决于MFI指标的值,具体有两种情况:

  • 如果MFI达到了相反的临界水平(多单为70,空单为30)
  • 如果反向信号未被确认(当MFI指标达到以下水平时:多单为30,空单为70)

图3. 看涨吞没模式,经MFI指标确认

图3. 看涨吞没模式,经MFI指标确认

  • int CBE_BE_MFI::LongCondition() - 检查开启多单的条件(返回80)和关闭空单的条件(返回40);
  • int CBE_BE_MFI::ShortCondition() - 检查开启空单的条件(返回80)和关闭多单的条件(返回40)。

2.1. 开多单/关闭空单

  1. “看涨吞没”模式的形成必须得到 MFI 指标的确认:MFI(1)<40(最近完成的烛台的MFI指标值必须低于40)。

  2. 如果 MFI 指标上穿临界水平(70或30),则必须关闭空单。

//+------------------------------------------------------------------+
//| 检查进出市场的条件                 |
//| 1) 进场(开多单,结果=80)                  |
//| 2) 出场(关闭空单,结果=40)                 |
//+------------------------------------------------------------------+
int CBE_BE_MFI::LongCondition()
  {
   int result=0;
//--- idx用于确定专家顾问工作模式
//--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件
   int idx   =StartIndex();
//--- 检查开多单的条件
//--- 看涨吞没形态和MFI<40
  if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (MFI(1)<40))
     result=80;
//--- 检查关闭空单的条件
//--- 信号线交叉超买/超卖水平(上穿30,上穿70)
  if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70)))
     result=40;
//--- 返回结果
   return(result);
  }


2.2. 开空单/关闭多单

  1. “看跌吞没”模式的形成必须得到 MFI 指标的确认:MFI(1)>60(最近完成的烛台的MFI指标值必须大于60)。

  2. 如果 MFI 指标上穿临界水平(70或30),则必须关闭多单。

//+------------------------------------------------------------------+
//| 检查进出市场的条件                 |
//| 1) 进场(开空单,结果=80)                 |
//| 2) 出场(关闭多单,结果=40)                  |
//+------------------------------------------------------------------+
int CBE_BE_MFI::ShortCondition()
  {
   int result=0;
//--- idx用于确定专家顾问工作模式
//--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件
   int idx   =StartIndex();
//--- 检查开空单的条件
//--- 看跌吞没形态和MFI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (MFI(1)>60))
     result=80;
//--- 检查关闭多单的条件
//--- 信号线交叉超买/超卖水平(上穿70,下穿30)
   if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30)))
     result=40;
//--- 返回结果
   return(result);
  }


2.3. 使用MQL5 Wizard创建专家顾问

CBE_BE_MFI类未包含在标准库中,使用前需要下载 abe_be_mfi.mqh 文件(见附件),并将其保存到 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals。对于 acandlepatterns.mqh 文件也需如此。重启MetaEditor后,你可以在MQL5 Wizard中使用它。

要创建一个专家顾问,请启动 MQL5 Wizard

图4. 使用MQL5 Wizard创建专家顾问

图4. 使用MQL5 Wizard创建专家顾问

接下来,请指定专家顾问的名称:

图5. 专家顾问的一般属性

图5. 专家顾问的一般属性

然后选择所使用的交易信号模块。

图6. 专家顾问的信号属性

图6. 专家顾问的信号属性

在我们的案例中,我们只使用一个交易信号模块。
添加“基于看涨吞没/看跌吞没且由MFI确认”的交易信号模块:

图7. 专家顾问的信号属性

图7. 专家顾问的信号属性

交易信号模块已添加:

图8. 专家顾问的信号属性

图8. 专家顾问的信号属性

你可以选择任何跟随属性,但我们将使用“未使用跟随止损”:

图9. 专家顾问的跟随属性

图9. 专家顾问的跟随属性

关于资金管理属性,我们将使用“固定交易量交易”:

图10. 专家顾问的资金管理属性

图10. 专家顾问的资金管理属性

通过按下“完成”按钮,我们将得到生成的专家顾问代码,位于 Expert_ABE_BE_MFI.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.16,PeriodMFI=37,MA_period=5)。

在创建专家顾问时,我们使用了固定的交易量(固定交易量交易,0.1),未使用跟随止损算法(未使用跟随)。

图11. 基于看涨吞没/看跌吞没 + MFI的专家顾问测试结果

图11. 基于看涨吞没/看跌吞没 + MFI的专家顾问测试结果


使用MetaTrader 5客户端的策略测试器可以找到最佳的输入参数设置。

由MQL5 Wizard创建的专家顾问代码附在 expert_abe_be_mfi.mq5 中。


相关帖子

评论 (0)