MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

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

26 октября 2018

Terminal

  1. Теперь вы можете выносить графики финансовых инструментов за пределы окна торгового терминала.

    Это удобно при работе с несколькими мониторами. Например, на одном можно расположить основное окно платформы и следить за состоянием счета, а на другом — графики для оценки ситуации на рынке. Чтобы отделить график от терминала, отключите опцию "Закреплен" в его контекстном меню. После этого расположите график на нужном мониторе.





    Чтобы вам не приходилось переключаться между мониторами для нанесения аналитических объектов или индикаторов, у открепленных графиков предусмотрена отдельная панель инструментов. Чтобы изменить набор команд или скрыть панель инструментов, воспользуйтесь ее контекстным меню.

  2. Полностью обновлены встроенные чаты. Теперь они поддерживают групповые диалоги и каналы. Вы можете вести закрытые обсуждения с группой людей в едином пространстве, не переключаясь между разными диалогами, создавать тематические каналы по интересам и языкам. Общаться с коллегами и друзьями на MQL5.community можно не заходя на сайт.

    Каждый групповой чат и канал может быть публичным или приватным. Автор сам решает, можно ли к ним присоединяться свободно или только по приглашению. Также в каналы и чаты можно назначать модераторов для дополнительного контроля общения.




  3. Добавлена поддержка объемов повышенной точности для торговли криптовалютами. Теперь минимально возможный объем торговых операций составляет 0.00000001 лота. В стакан цен, ленту сделок и другие элементы интерфейса добавлена возможность отображения объемов с точностью до 8 знаков после запятой.

    Минимальный объем и шаг его изменения зависят от настроек финансового инструмента на стороне брокера.




  4. В окно "Инструменты" добавлена вкладка статей, опубликованных на MQL5.community. Более 600 подробных материалов о разработке торговых стратегий на MQL5 теперь доступны прямо в терминале. Новые статьи выходят каждую неделю.




  5. Добавлена поддержка расширенной авторизации с использованием сертификатов при работе под Wine.
  6. Исправлено отображение стакана цен при ограничении его глубины одним уровнем.
  7. На панель инструментов "Стандартная" добавлена команда "Сохранить как рисунок". Делать снимки графиков и делиться ими в сообществе стало еще легче.




  8. Исправлено применение сдвига времени при импорте баров и тиков. Ранее в некоторых случаях сдвиг не применялся.




  9. Исправлено подвисание терминала при большом количестве новостей экономического календаря.

