首页 系统交易 帖子

使用MQL5 Wizard创建基于移动平均线交叉和ADX确认的交易信号

附件
258.zip (3.23 KB, 下载 0次)

MQL5 Wizard 允许自动创建专家顾问(EA)的代码。在 MQL5 Wizard创建现成的专家顾问 里可以找到更多细节。

今天,我们将讨论一种基于移动平均线交叉的交易策略,并且通过ADX指标进行确认。这种策略被称为 “基于移动平均线交叉及ADX确认的交易信号” (在MQL5 Wizard中自动创建EA时使用的名称)。

交易信号:

  • 买入:最近完成的K线收盘价高于移动平均线,且当前和最近完成的K线移动平均线均在上升。
  • 卖出:最近完成的K线收盘价低于移动平均线,且当前和最近完成的K线移动平均线均在下降。
  • 为了过滤虚假信号,需检查趋势强度(ADX > ADXmin)和趋势方向,使用方向性运动指标(DI+和DI-)进行确认。

该策略在 CSignalADX_MA 类中实现(需要将其放置在 terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh)。

基于移动平均线交叉的交易信号图示,确认通过ADX

基于移动平均线交叉的交易信号图示,确认通过ADX

交易信号细节

该交易策略在 CSignalADX_MA 类中实现,包含一些保护方法,以简化对指标和价格值的访问:

double   PlusADX(int ind)     // 返回K线的DI+值
double   MainADX(int ind)     // 返回K线的主线值
double   MinusADX(int ind)    // 返回K线的DI-值
double   EMA(int ind)         // 返回K线的移动平均值
double   Close(int ind)       // 返回K线的收盘价
double   StateADX(int ind)    // 返回DI+和DI-之间的差值
double   StateEMA(int ind)    // 返回EMA的变化(正值为上升,负值为下降)
double   StateClose(int ind)  // 返回收盘价与移动平均线的差值
此实现的特点是额外检查趋势存在(使用方向性运动指标),可以过滤虚假信号并使用当前(未完成)K线的值检查交易条件。

1. 开仓条件

开多仓的条件:

  1. StateEMA(0) < 0 且 StateEMA(1) > 0:移动平均线当前和最近完成K线在上升;
  2. StateClose(1) > 0:最近完成K线的收盘价高于移动平均线;
  3. MainADX(0) > minimum_ADX:当前K线的ADX值大于指定的最小值(用于检查趋势存在);
  4. StateADX(0) > 0:当前K线的DI+大于DI-。
//+------------------------------------------------------------------+
//| 检查开多仓条件                    |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- 条件1:移动平均线在当前和最近完成K线上升
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- 条件2:最近完成K线的收盘价高于移动平均线
   bool Buy_Condition_2=(StateClose(1)>0);
//--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值)
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- 条件4:当前K线的DI+大于DI-
    bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
   sl   =m_symbol.Ask()-m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Ask()+m_take_profit*m_adjusted_point;
//--- 检查所有条件
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

2. 平仓条件

平多仓的条件:

  1. StateEMA(0) < 0 且 StateEMA(1) < 0:移动平均线在当前和最近完成K线上下降;
  2. StateClose(1) < 0:最近完成K线的收盘价低于移动平均线;
  3. MainADX(0) > minimum_ADX:当前K线的ADX值大于指定的最小值(趋势阈值);
  4. StateADX(0) < 0:当前K线的DI-大于DI+。
//+------------------------------------------------------------------+
//| 检查平多仓条件                         |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
//--- 条件1:移动平均线在当前和最近完成K线上下降
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- 条件2:最近完成K线的收盘价低于移动平均线
   bool Sell_Condition_2=(StateClose(1)<0);
//--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值)
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- 条件4:当前K线的DI-大于DI+
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
//--- 检查所有条件
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

3. 开空仓条件

开空仓的条件与平多仓的条件相同。

//+------------------------------------------------------------------+
//| 检查开空仓条件(卖出)                  |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- 条件1:移动平均线在当前和最近完成K线上下降 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- 条件2:最近完成K线的收盘价低于移动平均线 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- 条件4:当前K线的DI-大于DI-
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
   sl   =m_symbol.Bid()+m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Bid()-m_take_profit*m_adjusted_point;
//--- 检查所有条件
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

4. 平空仓条件

平空仓的条件与开多仓的条件相同。

//+------------------------------------------------------------------+
//| 检查平空仓条件                        |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
//--- 条件1:移动平均线在当前和最近完成K线上升
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- 条件2:最近完成K线的收盘价高于移动平均线
   bool Buy_Condition_2=(StateClose(1)>0);
//--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值)
    bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- 条件4:当前K线的DI+大于DI-
   bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
//--- 检查所有条件
  return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

使用MQL5 Wizard创建专家顾问

要基于该策略创建交易机器人,您需要在 “创建现成的专家顾问” 选项中选择信号属性为 “基于移动平均线交叉及ADX确认的信号”,该选项在MQL5 Wizard 中可以找到:

选择“基于移动平均线交叉及ADX确认的信号”在MQL5 Wizard中

选择“基于移动平均线交叉及ADX确认的信号”在MQL5 Wizard中

接下来,您需要指定所需的 移动止损 算法和 资金和风险管理 系统。EA的代码将自动创建,您可以在 MetaTrader 5的策略测试器中编译和测试。


测试结果

让我们来看一下在历史数据上的EA回测结果(EURUSD H1,测试周期:2010年1月1日-2011年5月1日,PeriodADX=33,MinimumADX=22,PeriodMA=39,StopLoss=400,TakeProfit=900)。

在创建EA时,我们使用了固定的交易量(固定手数交易,0.1),未使用移动止损算法(未使用移动止损)。

基于移动平均线交叉及ADX确认的EA的历史回测结果

基于移动平均线交叉及ADX确认的EA的历史回测结果


附加文件: SignalADX-MA.mqh 文件与 CSignalADX_MA 类需放置在 terminal_data_folder\MQL5\Include\Expert\Signal\ 中。
ma_crossover_adx.mq5 包含通过MQL5 Wizard创建的EA代码。


相关帖子

评论 (0)