MetaTrader 5 build 2170: Области видимости в MQL5, глобальное обновление тестера стратегий и встроенного хостинга

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

5 октября 2019

Terminal

  1. Полностью переработано управление встроенным сервисом Виртуального хостинга. Вся информация об арендованном терминале, а также функции миграции окружения, остановки и запуска теперь доступны в отдельной вкладке окна "Инструменты". 

    Ранее для работы с виртуальным хостингом использовалось контекстное меню счета в Навигаторе. Теперь же вся необходимая информация и команды управления всегда находятся у вас на виду во вкладке "VPS":




    В левой части доступна основная информация о подписке:

    • Данные по подключению: сравнение сетевых задержек между вашим терминалом на хостинг-сервере и терминалом на локальном компьютере.
    • Торговый счет, для которого арендован хостинг, и тарифный план.
    • Уникальный идентификатор подписки. Нажав на него, вы перейдете в раздел "Хостинг" в своем профиле на MQL5.community, где можно управлять подпиской.
    • Дата оформления и текущее состояние. Если ваш хостинг остановлен, вы немедленно об этом узнаете.

    Кнопкой Старт/Стоп вы можете быстро останавливать и запускать виртуальный терминал.

    В правой части показывается информация об оборудовании на хостинг-сервере, а также графики потребления ресурсов вашим терминалом. Если ваш эксперт или индикатор будет использовать чрезмерное количество памяти или процессорного времени, вы сразу это увидите и сможете своевременно отреагировать.

    Здесь же доступна информация о последней миграции торгового окружения, а также команды для ее повторного проведения. Теперь вы не забудете перенести окружение после покупки хостинга.

    Аренда виртуального хостинга теперь также осуществляется через вкладку "VPS". Сам процесс при этом не изменился, по-прежнему требуется всего пара шагов. Просто выберите тариф и подходящую систему для оплаты. Наилучший сервер для подключения  именно к вашему брокеру будет подобран автоматически.




  2. Добавлена возможность быстрого перехода к пополнению/снятию средств с торгового счета на сайте брокера.

    Теперь вам не нужно искать соответствующие функции в личном кабинете на сайте брокера. Команды для быстрого перехода к страницам пополнения счета и вывода средств стали доступны прямо в терминалах — в меню счетов в Навигаторе и на вкладке торговли в Инструментах:



    • Команды пополнения/снятия доступны только в том случае, если соответствующие функции включены для торгового счета на стороне брокера.
    • Торговый терминал не производит никаких операций пополнения/снятия средств со счета. Встроенные функции лишь перенаправляют пользователя на соответствующие веб-страницы брокерской компании.
  3. В спецификацию торгового инструмента добавлены новые поля:

    Категория
    Свойство используется для дополнительной маркировки финансовых инструментов. Например, в нем могут быть указаны секторы рынка, к которым относится символ: Agriculture, Oil & Gas и т.д. Показывается, только если соответствующая информация предоставляется брокером.

    Биржа
    Здесь указывается название биржи или площадки, на которой торгуется символ. Показывается, только если соответствующая информация предоставляется брокером.

    Комиссия
    Здесь отображается информация о комисcиях, взимаемых брокером при совершении сделок по инструменту. Показываются все подробности расчета:

    • Комиссии могут быть одноуровневыми и многоуровневыми, т.е. взиматься в одинаковом размере независимо от объема сделки/оборота или разниться в зависимости от их величины. Соответствующая информация выводится в спецификации.
    • Комиссии могут взиматься сразу при совершении сделки или в конце торгового дня/месяца.
    • Комиссии могут взиматься в зависимости от направления сделки: за вход, за выход или за оба типа операций.
    • Комиссии могут взиматься за каждый лот или за каждую сделку.
    • Комиссии могут взиматься в разных величинах: в деньгах, процентах или пунктах.

    Например, следующая запись означает, что комиссия начисляется немедленно при совершении сделок входа и выхода. При объеме сделки от 0 до 10 лотов комиссия взимается в размере 1.2 USD за операцию. При объеме сделки от 11 до 20 лотов комиссия будет взиматься в размере 1.1 USD за каждый лот сделки.
    Комиссия | Немедленно за объем, сделки входа/выхода
    0  - 10  | 1.2 USD за сделку
    11 - 20  | 1.1 USD за лот



  4. В спецификацию инструментов добавлены дополнительные поля для опционов:

    • Тип опциона — кол или пут
    • Базис — базовый инструмент опциона
    • Цена страйк — цена исполнения опциона

  5. Добавлена поддержка трансляции "греков" для опционов: дельта, гамма, вега, тета, ро. Теперь для таких инструментов брокеры могут передавать дополнительную информацию в разделе статистики в обзоре рынка, что даст трейдерам больше возможностей для анализа:



  6. Теперь инструмент "Перекрестие" показывает расстояние между ценовыми уровнями не только в пипсах, но и в процентах:




  7. Теперь при совершении операций в режимах исполнения "По рынку" и "Биржевое" в диалогах торговли показывается итоговая цена сделки, если она известна на момент получения ответа от брокера:




  8. Исправлена ошибка, из-за которой команда "Показать все" в Обзоре рынка в некоторых случаях не выводила в список все доступные торговые инструменты.

