欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

移动平均线 - MetaTrader 5 专家

author emer | 606 人阅读 | 0 人评论 |

Moving Average - expert for MetaTrader 5

Moving Average - expert for MetaTrader 5

Moving Average - expert for MetaTrader 5

移动平均 EA 包含在元交易者 5客户端,是使用 EA 进行交易的示例移动平均线指标。

EA 文件 Moving Average.mq5 位于文件夹“terminal_data_folder\MQL5\Experts\Examples\Moving Average\”中。该 EA 是一个使用示例技术指标,贸易历史功能和交易类标准库的。此外,EA 还包括一个基于交易结果的资金管理系统。

让我们考虑一下 EA 交易的结构及其工作原理。

1. EA 属性

//+------------------------------------------------------------------+
//|                                              移动平均线.mq5 |
//|                   版权所有 2009-2013,MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#财产版权 “版权所有 2009-2013,MetaQuotes Software Corp.”
#财产关联      “https://www.mql5.com”
#财产版本  “1.00

前 5 行包含注释,接下来的三行使用预处理器指令设置 MQL5 程序的属性(版权、链接、版本)#财产

当您运行 EA 交易时,它们会显示在“公共”选项卡中:

Moving Average - expert for MetaTrader 5

图 1. 移动平均 EA 的常用参数

1.2.包含文件

接下来,#包括指令告诉编译器包含“Trade.mqh”文件。

该文件是标准库,它包含贸易网用于轻松访问交易功能的类。

#包括<贸易\贸易.mqh>

包含文件的名称显示在括号“<>;”中,因此路径是相对于目录设置的:“terminal_data_folder\Include\”。

然后是类型、名称、默认值和注释。他们的作用如图所示。 2.

输入 双倍的最大风险        =0.02;    // 最大风险百分比
输入 双倍的减少系数     =3;      // 减少因子
输入 整数    移动周期       =12;      // 移动平均周期
输入 整数    移动移位        =6;      // 移动平均线移动

MaximumRisk 和 DecreaseFactor 参数将用于资金管理,MovingPeriod 和 MovingShift 设置周期和移动移动平均线将使用或检查交易条件的技术指标。

输入参数行注释中的文本以及默认值显示在“选项”选项卡中,而不是输入参数的名称:

Moving Average - expert for MetaTrader 5

图 2. 移动平均 EA 的输入参数

1.4.全局变量

然后声明全局变量ExtHandle。它将用于存储手柄移动平均线指标。

//---
整数   扩展句柄=0;

接下来是6个函数。它们各自的用途在函数体之前的注释中描述:

最后三个函数是事件处理函数;前三个服务函数在其代码中调用。

2. 事件处理函数

2.1. OnInit()初始化函数

OnInit()函数在 EA 交易首次启动期间调用一次。通常在 OnInit() 事件处理程序中,EA 准备运行:检查输入参数、初始化指标和参数等。如果出现严重错误,当进一步的工作没有意义时,函数将退出并返回代码 INIT_FAILED。

//+------------------------------------------------------------------+
//|专家初始化函数                                   |
//+------------------------------------------------------------------+
整数 初始化时空白)
  {//---   扩展句柄=伊玛_象征,_时期,移动周期,移动平移,模式_SMA,PRICE_CLOSE);
  如果(扩展句柄==INVALID_HANDLE)
     {
      打印函数“创建 MA 指标时出错”);
      返回初始化失败);
     }//---  返回初始化成功);
  }

由于 EA 交易基于移动平均线指标,通过调用iMA()移动平均线指标已创建,其句柄保存在全局变量 ExtHandle 中。

如果发生错误,OnInit() 将退出并返回代码初始化失败- 这是在初始化不成功的情况下完成 EA/指标操作的正确方法。

2.2. OnTick() 函数

OnTick()每次收到运行 EA 的图表品种的新报价时,都会调用该函数。

//+------------------------------------------------------------------+
//|专家勾选功能                                            |
//+------------------------------------------------------------------+
空白 勾选空白)
  {//---  如果位置选择_象征))
      检查关闭();
  别的      检查打开();//---  }

位置选择()函数用于定义当前交易品种是否有持仓。

如果有未平仓头寸,则调用 CheckForClose() 函数,该函数分析市场的当前状态并关闭未平仓头寸,否则调用 CheckForOpen() 函数,该函数检查市场入场条件并在出现此类条件时开立新头寸。

2.3. OnDeInit() 反初始化函数

OnDeInit()当 EA 从图表中删除时调用。如果程序在运行期间放置图形对象,则可以将它们从图表中删除。

//+------------------------------------------------------------------+
//|专家去初始化函数                                 |
//+------------------------------------------------------------------+
空白 解初始化常量 整数原因)
  {
  }//+------------------------------------------------------------------+

