新版MetaTrader 4平台Build 900:MQL4类模板和优化内存使用

MetaTrader 4新功能

22 十月 2015

Terminal

  1. 修正更改非活动账户的密码(无关)。




  2. 优化处理大量历史数据时内存的使用和释放。
  3. 修正和优化处理大量的新闻类别。

Signals

  1. 通过导航窗口快捷菜单修正信号退订。


MQL4

  1. 添加类模板允许您创建类似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(i=0;i<10;i++)
          str+=" "+(string)ExtIntArray[i];      
       Print(str);   
       str="Dbl:";
       for(i=0;i<10;i++)
          str+=" "+DoubleToString(ExtDblArray[i],1);
       Print(str);   
       str="Ptr:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtPtrArray[i].X();      
       Print(str);
    //--- 通过new创建的CFoo对象不应删除,因为它们在TArrayPtr<CFoo>对象的析构函数被删除  
      }
    执行结果:
    TemplTest EURUSD,M1: Ptr: 30 31 32 33 34 35 36 37 38 39
    TemplTest EURUSD,M1: Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
    TemplTest EURUSD,M1: Int: 10 11 12 13 14 15 16 17 18 19
  2. 修正有时可能导致MQL4程序崩溃的ArrayCopy函数的内存中的重新分配。

Tester

  1. 修正测试指标后偶尔造成无效的全局声明变量的错误。
  2. 修正交易服务器连接丢失时的测试。

MetaEditor

  1. 修正type转换情况下在MetaAssist 定义函数名称。
  2. 修正打开大文件。
  3. 添加 F 热键用于从代码库选项卡调用搜索函数,以及在处理代码命令的状态栏的多个提示:增加/减少缩进,导航,情况转移,等等。
修复崩溃日志中报告的错误。