MQL5

  1. Изменена работа области видимости, что делает MQL5 еще более приближенным к C++. Программисты MQL5 получат гораздо больше свободы по использованию сторонних библиотек. Больше не нужно будет их модифицировать и приводить все идентификаторы к уникальному виду.

    Пример: в коде объявлены две структуры с одинаковым именем, но в разных классах. Ранее такое объявление выдавало ошибку компиляции "identifier already used". Теперь такой код будет успешно скомпилирован и исполнен. При этом для правильного обращения к нужной переменной/структуре/функции не из ее области видимости должен указываться класс, в данном случае — CBar::Item.
    class CFoo
      {
    public:
       struct Item { int x; };
      };
    //+------------------------------------------------------------------+
    class CBar
      {
    public:
       struct Item { int x; };
      };
      
    CBar::Item item;  // правильное объявление структуры Item из класса Bar
    Item       item;  // некорректное объявление
    Также добавлена поддержка пространства имен (namespace), что дает еще больше свободы при использовании сторонних кодов/библиотек в своих программах.

    #define PrintFunctionName() Print(__FUNCTION__)
    
    namespace NS
    {
    void func()
      {
       PrintFunctionName();
      }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void func()
      {
       PrintFunctionName();
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       func();
       NS::func();
    
       C c;
       NS::C ac;
      }
    В результате исполнения программа выведет следующие строки:
    2019.09.18 13:39:35.947    TestScript (AUDCAD,H1)    func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    C::C
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::C::C

  2. Ускорен доступ к данным таймсерий при помощи функций iTime, iOpen, iHigh, iLow, iClose, iVolume, iTickVolume, iSpread.

  3. Добавлена поддержка атрибута "=delete". Он позволяет запретить использование конкретных методов класса.
    class A
      {
       void              operator=(const A &)=delete;    // запрещаем оператор копирования объекта
      };
    
    class B : public A
      {
      };
    
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       A a1,a2;
       B b1,b2; 
      
       a1=a2;
       b1=b2;
      }
    В этом примере для строк "a1=a2" и "b1=b2" компилятор выдаст ошибки:
    attempting to reference deleted function 'void A::operator=(const A&)'
       function 'void A::operator=(const A&)' was explicitly deleted here

    attempting to reference deleted function 'void B::operator=(const B&)'
       function 'void B::operator=(const B&)' was implicitly deleted because it invokes deleted function 'void A::operator=(const A&)'

  4. В перечисление ENUM_SYMBOL_INFO_STRING добавлены следующие значения:

    • SYMBOL_CATEGORY — категория символа. Используется для дополнительной маркировки финансовых инструментов. Например, в нем могут быть указаны секторы рынка, к которым относится символ: Agriculture, Oil & Gas и т.д.
    • SYMBOL_EXCHANGE — название биржи или площадки, на которой торгуется символ.

  5. Добавлена поддержка закрытия позиций по правилу FIFO.

    • В перечисление ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_FIFO_CLOSE — признак того, что позиции можно закрывать только по правилу FIFO. Если значение свойства равно true, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета позиций (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) свойство всегда равно false.
    • Добавлен новый код возврата сервера TRADE_RETCODE_FIFO_CLOSE — запрос отклонен, так как для торгового счета установлено правило "Разрешено закрывать существующие позиции только по правилу FIFO".

    Закрытие позиций может осуществляться тремя основными способами:

    • Закрытие через клиентский терминал — это закрытие позиций трейдером вручную, при помощи торгового робота, через сервис "Сигналы" и т.д. При попытке закрыть позиции не по правилу FIFO трейдер получит соответствующую ошибку.
    • Закрытие при срабатывании Стоп Лосса или Тейк Профита — эти ордера обрабатываются на стороне сервера, соответственно и закрытие позиций в таком случае инициируется не трейдером (терминалом), а самим сервером. Если для позиции сработал Стоп Лосс или Тейк профит, и эта позиция не соответствует правилу FIFO (по тому же инструменту есть более ранние позиции), то она не будет закрыта.
    • Закрытие при срабатывании Стоп аута — такие операции также обрабатываются на стороне сервера. В обычном режиме, когда закрытие по правилу FIFO отключено, при наступлении Стоп аута позиции закрываются, начиная с самой убыточной. При включении этой опции у закрываемых убыточных позиции будет дополнительно проверяться время их открытия. Сервер определяет убыточные позиции по каждому символу, находит для каждого символа наиболее старую позицию, а затем из найденных позиций закрывает ту, что дает наибольший убыток.

  6. Добавлена возможность группировки параметров через "input group". Это позволяет визуально отделить одни параметры от других на основе заложенной в параметры логики.

    Пример советника, у которого блок входных параметров разбит по их назначению:
    input group           "Signal"
    input int             ExtBBPeriod    =20;         // Bollinger Bands period
    input double          ExtBBDeviation =2.0;        // deviation
    input ENUM_TIMEFRAMES ExtSignalTF    =PERIOD_M15; // BB timeframe
    
    input group           "Trend"
    input int             ExtMAPeriod    =13;         // Moving Average period
    input ENUM_TIMEFRAMES ExtTrendTF     =PERIOD_M15; // MA timeframe
    
    input group           "ExitRules"
    input bool            ExtUseSL       =true;       // use StopLoss
    input int             Ext_SL_Points  =50;         // StopLoss in points
    input bool            ExtUseTP       =false;      // use TakeProfit
    input int             Ext_TP_Points  =100;        // TakeProfit in points
    input bool            ExtUseTS       =true;       // use Trailing Stop
    input int             Ext_TS_Points  =30;         // Trailing Stop in points
    
    input group           "MoneyManagement"
    sinput double         ExtInitialLot  =0.1;        // initial lot value
    input bool            ExtUseAutoLot  =true;       // automatic lot calculation
    
    input group           "Auxiliary"
    sinput int            ExtMagicNumber =123456;    // EA Magic Number
    sinput bool           ExtDebugMessage=true;      // print debug messages
    При запуске такого советника в тестере стратегий появляется возможность двойным кликом по имени группы сворачивать и разворачить блок входных параметров, а также одним кликом по чекбоксу группы выделять все её параметры для оптимизации.




  7. Исправлена ошибка, возникавшая при импорте функций из DLL, чьи имена пересекались с функциями MQL. Пример:
    #import "lib.dll"
    int func();
    #import
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int func()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print( func() );
      }
    Ранее компиляция такого кода выдавала ошибку:
    'func' - ambiguous call to overloaded function with the same parameters
    could be one of 2 function(s)
       int func()
       int func()
    Теперь вместо ошибки по умолчанию будет использоваться встроенная функция MQL, как имеющая больший приоритет. А для вызова импортированной функции необходимо явно указать область видимости:
    void OnStart()
      {
       Print( lib::func() );
      }
  8. Исправлено указание времени у новостей экономического календаря. Теперь время события передается с учетом часового пояса торгового сервера, к которому подключен терминал, а не часового пояса локального компьютера.
  9. Исправлено чрезмерное потребление памяти в функциях CopyTicks и CopyTicksRange.

