MetaTrader 5平台更新 Build 1200:接收报价历史和直接支付服务

MetaTrader 5新功能

23 十月 2015

程序端

  1. 在市场报价新增使用报价历史的功能。之前,操作期间报价图表只显示程序端收集的历史。现在,在交易服务器上您就可以访问整个报价历史。禁用自动滚 动,使用鼠标适时开始回滚报价图表,以常见价格图表相同的方式从交易服务器下载缺失的历史。新功能将有助于想要获得最详细价格图表的交易者。



    使用CopyTicks() 函数接收更深层次的报价历史。如果后者在交易服务器上,那么它已得到修改以便于它可以请求缺失的历史并下载它。

  2. 新增一个快速打开/关闭市场深度的图标。该图标位于图表上的一键交易面板的附近。您也可以使用新的热键Alt+B。热键也用于市场报价窗口,可以打开市场报价中突出显示的交易品种的市场深度。




  3. PC硬件特点和操作系统的信息现在从客户端开始就已经记录在日志中。例如:
    2015.10.14 14:48:18.486	Data Folder: C:\Program Files\MetaTrader 5
    2015.10.14 14:48:18.486	Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7  920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00
    2015.10.14 14:48:18.486	MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
  4. 改进市场报价中交易品种的工作。

    • 添加市场报价中交易品种显示的数量和交易服务器上可用的交易品种总数。
    • 通过智能选择列表添加一行以便添加新交易品种。
    • 新交易品种行的搜索不仅可以通过交易品种名称执行,还可以通过其描述和国际名称完成。




  5. 添加支持不同语言的经济日历。
  6. 添加经济日历缺失的国家图标。
  7. 添加在市场报价打开交易品种管理窗口的热键 - Ctrl+U。
  8. 修正根据窗口菜单命令安排打开图表窗口。
  9. 修正使用强化认证时偶尔阻碍程序端查找证书文件的错误。
  10. 修正有时可能导致价格历史同步循环的错误。
  11. 如果交易品种在请求执行模式下进行交易,修正了交易量增加后之前持仓的无效止损/止盈水平。
  12. 如果交易品种的买入持仓在市场深度的“只买入”交易模式,修正了下卖单的检查功能。
  13. 修正追踪止损功能的操作。在一些罕见的情况下,持仓的保护性止损的不正确移动。
  14. 程序端界面进一步适用于高分辨率的屏幕(4K)。
  15. 修正卸载尽管MQL5程序定期要求却还是过多的历史数据。
  16. 修正在Windows10下工作时一些用户界面的显示问题。
  17. 更新用户界面的翻译。

市场

  1. 已修改并优化MQL5市场中产品数据库的操作。
  2. VPS上已经禁止程序端无MQL5.community账户的购买。现在购买需要在程序端设置中指定MQL5.community账户:工具-选项-社区。
  3. 添加使用银联直接购买产品。
  4. 增强在MQL5市场购买产品时的日志内容。


主机和信号

  1. 支付虚拟主机和信号订阅现在可以直接从付款系统转账。

    若要支付主机服务,用户无需登录MQL5.community账户充值。 为服务付款现在可以使用一种可用的付款系统从平台直接转账。



    选择一种可用的系统,进行网上转账:




    同样,为交易信号订阅付款也可以通过付款系统从程序端直接完成。




    所需金额将首先转到您的MQL5.community 账户,从这里完成为服务付款。因此,您可以拥有一个明确统一的租赁虚拟主机平台和信号订阅的历史并可以轻松访问和审查您MQL5.community 服务的全部付款。
  2. 添加在32位客户端工作时管理虚拟主机(迁移除外)。
  3. 修正迁移FTP出口设置到虚拟主机,尽管允许通过FTP发布报告。

