MQL5 向导 - 基于两个 EMA 交叉和日内时间过滤器的交易信号 - MetaTrader 5 专家






MQL5 向导允许自动创建 EA 交易代码。看在 MQL5 向导中创建现成的 EA 交易了解详情。
在这里,我们将考虑基于两个指数平滑移动平均线(快速 EMA 和慢速 EMA)与日内时间过滤器交叉的策略。该策略称为“基于两个 EMA 与日内时间过滤器交叉的信号”(在 MQL5 向导中自动创建 EA 时)。
该策略在 CSignal2EMA_ITF 类中实现。
交易系统基于挂单,价格水平根据移动平均线的值计算,使用 ATR 单位(平均真实范围)。

图 1. 交易信号,基于两个 EMA 与日内时间过滤器的交叉
交易策略的实施是在CSignal2EMA_ITF,它有一些受保护的方法来简化对指标值的访问:
双倍的 快速EMA(整数工业) // 返回柱的快速 EMA 值 双倍的 慢速EMA(整数工业) // 返回柱的慢速 EMA 值 双倍的 StateFastEMA(整数工业)// 如果 EMA 快速增加/减少,则返回正值/负值 双倍的 状态SlowEMA(整数工业)// 如果慢速 EMA 增加/减少,则返回正值/负值 双倍的 状态EMA(整数工业) // 返回快速 EMA 和慢速 EMA 之间的差异 双倍的 ATR(整数工业) // 返回柱的 ATR 值
1. 开多仓
它检查开多仓的条件:最后完成的柱上的快速和慢速 EMA 之间的差异是否已将其符号从“-”更改为“+”(StateEMA(1)>0 && StateEMA(2)<0)。
接下来,它通过调用 CSignalITF 类的 CheckOpenLong() 方法来检查日内时间过滤条件。如果交易允许,它将计算基础价格水平(移动平均线的值)和最后完成的柱的 ATR 范围值。
根据 Limit 输入参数的符号,它将下达买入挂单。订单价格、止盈和止损水平是相对于基本价格水平(以 ATR 单位)计算的。订单到期时间由 Expiration 输入参数定义(以柱为单位)。
//+------------------------------------------------------------------+ //|检查开立多头头寸的条件(买入) | //+------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckOpenLong(双倍的& 价格,双倍的&SL,双倍的& tp、日期时间和到期日) { 如果(!(状态EMA(1)>0&& 状态EMA(2)<0)) 返回(错误的); 如果(!m_time_filter.CheckOpenLong(价格,sl,tp,到期))返回(错误的);//--- 双倍的EMA=慢EMA(1); 双倍的atr=ATR(1); 双倍的点差=m_symbol.Ask()-m_symbol.Bid();//--- 价格=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(价格+m_stop_loss*atr); tp =m_symbol.NormalizePrice(价格-m_take_profit*atr); 过期+=m_expiration*PeriodSeconds(m_period);//--- 返回(真的); }
2. 多头平仓
在我们的例子中,检查平仓条件的函数总是返回 false,即假设多头仓位将通过止盈或止损平仓。如果需要,您可以编写自己的代码来实现此方法。
//+------------------------------------------------------------------+ //|检查平仓条件 |//+------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckCloseLong(双倍的& 价格) { 返回(错误的); }
3. 开空仓
它检查开空头寸的条件:最后完成的柱上的快速和慢速 EMA 之间的差异是否已将其符号从“+”更改为“-”(StateEMA(1)<0 && StateEMA(2)>0)。
接下来,它通过调用 CSignalITF 类的 CheckOpenLong() 方法来检查日内时间过滤条件。如果交易允许,它将计算基础价格水平(移动平均线的值)和最后完成的柱的 ATR 范围值。
根据 Limit 输入参数的符号,它将下达卖出挂单。订单价格、止盈和止损水平是相对于基本价格水平(以 ATR 单位)计算的。订单到期时间由 Expiration 输入参数定义(以柱为单位)。
//+------------------------------------------------------------------+ //|检查开空头寸(卖出)的条件 | //+------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckOpenShort(双倍的& 价格,双倍的&SL,双倍的& tp、日期时间和到期日) { 如果(!(状态EMA(1)<0&& 状态EMA(2)>0)) 返回(错误的); 如果(!m_time_filter.CheckOpenShort(价格,sl,tp,到期))返回(错误的);//--- 双倍的EMA=慢EMA(1); 双倍的atr=ATR(1);//--- 价格 =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(价格+m_stop_loss*atr); tp =m_symbol.NormalizePrice(价格-m_take_profit*atr); 过期+=m_expiration*PeriodSeconds(m_period);//--- 返回(真的); }
4. 平仓
在我们的例子中,检查空头平仓条件的函数总是返回 false,即假设仓位将通过止盈或止损平仓。如果需要,您可以编写自己的代码来实现此方法。
//+------------------------------------------------------------------+ //|检查空头平仓条件 |//+------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckCloseShort(双倍的& 价格) { 返回(错误的); }
5. 买入挂单追踪止损
EA 交易将根据移动平均线和 ATR 的当前值跟踪挂单。
//+--------------------------------------------------------------------------------+ //|检查修改挂单买单的条件 |//+--------------------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* 订单,双倍的& 价格) {// - - 查看 如果(订单==NULL)返回(错误的);//--- 双倍的EMA=慢EMA(1); 双倍的atr=ATR(1); 双倍的点差=m_symbol.Ask()-m_symbol.Bid();//--- 价格=m_symbol.NormalizePrice(ema-m_limit*atr+spread);//--- 返回(真的); }
6. 卖出挂单追踪止损
EA 交易将根据移动平均线和 ATR 的当前值跟踪挂单。
如果市场价格达到订单价格,订单就会被执行。
//+--------------------------------------------------------------------------------+ //|检查修改挂单买单的条件 |//+--------------------------------------------------------------------------------+ 布尔值CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* 订单,双倍的& 价格) {// - - 查看 如果(订单==NULL)返回(错误的);//--- 双倍的EMA=慢EMA(1); 双倍的atr=ATR(1);//--- 价格=m_symbol.NormalizePrice(ema+m_limit*atr);//--- 返回(真的); }
使用 MQL5 向导创建 EA 交易
要根据策略创建交易机器人,您需要将信号属性选择为“基于两个 EMA 与日内时间过滤器交叉的信号” 在“创建现成的 EA 交易”选项中MQL5 向导:

图 2. 在 MQL5 向导中选择“基于两个 EMA 与日内时间过滤器交叉的信号”
接下来你必须指定需要的追踪止损算法和资金和风险管理系统。 Expert Advisor 的代码将自动创建,您可以对其进行编译和测试策略测试仪MetaTrader 5 客户端。
测试结果
让我们考虑对历史数据进行 EA 交易的回测(EUenSD 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), 未使用追踪止损算法 (未使用尾随)。

在我们的案例中,我们发现两个 EMA 的交叉从 6:00 到 23:59 提供了许多错误信号。我们可以通过设置过滤器参数来指定日内时间过滤器。
例如,我们可以指定时间过滤器,仅允许在 0:00 到 5:59 之间建仓。可以通过设置BadHoursOfDay=16777152=111111111111111111000000b的值来完成。所有其他交易时间都“不好”,因此最好从 6:00 到当天结束期间禁止开立新仓位。
如果我们设置 BadHoursOfDay=16777152 的值,我们将过滤掉许多错误信号:

CSignalITF 提供了许多其他时间过滤功能(只需指定一小时内的“好”和“坏”分钟、一天中的小时、一周内的天)。
附件:Signal2EMA-ITF.mqh 具有CSignal2EMA_ITF类必须放置在terminal_data_folder\MQL5\Include\Expert\Signal 文件夹中。
Expert_2ema_itf.mq5 包含使用 MQL5 向导创建的 EA 交易的代码。
附件下载
📎 signal2ema-itf.mqh (16.53 KB)
📎 expert_2ema_itf.mq5 (7.29 KB)
Source: MQL5 #264
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
