Новая версия платформы MetaTrader 4 build 900: Шаблоны классов в MQL4 и оптимизация работы с памятью
В четверг 22 октября 2015 года будет опубликовано обновление платформы MetaTrader 4. Обновление содержит следующие изменения:
MetaTrader 4 Client Terminal build 900
Terminal: Исправлена ошибка смены пароля у неактивного (неподключенного) счета.
Terminal: Оптимизировано использование и освобождение памяти при работе с большими объемами исторических данных.
Terminal: Исправлена и оптимизирована работа с большим количеством категорий новостей.
Signals: Исправлена отписка от сигналов из контекстного меню окна "Навигатор".
MQL4: Добавлены шаблоны классов, что позволяет создавать
параметризованные классы, как в 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 |//+------------------------------------------------------------------+voidOnStart()
{
//--- наполняем массивы данными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>
}
MQL4: Исправлено перераспределение памяти в функции ArrayCopy, в некоторых случаях приводившее к падению MQL4-программ.
Tester:
Исправлена ошибка, приводившая к обнулению переменных, объявленных на
глобальном уровне, после завершения тестирования индикатора.
Tester: Исправлено тестирование при отсутствии связи с торговым сервером.
MetaEditor: В MetaAssist исправлено определение имени функции при наличии приведения типа.
MetaEditor: Исправлено открытие больших файлов.
MetaEditor:
Добавлена горячая клавиша F для вызова поиска из вкладки Библиотека, а
также множество подсказок в статусной строке для команд работы с кодом:
увеличение/уменьшение отступов, перемещение, смена регистра и т.д.
Исправления по крешлогам.
Обновление будет доступно через систему LiveUpdate.
Новая версия платформы MetaTrader 4 build 900: Шаблоны классов в MQL4 и оптимизация работы с памятью
В четверг 22 октября 2015 года будет опубликовано обновление платформы MetaTrader 4. Обновление содержит следующие изменения:
MetaTrader 4 Client Terminal build 900
Результат выполнения:
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
Обновление будет доступно через систему LiveUpdate.