MQL5

  1. 启用新优化的编译器。在64位平台上的程序执行速度提升了5倍。MQL5程序在最近的MetaEditor版本中应该重新编译。
  2. 扩展的MqlTick 结构格式。现在,通过了以毫秒为单位的报价到达时间,以及决定哪个报价参数已被更改的标识。
    struct MqlTick
      {
       datetime     time;          // 最近更新价格的时间
       double       bid;           // 当前卖价
       double       ask;           // 当前买价
       double       last;          // 当前收盘价
       ulong        volume;        // 当前收盘价的交易量
       long         time_msc;      // 以毫秒为单位的最近更新价格的时间
       uint         flags;         // 报价标识
      };
    无论与之前报价相比是否有变化都会填充每个报价参数。因此,可以找出过去任何时刻的正确价格,无需在报价历史搜索之前的值。例如,即使报价到达期间只有卖价变化,该结构仍然包含其他参数,包括之前的买价,交易量等等。您可以分析报价标识,找出具体更改了哪个数据:

    • TICK_FLAG_BID - 更改卖价
    • TICK_FLAG_ASK  - 更改买价
    • TICK_FLAG_LAST - 更改最终成交价
    • TICK_FLAG_VOLUME - 更改交易量
    • TICK_FLAG_BUY - 报价是买入交易结果
    • TICK_FLAG_SELL - 报价是卖出交易结果

    MqlTick 结构通过两种类函数使用:

    • CopyTicks - 该类函数不支持旧的结构格式。当调用CopyTicks函数时,之前使用旧的报价格式编译的EX5函数将返回错误4006 (ERR_MQL_INVALID_ARRAY)。
    • SymbolInfoTick - 该类函数同时支持新旧两种结构格式。

  3. 添加允许您创建类似C++中的参数化类的类模板。那甚至可以使其更加抽象并且能够以统一的方式使用相同的代码处理不同类的对象。使用示例:
    //+------------------------------------------------------------------+
    //|                                                    TemplTest.mq5 |
    //|                        Copyright 2015, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2015, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| 声明一个模板类                                                     |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArray
      {
    protected:
       T                 m_data[];
    
    public:
    
       bool              Append(T item)
         {
          int new_size=ArraySize(m_data)+1;
          int reserve =(new_size/2+15)&~15;
          //---
          if(ArrayResize(m_data,new_size,reserve)!=new_size)
             return(false);
          //---
          m_data[new_size-1]=item;
          return(true);
         }
       T                 operator[](int index)
         {
          static T invalid_index;
          //---
          if(index<0 || index>=ArraySize(m_data))
             return(invalid_index);
          //---
          return(m_data[index]);
         }   
      };
    //+------------------------------------------------------------------+
    //| 指针数组的模板类析构函数,删除                                       |
    //| 对象,数组中存储指针的对象。                                         |
    //|                                                                  |
    //| 请注意继承TArray 模板类                                            |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArrayPtr : public TArray<T *>
      {
    public:
       void             ~TArrayPtr()
         {
          for(int n=0,count=ArraySize(m_data);n<count;n++)
             if(CheckPointer(m_data[n])==POINTER_DYNAMIC)
                delete m_data[n];
         }
      };
    //+--------------------------------------------------------------------------+
    //| 声明类。对象指针将存储在数组中                                               |
    //+--------------------------------------------------------------------------+
    class CFoo
      {
       int               m_x;
    public:
                         CFoo(int x):m_x(x) { }
       int               X(void) const { return(m_x); }
      };
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    TArray<int>     ExtIntArray;   // 例如 TArray (int 类型 的特定TArray )
    TArray<double>  ExtDblArray;   // 例如TArray (double类型的特定 TArray )
    TArrayPtr<CFoo> ExtPtrArray;   // 例如 TArrayPtr (CFoo类型的特定 TArrayPtr )
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                   |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- 用数据填充数组
       for(int i=0;i<10;i++)
         {
          int integer=i+10;
          ExtIntArray.Append(integer);
          
          double dbl=i+20.0;
          ExtDblArray.Append(dbl);
          
          CFoo *ptr=new CFoo(i+30);
          ExtPtrArray.Append(ptr);
         }
    //--- 输出数组内容
       string str="Int:";
       for(int i=0;i<10;i++)
          str+=" "+(string)ExtIntArray[i];      
       Print(str);   
       str="Dbl:";
       for(int i=0;i<10;i++)
          str+=" "+DoubleToString(ExtDblArray[i],1);
       Print(str);   
       str="Ptr:";
       for(int i=0;i<10;i++)
          str+=" "+(string)ExtPtrArray[i].X();      
       Print(str);
    //--- 通过new创建的CFoo对象不应删除,因为它们在TArrayPtr<CFoo>对象的析构函数被删除  
      }
    执行结果:
    TemplTest (EURUSD,H1)    Int: 10 11 12 13 14 15 16 17 18 19
    TemplTest (EURUSD,H1)    Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
    TemplTest (EURUSD,H1)    Ptr: 30 31 32 33 34 35 36 37 38 39

  4. 新操作 * 和 & 通过引用接收变量和接收引用变量。
  5. 添加ObjectsDeleteAll 函数的重载形式 - 通过图表子窗口的名称前缀删除指定类型的全部对象。
    int  ObjectsDeleteAll(
       long           chart_id,   // 图表ID
       const string     prefix,   // 对象名称前缀
       int       sub_window=-1,   // 窗口指数
       int      object_type=-1    // 删除的对象类型
       );

  6. 修正ObjectGetValueByTime 函数操作。之前,有时可能会返回错误的图表时间价格值(例如,水平趋势线)。
  7. 修正服务器上缺乏历史数据时的Copy*函数的操作。 之前,这种情况在返回控制之前会导致30-50秒的延迟。
  8. 为MQL5标准程序库添加了一些改进。
  9. 标准程序库 文档翻译为德语,法语,中文,土耳其语,西班牙语和葡萄牙语。
  10. 添加了日语MQL5 文档

Tester

  1. 选择在策略测试中运行的程序的过程变得更加容易。 现在根据存储EA交易和指标的目录,以树状显示列表。




  2. 显示客户端线型可视化测试期间的一些指标。
  3. 修正了通过策略测试调试MQL5程序时设置杠杆和图表时间表。
  4. 修正历史记录测试时调试指标。
修正崩溃日志中报告的错误。

更新文档。