首页 系统交易 帖子

使用MQL5 Wizard创建基于暗云盖与刺透形态的交易信号EA

大家好!今天我们来聊聊如何利用MQL5 Wizard来创建基于标准库类的现成交易顾问(EA)。这个工具能够快速检验你的交易想法,你只需创建自己的交易信号类即可。关于这个类的结构和示例可以参考MQL5 Wizard: 如何创建交易信号模块这篇文章。

基本思路是:交易信号类继承自CExpertSignal,然后你需要重写LongCondition()ShortCondition()这两个虚拟方法,添加你自己的逻辑。

有一本书《最佳交易者策略》(俄文),书中讨论了多种交易策略,我们将聚焦于反转蜡烛形态,结合随机指标CCIMFIRSI等振荡指标进行确认。

最好的做法是创建一个独立的类,继承自CExpertSignal,用于检查蜡烛形态的形成。为了确认由蜡烛形态生成的交易信号,只需编写一个继承自CCandlePattern的类,并添加必要的功能(例如,振荡指标确认)即可。

接下来,我们将讨论基于“暗云盖/刺透形态”的反转蜡烛形态,结合CCI指标进行确认。这个交易信号模块基于CCandlePattern类,是创建蜡烛形态交易信号的简单示例。


1. “暗云盖”和“刺透形态”的反转蜡烛形态

1.1. 暗云盖

这是一个出现在上涨趋势末尾的看跌蜡烛反转形态。第一天形成一根长白蜡烛,第二天出现缺口上涨,但第二天的收盘价低于第一天的中点。

暗云盖蜡烛形态

图1. 暗云盖蜡烛形态

“暗云盖”形态的识别在CCandlePattern类的CheckPatternDarkCloudCover()方法中实现。

//+------------------------------------------------------------------+
//| 检查“暗云盖”蜡烛形态的形成       |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternDarkCloudCover()
  {
//--- 暗云盖 
   if((Close(2)-Open(2)>AvgBody(1))  && // (长白蜡烛)
      (Close(1)<Close(2))            && // 
      (Close(1)>Open(2))             && // (收盘在前一根蜡烛体内)
      (MidOpenClose(2)>CloseAvg(1))  && // (上涨趋势)
      (Open(1)>High(2)))                // (在新高处开盘)
      return(true);
//---
   return(false);
  }

CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER)方法用于检查“暗云盖”蜡烛形态的形成。


1.2. 刺透形态

第二天的缺口下跌延续了下跌趋势,但第二天的收盘价高于第一天蜡烛体的中点。这表明空头可能形成底部。这个价格行为在蜡烛图上较为明显,而在条形图上则不易察觉。第二天收盘价越是深入第一天的蜡烛体,反转信号成功的可能性越大。

刺透形态

图2. 刺透形态

“刺透形态”的识别在CCandlePattern类的CheckPatternPiercingLine()方法中实现。

//+------------------------------------------------------------------+
//| 检查“刺透形态”蜡烛形态的形成          |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternPiercingLine()
  {
//--- 刺透形态
   if((Close(1)-Open(1)>AvgBody(1)) && // (长白蜡烛)
      (Open(2)-Close(2)>AvgBody(1)) && // (长黑蜡烛)
      (Close(1)>Close(2))           && //  
      (Close(1)<Open(2))            && // (收盘在前一根蜡烛体内) 
      (MidOpenClose(2)<CloseAvg(2)) && // (下跌趋势)
      (Open(1)<Low(2)))                // (在前一根蜡烛的低点开盘) 
      return(true);
//---
   return(false);
  }

CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE)方法用于检查“刺透形态”蜡烛形态的形成。


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

开启多头或空头仓位的交易信号必须由CCI指标确认。CCI的值必须高于/低于临界水平(多头仓位为-50,空头仓位为50)。

已开仓位的平仓取决于CCI的值。平仓可以在两种情况下进行:

  1. 如果CCI线达到相反的临界水平(多头80,空头-80)
  2. 如果反转信号未得到确认(当CCI达到以下水平时:多头-80,空头80)

