请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

EA

MQL5向导 - 基于两条移动平均线带日内时间过滤的交易信号 - MetaTrader 5EA

MetaQuotes Software Corp. | Chinese English Русский Español Deutsch 日本語 Português

显示:
1729
等级:
投票: 27
已发布:
2013.10.01 13:28
已更新:
2016.11.22 07:33

MQL5 向导 允许自动创建EA 交易代码。详细信息参考 使用MQL5 向导快速创建EA交易

该策略的基于两条移动平均线的交易信号,包含在MQL5向导 - Trade Signals Based on Crossover of Two Exponentially Smoothed Moving Averages。均线交叉信号在单边趋势时是有效的,在其他情况下则提供了许多错误信号。改善策略的方法之一是使用时间过滤器(例如,只在欧洲外汇交易时段开新仓)。.

这里我们将考察基于两条指数平滑移动平均线(快速EMA和慢速EMA)交叉带日内时间过滤的策略。该策略名称为“Signals based on crossover of two EMA with intraday time filter” (当使用MQL5 向导自动创建EA 交易时可看到)

交易信号:

  • 多头开仓:快速EMA 向上交叉慢速EMA并且日内时间过滤条件满足。
  • 空头开仓:快速EMA向下交叉慢速EMA并且日内时间过滤条件满足。
基于指定时间段的信号过滤实现在CSignalITF类。作为它的一个实际用例,我们来考查CSignal2EMA_ITF类(它包含CSignalITF类对象))。

该交易系统基于挂单,价格水平取决于均线值,并使用了ATR单元(Average True Range)。

图1. 基于两条EMA交叉带日内时间过滤的交易信号

图1. 基于两条EMA交叉带日内时间过滤的交易信号

交易信号

交易策略在CSignal2EMA_ITF类实现, 它有一些受保护的方法可简化对指标和价格的访问:

 double  FastEMA(int ind)      // 返回某柱上的快速EMA值
 double  SlowEMA(int ind)      // 返回某柱上的慢速EMA值
 double  StateFastEMA(int ind) // 如果快速EMA增加/减少返回正值/负值
 double  StateSlowEMA(int ind) // 如果慢速EMA增加/减少返回正值/负值
 double  StateEMA(int ind)     // 返回快速和慢速EMA的差值
 double  ATR(int ind)          // 返回当前柱上ATR值


这个系统的特点是:交易依赖于输入参数Limit。依赖其不同符号有不同情况:

  1. Limit>0. 当出现均线虚假突破时,以优于市场价格的价格回测方向入市(Buy Limit和Sell Limit根据交易信号下单)。
  2. Limit<0. 将在价格前进方向入市 (Buy Stop和Sell Stop根据交易信号下单)。
  3. Limit=0. 这种情况下,将采用市价成交。


1. 多头开仓

检查多头开仓的条件:是否前一结束柱子上的快速和慢速EMA的差值从负值变成正值(StateEMA(1)>0 && StateEMA(2)<0)。

接着,通过调用CSignalITF类的CheckOpenLong()方法检查日内时间过滤条件。如果交易允许,它将计算基准价格水平(均线值)和前一结束柱子上ATR范围的值。

根据Limit输入参数的符号,将下买入挂单。订单价格,盈利和止损水平由基准价格水平相对计算而得(以ATR为单位)。订单到期时间由输入参数Expiration定义 (以柱子个数为单位) 。

//+------------------------------------------------------------------+
//| 检查多头开仓的条件 (买入)                                           |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)>0 && StateEMA(2)<0))                    return(false);
   if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
   sl   =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp   =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

2. 多头平仓

在我们例子中的函数,即检查多头平仓的条件,总是返回false,即假定通过盈利或止损来多头平仓。如果需要,你可以自己编写代码来实现此方法。

//+------------------------------------------------------------------+
//| 检查多头平仓的条件                                                 |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseLong(double& price)
  {
   return(false);
  }


3. 空头开仓

检查空头开仓的条件:是否前一结束柱子上的快速和慢速EMA的差值从正值变成负值 (StateEMA(1)<0 && StateEMA(2)>0).

接着,通过调用CSignalITF类的CheckOpenLong()方法检查日内时间过滤条件。如果交易允许,它将计算基准价格水平(均线值)和前一结束柱子上ATR范围的值。

Depending on sign of the Limit input parameter it will place the sell pending order. 订单价格,盈利和止损水平由基准价格水平相对计算而得(以ATR为单位)。订单到期时间由输入参数Expiration定义 (以柱子个数为单位) 。

//+------------------------------------------------------------------+
//| 检查空头开仓的条件 (卖出)                                           |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)<0 && StateEMA(2)>0))                     return(false);
   if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price      =m_symbol.NormalizePrice(ema+m_limit*atr);
   sl         =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp         =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

4. 空头平仓

