- Добавлена нативная поддержка .NET библиотек с "умным" импортом функций.
Теперь библиотеки .NET можно использовать без написания специальных
оберток — MetaEditor берет это на себя.
Для
работы с функциями .NET библиотеки достаточно импортировать саму DLL
без указания конкретных функций. MetaEditor автоматически импортирует
все функции, с которыми возможна работа:
- Простые структуры (POD, plain old data) — структуры, которые содержат только простые типы данных.
- Публичные статические функции, в параметрах которых используются только простые типы и структуры POD или их массивы
Для вызова функций из библиотеки просто импортируйте ее:
#import "TestLib.dll"
void OnStart()
{
int x=41;
TestClass::Inc(x);
Print(x);
}
C# код функции Inc класса TestClass выглядит следующим образом:
public class TestClass
{
public static void Inc(ref int x)
{
x++;
}
}
В результате выполнения скрипт вернет значение 42.
Работа над поддержкой .NET библиотек продолжается, в будущих версиях планируется расширить возможности их использования.
- В стандартную библиотеку добавлена поддержка работы с
функциями WinAPI. Теперь для использования функций операционной системы в
MQL5-программе нет необходимости вручную импортировать библиотеки и
описывать сигнатуры функций. Достаточно подключить заголовочный файл из
каталога MQL5\Include\WinAPI.
Функции WinAPI сгруппированы в отдельных файлах по назначению:
- libloaderapi.mqh — работа с ресурсами
- memoryapi.mqh — работа с памятью
- processenv.mqh — работа с окружением
- processthreadsapi.mqh — работа с процессами
- securitybaseapi.mqh — работа с системой безопасности ОС
- sysinfoapi.mqh — получение системной информации
- winbase.mqh — общие функции
- windef.mqh — константы, структуры и перечисления
- wingdi.mqh — работа с графическими объектами
- winnt.mqh — работа с исключениями
- winreg.mqh — работа с реестром
- winuser.mqh — управление окнами и интерфейсом
- errhandlingapi.mqh — обработка ошибок
- fileapi.mqh — работа с файлами
- handleapi.mqh — работа с хэндлами
- winapi.mqh — подключение всех функций (заголовочных файлов WinAPI)
Обвязка работает только с 64-битной архитектурой.
- Добавлена поддержка спецификаторов inline, __inline, __forceinline при
синтаксическом анализе кода. Наличие этих спецификаторов в коде не будет
вызывать ошибки, но и не будет влиять на компиляцию. На данный момент
это позволит легче переносить С++ код в MQL5.
Более подробная информация о спецификаторах доступна в MSDN.
- Проведена существенная оптимизация исполнения MQL5-программ. В
некоторых случаях прирост производительности может достигать 10%. Чтобы
получить прирост скорости, перекомпилируйте ваши программы в новой
версии MetaEditor.
К сожалению, дополнительная
оптимизация привела к потере совместимости новых программ с
предыдущими
версиями терминала. Все программы, скомпилированные в MetaEditor
версии 1912 и выше, не будут запускаться в терминалах версии ниже 1912.
При этом программы,
скомпилированные ранее в предыдущих версиях MetaEditor, будут в
работать в
новых терминалах.
- Проведена большая работа по оптимизации множества функций MQL5.
- Добавлены новые свойства для прикрепления/открепления графиков от основного окна терминала и управления их положением.
В перечисление ENUM_CHART_PROPERTY_INTEGER добавлены:
- CHART_IS_DOCKED — окно графика закреплено. Если установить значение false, то график можно перетащить за пределы терминала.
- CHART_FLOAT_LEFT — левая координата открепленного графика относительно виртуального экрана.
- CHART_FLOAT_TOP — верхняя координата открепленного графика относительно виртуального экрана.
- CHART_FLOAT_RIGHT — правая координата открепленного графика относительно виртуального экрана.
- CHART_FLOAT_BOTTOM — нижняя координата открепленного графика относительно виртуального экрана.
В перечисление ENUM_TERMINAL_INFO_INTEGER добавлены:
- TERMINAL_SCREEN_LEFT
— левая координата виртуального экрана. Виртуальным экраном является
прямоугольник, охватывающий все мониторы. Если в системе имеются два
монитора и их порядок задан справа налево, то левая координата
виртуального экрана может оказаться на границе двух мониторов.
- TERMINAL_SCREEN_TOP — верхняя координата виртуального экрана.
- TERMINAL_SCREEN_WIDTH — ширина терминала.
- TERMINAL_SCREEN_HEIGHT — высота терминала.
- TERMINAL_LEFT — левая координата терминала относительно виртуального экрана.
- TERMINAL_TOP — верхняя координата терминала относительно виртуального экрана.
- TERMINAL_RIGHT — правая координата терминала относительно виртуального экрана.
- TERMINAL_BOTTOM — нижняя координата терминала относительно виртуального экрана.
- Добавлено поле volume_real в структуры MqlTick и MqlBookInfo. Оно
предназначено для работы с объемом повышенной точности. Значение
volume_real имеет больший приоритет по сравнению с volume. Сервер будет
использовать именно это значение, если оно указано.
struct MqlTick
{
datetime time; // Время последнего обновления цен
double bid; // Текущая цена Bid
double ask; // Текущая цена Ask
double last; // Текущая цена последней сделки (Last)
ulong volume; // Объем для текущей цены Last
long time_msc; // Время последнего обновления цен в миллисекундах
uint flags; // Флаги тиков
double volume_real; // Объем для текущей цены Last c повышенной точностью
};
struct MqlBookInfo
{
ENUM_BOOK_TYPE type;
double price;
long volume;
double volume_real;
};
- В перечисление ENUM_SYMBOL_INFO_DOUBLE добавлены новые свойства:
- SYMBOL_VOLUME_REAL — объем последней совершенной сделки;
- SYMBOL_VOLUMEHIGH_REAL — максимальное значение объема совершенной сделки за текущие сутки;
- SYMBOL_VOLUMELOW_REAL — минимальное значение объема совершенной сделки за текущие сутки.
Для получения этих свойств используйте функцию SymbolInfoDouble.
- В перечисление ENUM_MQL_INFO_INTEGER добавлено свойство MQL_FORWARD — признак того, что программа находится в режиме форвард-тестирования.
- Для структур добавлено свойство pack( integer_value ). Оно позволяет
задать выравнивание расположения полей внутри структуры, это бывает
необходимо при работе с DLL. Для integer_value возможны значения 1, 2, 4, 8 и 16.
Если свойство не определено, по умолчанию используется вырванивание в 1 байт — pack(1).
Пример использования:
struct A
{
char a;
int b;
};
struct B pack(4)
{
char a;
int b;
};
void OnStart()
{
Print("sizeof(A)=",sizeof(A));
Print("sizeof(B)=",sizeof(B));
}
Вывод:
sizeof(A)=5
sizeof(B)=8
Более подробная информация о выравнивании в структурах доступно в MSDN.
- Ослаблены требования к приведению перечислений. При неявном приведении
компилятор автоматически подставит значение правильного перечисления и
выведет предупреждение.
Для следующего кода:
enum Main
{
PRICE_CLOSE_,
PRICE_OPEN_
};
input Main Inp=PRICE_CLOSE;
void OnStart()
{
}
Компилятор выдаст предупреждение:
implicit conversion from 'enum ENUM_APPLIED_PRICE' to 'enum Main'
'Main::PRICE_OPEN_' instead of 'ENUM_APPLIED_PRICE::PRICE_CLOSE' will be used
Ранее в этом случае выдавалась ошибка:
'PRICE_CLOSE' - cannot convert enum
При неправильном использовании перечислений в параметрах функций компилятор по-прежнему будет выдавать ошибку.
- Исправлены ошибки компиляции шаблонных функций. Теперь при
использовании перегруженных шаблонных функций инстанцируется только
нужная перегрузка, а не все имеющиеся.
class X { };
void f(int) { }
template<typename T>
void a(T*) { new T(2); }
template<typename T>
void a() { f(0); }
void OnInit() { a<X>(); }
- Оптимизированы некоторые случаи доступа к тиковой истории через функции CopyTicks*.
- Добавлена новая функция TesterStop, которая позволяет досрочно
завершить тестирование/проход оптимизации. При ее вызове вся накопленная
торговая статистика и результат OnTester передаются в клиентский терминал как при штатном заврешении тестирования/оптимизации.
- Добавлено новое свойство для пользовательских индикаторов #property
tester_everytick_calculate. Оно используется в тестере стратегий и
позволяет принудительно влючить расчет индикаторов на каждом тике.
Обновлена документация.