在这种情况下,EA 取消初始化期间不会执行任何操作。

三、服务功能

3.1.函数 TradeSizeOptimized()

该函数计算并返回在指定风险水平和交易结果下开仓的最佳手数大小的值。

//+------------------------------------------------------------------+
//|计算最佳批量                                       |
//+------------------------------------------------------------------+
双倍的交易规模优化(空白)
  {
  双倍的价格=0.0;
  双倍的保证金=0.0;//--- 计算手数  如果(!符号信息双_象征,SYMBOL_ASK,价格))
      返回0.0);
  如果(!订单计算保证金订单类型购买,_象征,1.0,价格,利润))
      返回0.0);
  如果(保证金<=0.0)
      返回0.0);

  双倍的地段=规范化双精度帐户信息双ACCOUNT_FREEMARKIN)*最大风险/保证金,2);//--- 计算一系列连续亏损交易的长度  如果(减少系数>0)
     {
      //--- 请求整个交易历史记录     历史选择0,时间当前());
      //--     整数    订单=历史交易总计();  // 交易总数     整数    损失=0;                    // 该系列中亏损交易的数量     为了整数我=订单-1;我>=0;我 - )
        {
        乌龙票=历史交易获取门票(我);
        如果(门票==0)
           {
            打印“HistoryDe​​alGetTicket失败,没有交易历史”);
            休息;
           }
        //--- 检查交易符号        如果历史交易获取字符串(票,DEAL_SYMBOL)!=_象征)
            继续;
        //--- 检查利润        双倍的利润=历史交易获得双倍(票,交易利润);
        如果(利润>0.0)
            休息;
        如果(利润<0.0)
            损失++;
        }
      //---      如果(损失>1)
         地段=规范化双精度(批次*损失/减少系数,1);
     }//--- 规范化并检查交易量的允许值  双倍的步长=符号信息双_象征,SYMBOL_VOLUME_STEP);
   手数=步数*规范化双精度(批次/步体积,0);

  双倍的最小体积=符号信息双_象征,SYMBOL_VOLUME_MIN);
  如果(手数双倍的最大容量=符号信息双_象征,SYMBOL_VOLUME_MAX);
  如果(批次>最大体积)
      手数=最大容量;//--- 返回交易量的值  返回(很多);
  }

SymbolInfoDouble()函数用于检查当前交易品种价格的可用性,接下来是订单计算保证金()函数用于请求下订单(在本例中为买入订单)所需的保证金。初始手数由下单所需的保证金值、账户的可用保证金(AccountInfoDouble(ACCOUNT_FREEMARGIN)) 和输入参数 MaximumRisk 中指定的最大风险允许值。

如果输入参数 DecreaseFactor 的值为正数,则会分析历史交易,并考虑有关最大亏损交易系列的信息来调整手数大小:初始手数大小乘以大小 (1-losses/DecreaseFactor)。

然后,交易量将“四舍五入”为当前交易品种最小允许交易量步长 (stepvol) 的倍数的值。还要求交易量的最小值(minvol)和最大可能值(maxvol),如果手数超出允许的限制,则会进行调整。结果,该函数返回交易量的计算值。

3.2.函数 CheckForOpen()

CheckForOpen() 用于检查开仓条件,并在交易条件发生时(在本例中当价格穿过移动平均线时)开仓。

