- 显示:
- 4083
- 等级:
- 已发布:
- 2013.10.01 13:28
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
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并且日内时间过滤条件满足。
该交易系统基于挂单,价格水平取决于均线值,并使用了ATR单元(Average True Range)。
图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>0. 当出现均线虚假突破时,以优于市场价格的价格回测方向入市(Buy Limit和Sell Limit根据交易信号下单)。
- Limit<0. 将在价格前进方向入市 (Buy Stop和Sell Stop根据交易信号下单)。
- 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"
接下来你必须指定所需要的 移动止损 算法和 货币风险管理系统。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交易的测试结果
没有使用日内过滤,所以有许多错误信号。如果根据交易时间对交易结果分析,交易信号则可被改善。
在我们的案例中,我们发现从6:00至23:59两个EMA的交叉提供了许多错误的信号。我们可通过设置过滤参数来指定日内时间过滤条件。
例如,我们可以指定时间过滤条件为只允许从0:00至5点59分开仓。可通过设置BadHoursOfDay的值为16777152=111111111111111111000000b来实现。所有其它的交易时间是“不好的”,所以最好从6:00直到一天结束禁止开新仓。
如果我们设置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 Ltd译自俄语
原代码: https://www.mql5.com/ru/code/264

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

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

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

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