暗云盖与CCI指标确认

图3. 暗云盖形态确认的CCI指标


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

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

  1. “刺透形态”的形成必须由CCI指标确认:CCI(1)<-50(最后一根完成蜡烛的CCI值必须小于-50)。

  2. 如果CCI指标向上穿越临界水平-80或向下穿越临界水平80,则必须关闭空头仓位。

//+------------------------------------------------------------------+
//| 检查进场及退场条件                 |
//| 1) 进场(开启多头仓位,结果=80)                |
//| 2) 退场(关闭空头仓位,结果=40)                 |
//+------------------------------------------------------------------+
int CDC_PL_CCI::LongCondition()
  {
   int result=0;
//--- idx可以用来确定EA工作模式
//--- idx=0 - 在这种情况下,EA在每个tick检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件
   int idx   =StartIndex();
//--- 检查开启多头仓位的条件
//--- “刺透形态”的形成和CCI<-50
   if(CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE) && (CCI(1)<-50))
     result=80;
//--- 检查关闭空头仓位的条件
//--- 信号线穿越超买/超卖水平(向下-80,向下-80)
   if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)<80) && (CCI(2)>80)))
     result=40;
//--- 返回结果
   return(result);
  }

2.2. 开启空头仓位/关闭多头仓位

  1. “暗云盖”的形成必须由CCI指标确认:CCI(1)>50(最后一根完成蜡烛的CCI值必须大于50)。

  2. 如果CCI指标向下穿越-80或80水平,则必须关闭多头仓位。

//+------------------------------------------------------------------+
//| 检查进场及退场条件                 |
//| 1) 进场(开启空头仓位,结果=80)                 |
//| 2) 退场(关闭多头仓位,结果=40)                  |
//+------------------------------------------------------------------+
int CDC_PL_CCI::ShortCondition()
  {
   int result=0;
//--- idx可以用来确定EA工作模式
//--- idx=0 - 在这种情况下,EA在每个tick检查交易条件
//--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件
   int idx   =StartIndex();
//--- 检查开启空头仓位的条件
//--- “暗云盖”的形成和CCI>50
   if(CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER) && (CCI(1)>50))
     result=80;
//--- 检查关闭多头仓位的条件
//--- 信号线穿越超买/超卖水平(向下-80,向上80)
   if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80)))
     result=40;
//--- 返回结果
   return(result);
  }


2.3. 使用MQL5 Wizard创建交易顾问

CDC_PL_CCI类并不包含在标准库类中,要使用它,需要下载acdc_pl_cci.mqh文件(见附件),并将其保存到client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals。candlepatterns.mqh文件也需要这样处理。重启MetaEditor后,就可以在MQL5 Wizard中使用它。

要创建一个交易顾问,请启动MQL5 Wizard

创建交易顾问

图4. 创建交易顾问

接下来,指定交易顾问的名称:

交易顾问的一般属性

图5. 交易顾问的一般属性

接下来,我们需要选择使用的交易信号模块。

交易顾问的信号属性

图6. 交易顾问的信号属性

在我们的案例中,我们只使用一个交易信号模块。
我们添加基于“暗云盖/刺透形态确认的CCI”的交易信号模块:

交易顾问的信号属性

图7. 交易顾问的信号属性

交易信号模块已添加:

交易顾问的信号属性

图8. 交易顾问的信号属性

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

交易顾问的跟踪属性

图9. 交易顾问的跟踪属性

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

交易顾问的资金管理属性

图10. 交易顾问的资金管理属性

按下“完成”按钮,我们将获得生成的交易顾问代码,位于Expert_ADC_PL_CCI.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,PeriodCCI=15,MA_period=19)上的交易顾问回测。

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

基于暗云盖/刺透形态 + CCI的交易顾问测试结果

图11. 基于暗云盖/刺透形态 + CCI的交易顾问测试结果


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

生成的交易顾问代码已附在expert_adc_pl_cci.mq5文件中。


相关帖子

评论 (0)