//+------------------------------------------------------------------+
//|检查空缺职位条件                               |
//+------------------------------------------------------------------+
空白检查打开(空白)
  {
  Mql费率rt[2];//--- 复制价格值  如果复制率_象征,_时期,0,2,rt)!=2)
     {
      打印“复制率”,_象征,“失败,没有历史”);
      返回;
     }//--- 仅在新柱的第一个价格变动时进行交易  如果(rt[1].tick_volume>1)
      返回;//--- 获取移动平均线指标的当前值  双倍的   马[1];
  如果复制缓冲区(扩展句柄,0,0,1,妈)!=1)
     {
      打印“从 iMA 复制缓冲区失败,无数据”);
      返回;
     }//--- 检查信号  ENUM_ORDER_TYPE信号=错误_值;

  如果(rt[0].open>ma[0] && rt[0].close0])
      信号=订单类型_卖出;    // 卖出条件  别的     {
      如果(rt[0].open0] && rt[0].close>ma[0])
         信号=订单类型购买;  // 购买条件     }//--- 附加检查  如果(信号!=错误_值)
      如果终端信息整数TERMINAL_TRADE_ALLOWED))
        如果酒吧_象征,_时期)>100)
           {
            CTrade 贸易;
            trade.PositionOpen(_象征,信号,TradeSizeOptimized(),
                              符号信息双_象征,信号==订单类型_卖出SYMBOL_BID:SYMBOL_ASK),
                              0,0);
           }//---  }

当使用移动平均线进行交易时,您需要检查价格是否穿过移动平均线。使用复制率()函数中,当前价格的两个值被复制到结构数组 rt[] 中,rt[1] 对应于当前柱,rt[0] - 已完成的柱。

通过检查当前柱的报价量来启动新柱,如果它等于 1,则新柱已开始。应该注意的是,这种检测新柱的方法在某些情况下可能会失败(当报价成组出现时),因此新柱形成的开始事实应该通过保存并比较当前报价的时间来完成(请参阅是新酒吧)。

使用以下命令请求移动平均线指标的当前值复制缓冲区()函数并保存在仅包含一个值的 ma[] 数组中。然后,程序检查价格是否穿过移动平均线并进行额外检查(是否可以使用 EA 进行交易以及历史上是否存在柱形图)。如果成功,则通过调用以下函数打开该交易品种的适当仓位:持仓开仓()交易对象的方法(实例贸易网)。

开仓价格是使用以下设置的SymbolInfoDouble()根据信号变量的值返回买价或卖价的函数。持仓量通过调用上述 TradeSizeOptimized() 来确定。

3.3.函数 CheckForClose()

CheckForClose() 检查平仓条件,并在发生平仓条件时将其平仓。

//+------------------------------------------------------------------+
//|检查平仓条件                               |
//+------------------------------------------------------------------+
空白检查关闭(空白)
  {
  Mql费率rt[2];//--- 复制价格值  如果复制率_象征,_时期,0,2,rt)!=2)
     {
      打印“复制率”,_象征,“失败,没有历史”);
      返回;
     }//--- 仅在新柱的第一个价格变动时进行交易  如果(rt[1].tick_volume>1)
      返回;//--- 获取移动平均线指标的当前值  双倍的   马[1];
  如果复制缓冲区(扩展句柄,0,0,1,妈)!=1)
     {
      打印“从 iMA 复制缓冲区失败,无数据”);
      返回;
     }//--- 获取之前使用 PositionSelect() 选择的仓位类型  布尔值信号=错误的;
  长的类型=位置获取整数位置类型);

  如果(类型==(长的POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close0])
      信号=真的;
  如果(类型==(长的POSITION_TYPE_SELL  && rt[0].open0] && rt[0].close>ma[0])
      信号=真的;//--- 附加检查  如果(信号)
      如果终端信息整数TERMINAL_TRADE_ALLOWED))
        如果酒吧_象征,_时期)>100)
           {
            CTrade 贸易;
            交易.平仓(_象征,3);
           }//---  }

CheckForClose() 函数的算法与CheckForOpen() 的算法类似。根据当前未平仓头寸的方向,重新检查平仓条件(价格向下穿越移动平均线以买入或向上穿越移动平均线以卖出)。未平仓头寸通过调用平仓()交易对象的方法(实例贸易网)。

可以使用以下方法找到参数的最佳值策略测试仪MetaTrader 5 终端的。

例如,在2012.01.01-2013.08.01区间优化MovingPeriod参数时,MovingPeriod=45时获得最佳结果:

Moving Average - expert for MetaTrader 5

移动平均 EA 交易的回测结果

移动平均智能交易系统包含在标准包中元交易者 5终端是一个使用的例子技术指标,交易历史功能和贸易类别标准库的。此外,EA 还包括一个基于交易结果的资金管理系统。


附件下载

📎 moving_average.mq5 (6.5 KB)

Source: MQL5 #1921

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录