MQL5

  1. Добавлена нативная поддержка .NET библиотек с "умным" импортом функций. Теперь библиотеки .NET можно использовать без написания специальных оберток — MetaEditor берет это на себя.

    Для работы с функциями .NET библиотеки достаточно импортировать саму DLL без указания конкретных функций. MetaEditor автоматически импортирует все функции, с которыми возможна работа:
    • Простые структуры (POD, plain old data) — структуры, которые содержат только простые типы данных.
    • Публичные статические функции, в параметрах которых используются только простые типы и структуры POD или их массивы

    Для вызова функций из библиотеки просто импортируйте ее:
    #import "TestLib.dll"
    
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    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 библиотек продолжается, в будущих версиях планируется расширить возможности их использования.

  2. В стандартную библиотеку добавлена поддержка работы с функциями 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-битной архитектурой.

  3. Добавлена поддержка спецификаторов inline, __inline, __forceinline при синтаксическом анализе кода. Наличие этих спецификаторов в коде не будет вызывать ошибки, но и не будет влиять на компиляцию. На данный момент это позволит легче переносить С++ код в MQL5.
    Более подробная информация о спецификаторах доступна в MSDN.

  4. Проведена существенная оптимизация исполнения MQL5-программ. В некоторых случаях прирост производительности может достигать 10%. Чтобы получить прирост скорости, перекомпилируйте ваши программы в новой версии MetaEditor.
    К сожалению, дополнительная оптимизация привела к потере совместимости новых программ с предыдущими версиями терминала. Все программы, скомпилированные в MetaEditor версии 1912 и выше, не будут запускаться в терминалах версии ниже 1912. При этом программы, скомпилированные ранее в предыдущих версиях MetaEditor, будут в работать в новых терминалах.

  5. Проведена большая работа по оптимизации множества функций MQL5.
  6. Добавлены новые свойства для прикрепления/открепления графиков от основного окна терминала и управления их положением.

    В перечисление 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 — нижняя координата терминала относительно виртуального экрана.

  7. Добавлено поле 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;            // тип заявки из перечисления ENUM_BOOK_TYPE
       double           price;           // цена
       long             volume;          // объем
       double           volume_real;     // объем с повышенной точностью
      };

  8. В перечисление ENUM_SYMBOL_INFO_DOUBLE добавлены новые свойства:

    • SYMBOL_VOLUME_REAL — объем последней совершенной сделки;
    • SYMBOL_VOLUMEHIGH_REAL — максимальное значение объема совершенной сделки за текущие сутки;
    • SYMBOL_VOLUMELOW_REAL — минимальное значение объема совершенной сделки за текущие сутки.

    Для получения этих свойств используйте функцию SymbolInfoDouble.

  9. В перечисление ENUM_MQL_INFO_INTEGER добавлено свойство MQL_FORWARD — признак того, что программа находится в режиме форвард-тестирования.
  10. Для структур добавлено свойство pack( integer_value ). Оно позволяет задать выравнивание расположения полей внутри структуры, это бывает необходимо при работе с DLL. Для integer_value возможны значения 1, 2, 4, 8 и 16.
    Если свойство не определено, по умолчанию используется вырванивание в 1 байт — pack(1).

    Пример использования:
    //+------------------------------------------------------------------+
    //| Default packing                                                  |
    //+------------------------------------------------------------------+
    struct A
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Specified packing                                                |
    //+------------------------------------------------------------------+
    struct B pack(4)
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print("sizeof(A)=",sizeof(A));
       Print("sizeof(B)=",sizeof(B));
      }
    //+------------------------------------------------------------------+
    Вывод:
    sizeof(A)=5
    sizeof(B)=8
    Более подробная информация о выравнивании в структурах доступно в MSDN.

  11. Ослаблены требования к приведению перечислений. При неявном приведении компилятор автоматически подставит значение правильного перечисления и выведет предупреждение.

    Для следующего кода:
    enum Main
      {
       PRICE_CLOSE_,
       PRICE_OPEN_
      };
    
    input Main Inp=PRICE_CLOSE;
    //+------------------------------------------------------------------+
    //| Start function                                                   |
    //+------------------------------------------------------------------+
    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
    При неправильном использовании перечислений в параметрах функций компилятор по-прежнему будет выдавать ошибку.

  12. Исправлены ошибки компиляции шаблонных функций. Теперь при использовании перегруженных шаблонных функций инстанцируется только нужная перегрузка, а не все имеющиеся.
    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>(); }  

  13. Оптимизированы некоторые случаи доступа к тиковой истории через функции CopyTicks*.
  14. Добавлена новая функция TesterStop, которая позволяет досрочно завершить тестирование/проход оптимизации. При ее вызове вся накопленная торговая статистика и результат OnTester передаются в клиентский терминал как при штатном заврешении тестирования/оптимизации.
  15. Добавлено новое свойство для пользовательских индикаторов #property tester_everytick_calculate. Оно используется в тестере стратегий и позволяет принудительно влючить расчет индикаторов на каждом тике.

Tester

  1. Теперь при невизуальном тестировании/оптимизации все используемые индикаторы (стандартные и пользовательские) рассчитываются только по запросу данных. Исключение составляют индикаторы, содержащие вызовы функции EventChartCustom и использующие обработчик OnTimer. Ранее в тестере стратегий при приходе любого тика (даже от чужого инструмента) все индикаторы рассчитывались безусловно. Нововведение позволило существенно ускорить тестирование и оптимизацию.

    Чтобы принудительно включить расчет индикаторов на каждом тике, добавьте для программы свойство #property tester_everytick_calculate.

    Индикаторы, скомпилированные предыдущими версиями компилятора, будут рассчитываться как раньше — на каждом тике.

  2. Исправлен учет точности валюты депозита при тестировании/оптимизации и формировании соответствующих отчетов.
  3. Оптимизирована и ускорена работа тестера стратегий.
  4. Исправлен ряд ошибок тестирования и оптимизации.

MetaEditor

  1. Исправлен поиск слова целиком. Теперь при поиске знак подчеркивания учитывается как обычный символ, а не разделитель слов.

Обновлена документация.