Signals

  1. Исправлено отображение графиков сигналов при работе в Wine (Mac OS и Linux).

Tester

  1. Существенно обновлен тестер стратегий: добавлена стартовая страница, переработана страница настроек, повышено удобство использования.

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

    Мы выделили несколько основных задач по тестированию и оптимизации стратегий и представили их графически на первой странице. Помимо этого, со стартовой страницы теперь можно быстро перезапустить одну из предыдущих задач. Если вы запускали много задач, и все они не умещаются в списке, воспользуйтесь строкой поиска. Она позволяет найти тест по любому параметру: имени программы, инструменту, таймфрейму, типу моделирования и т.д.




    Отсечение лишних параметров
    Выбрав одну из задач на стартовой странице, вы переходите к более тонкой подстройке параметров тестирования: выбору эксперта, инструмента, периода и т.д. Для облегчения работы все параметры, которые не требуются для выбранной задачи, скрываются. Например, если вы выбрали математические вычисления, то вам потребуется задать только два параметра: выбрать программу для тестирования и режим оптимизации. Настройки периода тестирования, задержек и генерации тиков будут скрыты.




    Удобство настройки тестирования
    Для удобства некоторые параметры на странице настройки были перегруппированы. Также для параметров задержки и визуализации добавлены расширенные пояснения. Помимо этого, настройки тестирования теперь можно вручную сохранять и загружать, что позволит быстро возвращаться к предыдущим результатам.




    Отсюда же вы можете быстро перейти к редактированию программы в MetaEditor.

    Расчет прибыли в пипсах
    Теперь в настройках вы можете включить расчет прибыли в пипсах. Это позволяет ускорить процесс тестирования за счет того, что прибыль не будет пересчитываться в валюту депозита через другие курсы (а соответственно не нужно скачивать их ценовую историю). Также в этом режиме не рассчитываются свопы и комиссии.




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

    Общие улучшения
    Кнопка запуска/остановки тестирования, а также полоса прогресса перенесены на панель вкладок. Это позволит контролировать процесс, в каком бы разделе тестера стратегий вы ни находились. Помимо этого, команды запуска и остановки тестирования добавлены в контекстные меню разделов настройки и входных параметров.




  2. График результатов оптимизации теперь отображается в основной рабочей области терминала, а не в отдельном разделе тестера стратегий. Это позволяет использовать значительно больше пространства для отображения, что делает анализ данных более удобным. Помимо этого обновлена система 3D-визуализации.



  3. Добавлено сохранение кэша оптимизации для режима "Все символы в Обзор рынка".
  4. Добавлено сохранение кэша тестирования.

    Ранее результаты выполненных задач сохранялись в файлы только при оптимизации советников. Теперь кэш-файлы сохраняются и при одиночном тестировании, позволяя в любой момент вернуться к предыдущим расчетам — посмотреть всю статистику, а также графики баланса, эквити и загрузки депозита. Также в будущем это позволит сравнивать результаты тестов между собой.

    Для загрузки предыдущих результатов тестирования используйте новую стартовую страницу тестера: нажмите "Предыдущие результаты" и выберите нужный файл:




  5. Значительно ускорены тестирование и оптимизация, в том числе — с использованием облачной вычислительной сети MQL5 Cloud Network.
  6. Исправлены ошибки и оптимизирована работа с фреймами.

