首页 系统交易 帖子

使用MQL5 Wizard创建基于晨星/晚星模式的交易信号与MFI指标

附件
323.zip (6.46 KB, 下载 0次)

MQL5 Wizard 可以帮助你快速创建基于标准库的现成交易系统(点击这里查看详情)。你只需创建自己的交易信号类,就能快速验证你的交易想法。该类的结构和示例可以在这篇文章中找到:MQL5 Wizard:如何创建交易信号模块

基本思路是:交易信号类继承自 CExpertSignal,接下来需要重写 LongCondition()ShortCondition() 这两个虚方法。

在一本名为《最佳交易者策略》(俄文)中,讨论了许多交易策略,我们将重点关注由 随机指标CCIMFIRSI 确认的反转蜡烛形态。

创建一个独立的类,继承自 CExpertSignal,用于检查蜡烛形态的形成是最佳方法。为了确认由蜡烛形态生成的交易信号,只需编写一个继承自 CCandlePattern 的类,并添加必要的特性(例如,通过振荡器确认)。

在这里,我们将考虑基于“晨星/晚星”(晨星十字星/晚星十字星)反转蜡烛形态的信号,并由 MFI 指标确认。交易信号模块基于 CCandlePattern 类,这是一个使用蜡烛形态创建交易信号的简单示例。

1. “晨星”和“晚星”反转蜡烛形态

1.1. 晨星

该形态表示下跌趋势的反转,由三根蜡烛组成(见图1)。在一根长的黑色蜡烛后,出现一根小身体的蜡烛(颜色无关紧要),该蜡烛位于黑色蜡烛的身体外部。小身体表示多头与空头的力量相当,市场准备改变趋势。

形态的第三根蜡烛是看涨蜡烛,其身体未与第二根蜡烛的身体重叠,收盘价位于第一根(看跌)蜡烛的身体内。该模型的结果蜡烛也绘制在图1中。

如果第二根蜡烛是十字星蜡烛,则该模型称为“晨星十字星”。

图1. 晨星和晨星十字星蜡烛形态

图1. “晨星”和“晨星十字星”蜡烛形态

“晨星”模式的识别在 CheckPatternMorningStar()CheckPatternMorningDoji() 方法中实现,这些方法属于 CCandlePattern 类:

//+------------------------------------------------------------------+
//| 检查“晨星”模式的形成                  |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningStar()
  {
//--- 晨星
   if((Open(3)-Close(3)>AvgBody(1))             && // 看跌蜡烛,其身体大于平均蜡烛身体
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // 第二根蜡烛具有小身体(小于平均身体的一半)
      (Close(2)<Close(3))                       && // 第二根蜡烛的收盘价低于第一根蜡烛的收盘价
      (Open(2)<Open(3))                         && // 第二根蜡烛的开盘价低于第一根蜡烛的开盘价
      (Close(1)>MidOpenClose(3)))                  // 最后一根已完成蜡烛的收盘价高于第一根的中心
      return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| 检查“晨星十字星”模式的形成               |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningDoji()
  {
//--- 晨星十字星
   if((Open(3)-Close(3)>AvgBody(1)) && // 看跌蜡烛,其身体大于平均蜡烛身体 
      (AvgBody(2)<AvgBody(1)*0.1)   && // 第二根蜡烛具有非常小的身体(十字星)
      (Close(2)<Close(3))           && // 第二根蜡烛的收盘价低于第一根蜡烛的收盘价
      (Open(2)<Open(3))             && // 第二根蜡烛的开盘价低于第一根蜡烛的开盘价
      (Open(1)>Close(2))             && // 最后一根已完成蜡烛的开盘价高于第二根蜡烛的收盘价
      (Close(1)>Close(2)))             // 最后一根已完成蜡烛的收盘价高于第二根蜡烛的收盘价
      return(true);
//---
   return(false);
  }

CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) 和 CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) 方法被用于检查“晨星”和“晨星十字星”蜡烛形态的形成。


1.2. 晚星

该形态表示上涨趋势的反转,由三根蜡烛组成(见图2)。在一根长的白色蜡烛后,出现一根小身体的蜡烛(颜色无关紧要),该蜡烛位于白色蜡烛的身体外部。小身体表示多头与空头的力量相当,市场准备改变趋势。

形态的第三根蜡烛是看跌蜡烛,其身体未与第二根蜡烛的身体重叠,收盘价位于第一根(看涨)蜡烛的身体内。该模型的结果蜡烛也绘制在图2中。

