Новая версия платформы MetaTrader 4 build 900: Шаблоны классов в MQL4 и оптимизация работы с памятью

Что нового в MetaTrader 4?

22 октября 2015

Терминал

  1. Исправлена ошибка смены пароля у неактивного (неподключенного) счета.




  2. Оптимизировано использование и освобождение памяти при работе с большими объемами исторических данных.
  3. Исправлена и оптимизирована работа с большим количеством категорий новостей.

Сигналы

  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 (специализируем шаблон TArray типом int)
    TArray<double>  ExtDblArray;   // инстанцируем шаблон TArray (специализируем шаблон TArray типом double)
    TArrayPtr<CFoo> ExtPtrArray;   // инстанцируем шаблон TArrayPtr (специализируем шаблон TArrayPtr типом CFoo)
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    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.  Исправлено перераспределение памяти в функции ArrayCopy, в некоторых случаях приводившее к падению MQL4-программ.

Tester

  1. Исправлена ошибка, приводившая к обнулению переменных, объявленных на глобальном уровне, после завершения тестирования индикатора.
  2. Исправлено тестирование при отсутствии связи с торговым сервером.

MetaEditor

  1. В MetaAssist исправлено определение имени функции при наличии приведения типа.
  2. Исправлено открытие больших файлов.
  3. Добавлена горячая клавиша F для вызова поиска из вкладки Библиотека, а также множество подсказок в статусной строке для команд работы с кодом: увеличение/уменьшение отступов, перемещение, смена регистра и т.д.

Исправления по крешлогам.