在我们例子中的函数,即检查空头平仓的条件,总是返回false,即假定通过盈利或止损来空头平仓。如果需要,你可以自己编写代码来实现此方法。

//+------------------------------------------------------------------+
//| 检查空头平仓的条件                                                  |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseShort(double& price)
  {
   return(false);
  }


5. 买入挂单的追踪止损

该EA交易会根据均线和ATR的当前值移动挂单。

交易系统将根据交易信号下挂单。如果订单已下成功,它将沿着均线追踪挂单。如果市场价格到达挂单价格,挂单将被执行。
//+--------------------------------------------------------------------+
//| 检查修改买入挂单的条件                                                |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
//---
   return(true);
  }


6. 卖出挂单的追踪止损

该EA交易会根据均线和ATR的当前值移动挂单。

如果市场价格到达挂单价格,挂单将被执行。

//+--------------------------------------------------------------------+
//| 检查修改卖出挂单的条件                                                |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price=m_symbol.NormalizePrice(ema+m_limit*atr);
//---
   return(true);
  }

使用MQL5向导创造EA 交易

要基于该策略创建交易程序,你需要在 MQL5向导的 "快速创建EA交易" 选项 "中选择信号属性为" Signals based on crossover of two EMA with intraday time filter":

图2. 在MQL5 向导中选择 "Signals based on crossover of two EMA with intraday time filter"

图2. 在MQL5 向导中选择 "Signals based on crossover of two EMA with intraday time filter"

接下来你必须指定所需要的 移动止损 算法和 货币风险管理系统。EA 交易代码将被自动创建,你可以对它编译然后在MetaTrader 5客户端的策略测试中对其测试。


测试结果

让我们来考察EA交易在历史数据(EURUSD H1,自定义时段:1.1.2010-05.01.2011,  PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0)上的回归测试。

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

图3. 使用基于两条EMA 交叉不带时间过滤的交易信号的EA交易的测试结果

图3. 使用基于两条EMA 交叉不带时间过滤的交易信号的EA交易的测试结果

没有使用日内过滤,所以有许多错误信号。如果根据交易时间对交易结果分析,交易信号则可被改善。

在我们的案例中,我们发现从6:00至23:59两个EMA的交叉提供了许多错误的信号。我们可通过设置过滤参数来指定日内时间过滤条件。

例如,我们可以指定时间过滤条件为只允许从0:00至5点59分开仓。可通过设置BadHoursOfDay的值为16777152=111111111111111111000000b来实现。所有其它的交易时间是“不好的”,所以最好从6:00直到一天结束禁止开新仓。

如果我们设置BadHoursOfDay值为16777152 ,可以过滤许多错误信号:

图4. 使用基于两条EMA 交叉带时间过滤的交易信号的EA交易的测试结果(BadHoursofDay=16777152)

图4. 使用基于两条EMA 交叉带时间过滤的交易信号的EA交易的测试结果(BadHoursofDay=16777152)


CSignalITF提供了很多其它时间过滤功能(指定任一小时内“好”和“不好”的分钟值,任一天内的“好”和“不好”的小时值,任一周内“好”与“不好”的天值)。

时间过滤器的使用可以改善交易信号,考虑了市场的流动性(例如,交易时间段特性)。

附件:定义CSignal2EMA_ITF 类 的Signal2EMA-ITF.mqh文件位于terminal_data_folder\MQL5\Include\Expert\Signal文件夹中.

文件expert_2ema_itf.mq5包含了由MQL5向导创建的EA交易的代码。


本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/264

MQL5向导 - 基于MACD指标主线和信号线交叉的交易信号 MQL5向导 - 基于MACD指标主线和信号线交叉的交易信号

基于MACD指标主线和信号线交叉的交易信号(CSignalMACD来自MQL5标准库)被考虑。基于该策略的EA交易的代码可以被MQL5向导自动生成

MQL5向导 - 基于三条移动平均线的交易信号 MQL5向导 - 基于三条移动平均线的交易信号

基于两条指数平滑移动平均线交叉的交易信号 被考虑。基于该策略的EA交易的代码可以被MQL5向导自动生成

MQL5 向导 - 基于 锤头 / 上吊线形态的交易信号 + CCI MQL5 向导 - 基于 锤头 / 上吊线形态的交易信号 + CCI

基于 锤头 / 上吊线形态的交易信号,由 CCI (商品通道指数)指标确认.基于此交易策略的交易程序代码可使用 MQL5 向导自动生成。

MQL5 向导 - 基于 锤头 / 上吊线形态的交易信号 + MFI MQL5 向导 - 基于 锤头 / 上吊线形态的交易信号 + MFI

基于 锤头 / 上吊线形态的交易信号,由 MFI (市场促进指数)指标确认.基于此交易策略的交易程序代码可使用 MQL5 向导自动生成。