如果第二根蜡烛是十字星蜡烛,则该模型称为“晚星十字星”。

图2. 晚星和晚星十字星蜡烛形态

图2. “晚星”和“晚星十字星”蜡烛形态

以下是识别“晚星”和“晚星十字星”模式的方法:

//+------------------------------------------------------------------+
//| 检查“晚星”模式的形成                    |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningStar()
  {
//--- 晚星
   if((Close(3)-Open(3)>AvgBody(1))             && // 看涨蜡烛,其身体高于平均身体 
      (MathAbs(Close(2)-Open(2)<AvgBody(1*0.5) && // 第二根蜡烛具有小身体(小于平均蜡烛的一半)
      (Close(2)>Close(3))                   && // 第二根蜡烛的收盘价高于第一根蜡烛的收盘价
      (Open(2)>Open(3))                     && // 第二根蜡烛的开盘价高于第一根蜡烛的开盘价
      (Close(1)<MidOpenClose(3)))                  // 最后一根已完成蜡烛的收盘价低于第一根的中心
      return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| 检查“晚星十字星”模式的形成               |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningDoji()
  {
//--- 晚星十字星
   if((Close(3)-Open(3)>AvgBody(1)) && // 看涨蜡烛,其身体高于平均蜡烛 
      (AvgBody(2)<AvgBody(1)*0.1)   && // 第二根蜡烛具有非常小的身体(十字星) 
      (Close(2)>Close(3))           && // 第二根蜡烛的收盘价高于第一根蜡烛的收盘价
      (Open(2)>Open(3))             && // 第二根蜡烛的开盘价高于第一根蜡烛的开盘价
      (Open(1)<Close(2))              && // 最后一根已完成蜡烛的开盘价低于第二根蜡烛的收盘价
      (Close(1)<Close(2)))              // 最后一根已完成蜡烛的收盘价低于第二根蜡烛的收盘价
      return(true);
//---
   return(false);
  }

CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) 和 CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) 方法被用于检查“晚星”和“晚星十字星”蜡烛形态的形成。


2. 由MFI指标确认的交易信号

开多或空头仓位的交易信号必须由 MFI 指标确认。MFI指标的值必须低于40(对于多头仓位)或高于60(对于空头仓位)。

打开仓位的关闭取决于MFI指标的值。可以在两种情况下进行:

  1. 如果MFI达到了相反的临界水平(多头仓位为70,空头仓位为30)
  2. 如果反向信号未得到确认(当MFI指标达到以下水平:多头仓位为30,空头仓位为70)

图3. MFI指标确认的晨星模式

图3. MFI指标确认的“晨星”模式


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

2.1. 开多仓位/关闭空仓位

  1. “晨星”模式的形成必须由 MFI 指标确认:MFi(1)<40(最后一根已完成蜡烛的MFI指标值必须小于40)。

  2. 如果 MFI 指标向上突破临界水平(70或30),则必须关闭空仓位。

//+------------------------------------------------------------------+
//| 检查市场进出条件                 |
//| 1) 市场进场(开多仓位,结果=80)                  |
//| 2) 市场出场(关闭空仓位,结果=40)                 |
//+------------------------------------------------------------------+
int CMS_ES_MFI::LongCondition()
  {
   int result=0;
//--- idx 用于确定专家顾问的工作模式
//--- idx=0 - 在这种情况下,EA在每个滴答时检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻蜡烛时检查交易条件
  int idx   =StartIndex();
//--- 检查开多仓位的条件
//--- 晨星模式的形成和MFI<40
  if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (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 CMS_ES_MFI::ShortCondition()
  {
   int result=0;
//--- idx 用于确定专家顾问的工作模式
//--- idx=0 - 在这种情况下,EA在每个滴答时检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻蜡烛时检查交易条件
  int idx   =StartIndex();
//--- 检查开空仓位的条件
//--- 晚星模式的形成和MFI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (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创建专家顾问

CMS_ES_MFI 类不包含在标准库类中,使用前需要下载 ams_es_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. 专家顾问的资金管理属性

点击“完成”按钮后,我们将获得生成的专家顾问代码,位于 terminal_data_folder\MQL5\Experts\Expert_AMS_ES_MFI.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 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=49,MA_period=3)上对专家顾问进行回测。

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

图11. 基于晨星/晚星 + MFI的专家顾问测试结果

图11. 基于晨星/晚星 + MFI的专家顾问测试结果


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

由MQL5 Wizard创建的专家顾问代码已附在 expert_ams_es_mfi.mq5 文件中。


相关帖子

评论 (0)