MetaEditor

  1. Добавлена возможность настраивать стилизатор кода.

    В MetaEditor встроен стилизатор кода, позволяющий автоматически оформлять исходный текст программы в соответствии с определенным стандартом. Теперь помимо обычного стиля оформления вы можете использовать и другие популярные стандарты. Для этого откройте настройки MetaEditor и выберите нужный стиль:




    Помимо этого, для стилизатора теперь можно задать следующие параметры:

    Пробелов на отступ
    Определяет количество пробелов, вставляемых при выравнивании вложенных конструкций:
    if(condition)
      {
       //---
      }

    Заменять табуляцию пробелами
    При включении этой опции стилизатор будет заменять все символы табуляции в коде на символы пробелов. Количество символов на табуляцию определяется в разделе "Общие".

    Удалять пустые строки
    При включении этой опции стилизатор будет удалять из кода все строки, в которых есть только символ переноса строки.

    Вставлять пробелы после запятых и точек с запятой
    При включении этой опции стилизатор будет визуально отделять конструкции с перечислением элементов. Например:
    // до стилизации
    ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop);
    // после стилизации
    ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);

    Вставлять пробелы вокруг операторов объявления
    При включении этой опции стилизатор будет вставлять пробелы вокруг операторов присваивания, равенства, сравнения и т.д. Например:
    // до стилизации
    if(x==1&y!=2)
      {
       int a=0;
      }
    // после стилизации
    if(x == 1 & y != 2)
     {
      int a = 0;
     }

  2. В контекстное меню закладок файлов добавлена команда "Показать в Навигаторе". Она позволяет быстро найти открытый на редактирование файл в структуре папок редактора.




  3. Исправлено отображение ключевого слова union в подсказках.

Добавлен перевод пользовательского интерфейса на 18 новых языков:

  • Европейский регион — шведский, литовский, датский, латвийский, эстонский, сербский, словенский, словацкий, финский, грузинский
  • Азиатский регион — яванский, маратхи, бенгальский, пенджабский, тамильский, телугу
  • Африканский регион — суахили, хауса

В общей сложности интерфейс платформы теперь переведен на 50 языков, в сумме они являются родными для более чем 4 миллиардов человек.

Для переключения интерфейса на свой язык воспользуйтесь меню "Просмотр / Язык" в верхней части терминала.

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

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

Обновление будет доступно через систему Live Update.