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

История обновлений десктопной, мобильной и веб-платформ

17 марта 2023

MetaTrader 5 build 3640: веб-терминал на 11 языках

Web Terminal

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


    Интерфейс веб-терминала доступен на 11 языках


  2. Оптимизирован механизм подключения к торговому серверу.

MQL5

  1. MQL5: Добавлены флаги COPY_TICKS_VERTICAL и COPY_RATES_VERTICAL для методов CopyTicks, CopyTicksRange и CopyRates соответственно.

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

    const long   ExtOutputShape[] = {1,1};    // форма выходных данных модели
    const long   ExtInputShape [] = {1,10,4}; // форма входных данных модели
    #resource "Python/model.onnx" as uchar ExtModel[]// модель в виде ресурса
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- получаем 10 баров
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
          return(-1);
    //--- подаем на вход набор векторов OHLC
       matrix x_norm=rates.Transpose();
       vector m=x_norm.Mean(0);               
       vector s=x_norm.Std(0);
       matrix mm(10,4);
       matrix ms(10,4);

    Теперь достаточно при вызове метода указать дополнительный флаг COPY_RATES_VERTICAL (COPY_TICKS_VERTICAL для тиков), чтобы избавиться от лишней операции трансформации данных:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- получаем 10 баров
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
          return(-1);
    //--- подаем на вход набор векторов OHLC
  2. Добавлено значение CHART_SHOW_TRADE_HISTORY в перечисление ENUM_CHART_PROPERTY_INTEGER. Свойство управляет отображением сделок из торговой истории на графике. Для получения и установки свойства используйте функции ChartGetInteger и ChartSetInteger. Подробнее об отображении сделок на графике читайте в документации платформы.

MetaEditor

  • Исправлено зависание интерфейса, происходившее в редких случаях при компиляции файлов.

Terminal

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

10 марта 2023

MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5

Terminal

  1. Исправлена ошибка при подсчете итоговой прибыли в торговом отчете.
  2. Обновлены фундаментальные данные по торговым инструментам, доступные через Обзор рынка.
  3. Исправлен запуск торговой платформы под Wine 7.0.1 при работе в Linux-системах.
  4. Исправлено добавление символов в Обзор рынка через строку поиска. Символ, найденный по описанию, было невозможно добавить в список кликом мыши на его строке.

MQL5

  1. Добавлена поддержка работы с моделями ONNX (Open Neural Network Exchange).

    ONNX — открытая библиотека для построения нейронных сетей глубокого обучения. Этот формат поддерживается множеством платформ, включая Chainer, Caffee2 и PyTorch. Создав ONNX модель при помощи специализированных инструментов, вы можете интегрировать ее в свою MQL5-программу и использовать для принятия торговых решений.

    Описание всех поддерживаемых функций доступно в документации. Пример работы с тестовой моделью доступен в публичных проектах в MetaEditor. Найдите проект ONNX.Price.Prediction в разделе "Инструменты \ Публичные проекты", а затем нажмите "Присоединиться" в контекстном меню. Проект загрузится на компьютер и появится в Навигаторе:


    Пример работы с ONNX моделю в публичных проектах


    Скомпилируйте проект и запустите его на EURUSD H1, чтобы посмотреть результат.

    Помимо готовой модели и MQL5-кода для ее запуска, в проекте также доступен Python скрипт PricePredictionTraining.py. Он показывает, как самостоятельно создать модель ONNX. Для работы скрипта установите на свой компьютер Python, а также необходимые модули из командной строки:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    Подробные инструкции по работе с ONNX доступны в документации.

  2. Добавлена поддержка нового алгоритма умножения матриц General Matrix Multiplication (GeMM). Он позволяет значительно ускорить вычисления на большинстве процессоров за счет распараллеливания задач и более правильного использования кэшей L1/L2/L3. Скорость вычисления при этом сравнима с такими известными пакетами, как Math Kernel Library (MKL) и OpenBLAS. В ближайшее время мы опубликуем подробные сравнительные тесты.

    Новый алгоритм на данный момент поддерживается в методе matrix::GeMM. Если ваш процессор поддерживает инструкции AVX и FMA (большинство процессоров, выпущенных после 2013 года), алгоритм будет задействован автоматически.

  3.  Добавлена поддержка передачи матриц и векторов в DLL. Теперь вы можете импортировать функции, использующие этот тип данных, из внешних библиотек.

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

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    Для правильной обработки матриц и векторов, кроме их буферов, следует передавать их размеры.

  4. Добавлена новая функция CopySeries для копирования синхронизированных таймсерий из MqlRates в отдельные массивы.

    Функция CopySeries позволяет за один раз получать только нужные таймсерии в разные указанные массивы, при этом они все синхронизированы между собой. Это означает, что все значения в полученных массивах по конкретному индексу N будут принадлежать одному и тому же бару на указанной паре символ/таймфрейм. В этом случае не требуется заботиться о том, чтобы все полученные таймсерии были синхронизированы по времени открытия бара.

    В отличие от CopyRates, которая возвращает полный набор таймсерий в виде массива MQLRates, функция CopySeries позволяет программисту получать только нужные таймсерии на основе комбинации флагов, указывающих тип запрашиваемых таймсерий. При этом порядок массивов, передаваемых в функцию, должен соответствовать порядку полей в структуре MqlRates:

    struct MqlRates
      {
       datetime time;         // время начала периода
       double   open;         // цена открытия
       double   high;         // наивысшая цена за период
       double   low;          // наименьшая цена за период
       double   close;        // цена закрытия
       long     tick_volume;  // тиковый объем
       int      spread;       // спред
       long     real_volume;  // биржевой объем
      }

    Таким образом, если необходимо получить значения таймсерий time, close и real_volume для последних 100 баров текущего символа/таймфрейма, вызов должен быть следующим:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    При этом важен порядок массивов "time, close, volume" — он должен соответствовать порядку полей в структуре MqlRates. А вот порядок значений в маске rates_mask значения не имеет, маска могла быть такой :

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    Пример

    //--- input parameters
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- массивы для получения таймсерий из ценовой структуры Rates
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //---запросим цены закрытия в массив типа double
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- теперь запросим еще цены открытия, а цены закрытия в массив типа float
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- сравним полученные данные
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Результат
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  5. Исправлена ошибка, в редких случаях приводившая к получению некорректного тикета ордера после отправки запроса функцией OrderSend. Ошибка могла возникать при параллельной торговле на одном счете через разные платформы.
  6. Исправлена ошибка импорта EX5-библиотек. Она возникала, если имя импортируемой библиотеки совпадало с именем файла, в который она импортируется.

MetaEditor

  1.  Добавлена рассылка Push-уведомлений участникам групповых проектов. Теперь каждый участник всегда будет в курсе любых изменений в файлах или настройках проекта. Для получения уведомлений укажите свой MetaQuotes ID в разделе "Настройки \ Безопасность" вашего профиля MQL5.community.


    Push-уведомления об изменениях в проекте


  2. Обновлены иконки файлов в Навигаторе. Новые более простые метафоры облегчат восприятие информации.

Tester

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

MetaTrader 5 Web Terminal build 3620

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


    Новые цветовые схемы для веб-терминала


  2. Переработано окно спецификации торгового инструмента. Все данные перекомпонованы в компактные логические блоки для более удобного просмотра.


    Обновленное окно спецификации торгового инструмента


  3. Исправлено открытие реальных счетов через веб-терминал. В некоторых случаях после заполнения регистрационной формы сервер мог возвращать ошибку.
  4. Исправлена ошибка в торговом диалоге. Если пользователь открывал диалог модификации позиции, а затем закрывал позицию кнопкой "X" в окне инструментов, содержимое диалога не сбрасывалось. Теперь в этом случае диалог будет автоматически возвращаться в режим выставления нового ордера.
  5. Исправлено отображение поля Server в диалоге управления счетами.
  6. Исправлено отображение текущего таймфрейма на панели инструментов.
  7. Исправлено отображение объема в количестве единиц базового актива в торговом диалоге.
  8. Исправлена модификация уровней "Стоп Лосс" и "Тейк Профит". В некоторых случаях модификация одного значения могла приводить к сбросу второго.
  9. Исправлено отображение предупреждения о рисках инвестора.

6 марта 2023

MetaTrader 5 для iPhone/iPad: улучшение торговых и аналитических функций графиков
  1. Добавлена возможность выставлять стоп и стоп-лимитные ордера с графика.

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


    Выставляйте стоп и стоп-лимитные ордера с графика


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


    Управляйте позициями и ордерами с графика


  3. Улучшена функция сдвига правой границы ценового графика. Теперь для изменения сдвига достаточно прокрутить график к последней цене до появления вертикального разделителя. Далее потяните за треугольник у нижней шкалы графика:


    https://www.metatrader5.com/c/17/1/chart-shift.png


  4. Добавлена возможность копировать аналитические объекты на графике. Это поможет быстрее наносить разметку. Вызовите меню объекта долгим нажатием на нем и выберите "Копировать":

    Создавайте копии аналитических объектов


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


    Управляйте отображением индикаторов на разных таймфреймах


  6. Добавлено отображение комиссий по инструменту в окне спецификации.


    Узнайте размер комиссии в спецификации инструмента


  7. Добавлена ссылка на восстановление пароля к счету. Доступ можно восстановить только через брокера, у которого был открыт счет. Ссылка покажет контактные данные, по которым можно обратиться за помощью.


    Помощь при восстановлении пароля


  8. Добавлена возможность поделиться ссылкой на канал в сообществе MQL5.community.


    Делитесь ссылкой на свой канал через приложение


  9. Улучшен пользовательский опыт при подключении к счету с ограниченной торговлей.

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

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


    Помощь пользователю при ограниченной торговле


  10. Улучшена работа с SSL-сертификатами, используемыми при расширенной аутентификации.

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


    Улучшена работа с SSL-сертификатами


    Также появилась возможность импорта сертификата из файла PFX. Для этого достаточно сохранить его в приложении "Файлы", а затем воспользоваться функцией импорта в стартовом диалоге.

    Помимо этого, появилась возможность экспортировать сертификаты в файлы, чтобы использовать их на других устройствах. Для этого перейдите в раздел "Настройки \ Сертификаты" и нажмите "Экспорт" в меню сертификата.

  11. Построение ценовых графиков переведено на Metal — последнее поколение графического API, используемого в устройствах от Apple. Это существенно увеличит производительность при отображении графиков, индикаторов и объектов.
  12. Исправлена подстановка уровней Стоп Лосс и Тейк Профит в стакане цен. Теперь для счетов, работающих в режиме FIFO, значения стоп-уровней будут автоматически устанавливаться в соответствии со стоп-уровнями уже открытых позиций по тому же инструменту. Это необходимо для соблюдения правила FIFO.
  13. Исправлено реквотирование. При получении реквота пользователю дается короткое время на решение, принимать новые цены или нет. При отсутствии решения запрос автоматически отклоняется, а окно реквота закрывается.
  14. Исправлено отображение времени в разделе "График" при использовании темной темы интерфейса.

16 декабря 2022

MetaTrader 5 build 3550: улучшения и исправления

Terminal

  1. Terminal: Обновлены переводы пользовательского интерфейса.
  2. Исправления по крешлогам.

Web Terminal

9 декабря 2022

MetaTrader 5 build 3540: 2FA/TOTP аутентификация и улучшенный Обзор рынка в веб-терминале

Web Terminal

  1. Добавлена поддержка 2FA/TOTP-аутентификации с помощью Google Authenticator и других подобных приложений.

    Использование двухфакторной аутентификации позволяет дополнительно защитить ваш торговый аккаунт от неавторизованного доступа даже в случае утечки логина и постоянного пароля к нему. Существует множество мобильных приложений, которые позволяют проводить двухэтапную аутентификацию с помощью алгоритма Time-based One-time Password Algorithm (TOTP). Среди наиболее известных Google Authenticator, Microsoft Authenticator, LastPass Authenticator и Authy. Теперь в клиентском терминале MetaTrader 5 можно авторизоваться с помощью одноразовых паролей, получаемых из таких Authenticator-приложений.

    Чтобы включить двухэтапную аутентификацию, сначала авторизуйтесь в веб-терминале MetaTrader 5 обычным способом. Затем нажмите на свой счет в меню и выберите "Enable 2FA/TOTP " в открывшемся диалоге. Запустите Authenticator на мобильном телефоне, нажмите в нем кнопку "+" для добавления вашего торгового счета и отсканируйте QR-код из терминала. Введите полученный код в поле "One-time password" и нажмите кнопку "Enable 2FA" — секрет для вашего счета будет добавлен на торговом сервере брокера.


    Добавлена поддержка 2FA/TOTP-аутентификации с помощью Google Authenticator и других подобных приложений


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


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


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

    Если вы решите удалить сохраненный секрет из приложения Authenticator, предварительно отключите использование 2FA/TOTP-аутентификации, используя соответствующую команду в меню счета. Если 2FA/TOTP-аутентификация недоступна на вашем счете, попросите брокера включить эту опцию.

  2. Расширено количество информации, отображаемой в Market Watch. Теперь помимо текущих цен Bid/Ask и процента изменения цены вы можете посмотреть:

    • Максимальную и минимальную цену Bid/Ask за текущую торговую сессию
    • Цены открытия текущей и закрытия предыдущей торговой сессии

    Для настройки отображаемой информации используйте контекстное меню:


    Дополнительная информация в Обзоре рынка


  3. Добавлен показ уведомления о рисках при включении соответствующей настройки на стороне брокера. Некоторые регуляторы требуют, чтобы трейдер прочел и принял уведомление перед тем, как приступить к торговле.
  4. Исправлено отображение верхней панели инструментов на моделях iPhone с "челкой" в верхней части экрана. В некоторых случаях она могла закрывать кнопки на панели.
  5. Исправлено отображение итоговых финансовых показателей счета (прибыль, эквити и т.д.) в браузере Google Chrome. В некоторых случаях значения могли не обновляться.

Terminal

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

MQL5

  1. В класс COpenCL стандартной библиотеки добавлены новые методы:

    • BufferFromMatrix — заполнение буфера устройства данными из матрицы
    • BufferToMatrix — чтение данных из буфера устройства в матрицу
    • ContextCreate — создание контекста устройства (первая часть метода Initialize)
    • ProgramCreate — создание программы на основе исходного кода OpenCL (вторая часть метода Initialize)
    • ContextClean — освобождение всех данных, принадлежащих контексту устройства (аналог метода Shutdown, но без удаления контекста)
    • GetDeviceInfoInteger — получение целочисленного свойства устройства
    • GetKernelInfoInteger — получение целочисленного свойства кернела
    • GetDeviceInfo — получение любого одиночного целочисленного свойства устройства, не присутствующего в перечислении ENUM_OPENCL_PROPERTY_INTEGER

    Пример использования GetDeviceInfo:
    long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
  2. Добавлены значения TERMINAL_CPU_NAME и TERMINAL_OS_VERSION в перечисление ENUM_TERMINAL_INFO_STRING. Они позволяют получить наименование процессора и операционной системы пользователя.
    void OnStart()
      {
       string cpu,os;
    //---
       cpu=TerminalInfoString(TERMINAL_CPU_NAME);
       os=TerminalInfoString(TERMINAL_OS_VERSION);
       PrintFormat("CPU: %s, OS: %s",cpu,os);
      }
    
    Результат:
    CPU: Intel Xeon  E5-2630 v4 @ 2.20GHz, OS: Windows 10 build 19045
  3. Исправлена работа параметра "table_or_sql" в функциях DatabasePrint и DatabaseExport. Теперь в нем можно передавать имя таблицы, а не только SQL-запрос.

MetaEditor

  1. Исправлена проверка на максимальное количество столбцов в базе данных, которые могут быть отображены. Теперь отобразить можно до 64 колонок.
  2. Исправлена работа точек останова в коротких конструкциях вида IF[ if(cond) break; ].

25 ноября 2022

MetaTrader 5 build 3520: добавлена 2FA/TOTP аутентификация с помощью Google Authenticator

Terminal

  1. Добавлена поддержка 2FA/TOTP-аутентификации с помощью Google Authenticator и других подобных приложений.

    Использование двухфакторной аутентификации позволяет дополнительно защитить ваш торговый аккаунт от неавторизованного доступа даже в случае утечки логина и постоянного пароля к нему. Существует множество мобильных приложений, которые позволяют проводить двухэтапную аутентификацию с помощью алгоритма Time-based One-time Password Algorithm (TOTP). Среди наиболее известных Google Authenticator, Microsoft Authenticator, LastPass Authenticator и Authy. Теперь в клиентском терминале MetaTrader 5 можно авторизоваться с помощью одноразовых паролей, получаемых из таких Authenticator-приложений.

    Чтобы включить двухэтапную аутентификацию, сначала авторизуйтесь в клиентском терминале MetaTrader 5 обычным способом. Затем правой кнопкой по торговому счету вызовите меню и выполните команду "Разрешить 2FA/TOTP". Запустите Authenticator на мобильном телефоне, нажмите в нем кнопку "+" для добавления вашего торгового счета и отсканируйте QR-код из терминала. Введите полученный код в поле "One-time password" и нажмите кнопку "Enable 2FA" — секрет для вашего счета будет добавлен на торговом сервере брокера.


    Добавлена поддержка 2FA/TOTP-аутентификации с помощью Google Authenticator и других подобных приложений

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



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

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

MQL5

  1. Исправлена работа функции CopyTicks для пользовательских торговых инструментов. В некоторых случаях при работе с кастомными символами вместо запрошенных данных возвращались начальные тики прошлой торговой сессии.

  2. Для получения информации о последней ошибке OpenCL в перечисления добавлены новые значения, которые позволяют получить код ошибки и текстовое описание.
    1. В перечисление ENUM_OPENCL_PROPERTY_INTEGER добавлено значение CL_LAST_ERROR (код 4094) 

      Для получения последней ошибки OpenCL через CLGetInfoInteger параметр handle игнорируется, то есть не имеет значения. Описание ошибок: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.
      Для неизвестного кода ошибки вернётся строка "unknown OpenCL error N", где вместо N будет код ошибки.

      Пример:
      //--- первый параметр handle игнорируется при получении кода последней ошибки
      int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

    2. В перечисление ENUM_OPENCL_PROPERTY_STRING добавлено значение CL_ERROR_DESCRIPTION (4093).
      Текстовое описание ошибки OpenCL можно получить с помощью CLGetInfoString. Описание ошибок: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

      При использовании CL_ERROR_DESCRIPTION в качестве параметра handle в CLGetInfoString следует передать код ошибки. Если вместо кода ошибки передать CL_LAST_ERROR, то функция вернёт описание последней ошибки.

      Пример:
      //--- получить код последней OpenCL ошибки
      int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
      string desc; // для получения текстового описания ошибки
      
      //--- используем код ошибки для получения текстового описания ошибки
      if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      
      
      //--- чтобы получить описание последней OpenCL ошибки без предварительного получения кода, нужно передать CL_LAST_ERROR  
      if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      Пока в качестве описания ошибки отдаётся имя внутреннего перечисления, расшифровку которого можно посмотреть на странице https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Например, если получено значение CL_INVALID_KERNEL_ARGS, описание для него "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid."

  3. Исправлена работа метода matrix::MatMul. При работе с матрицами большого размера на некоторых размерах терминал аварийно завершал работу.

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

18 ноября 2022

MetaTrader 5 build 3510: улучшения веб-терминала

MetaTrader 5 WebTerminal

  1. В мобильной версии в раздел торговой истории добавлена сортировка операций и фильтрация по глубине. Для настройки отображения истории воспользуйтесь командами на верхней панели:

    В мобильной версии в раздел торговой истории добавлена сортировка операций и фильтрация по глубине


    Операции можно отcортировать по основным параметрам: дате, тикету, символу, объему и т.д.

  2. Улучшен доступ к информации о ваших торговых счетах.

    • В десктопной версии данные текущего счета в меню-бутерброде теперь кликабельны. Нажав на счет, вы перейдете к просмотру его деталей.
    • В мобильной версии отображение текущего счета добавлено в разделе "Settings". Нажав на счет, вы перейдете к просмотру его деталей.


    Улучшен доступ к информации о ваших торговых счетах

  3. Исправлено отображение типа счета в окне управления счетами.
  4. Исправлено отображение эквити и свободной маржи после обновления страницы с веб-терминалом в мобильных браузерах.
  5. Исправлено отображение нижней панели в мобильном браузере Firefox.

Terminal

  1. Terminal: Исправлена ошибка в расчете графиков баланса и эквити в торговом отчете.

MQL5

  1. Изменилось поведение typename(expr). Теперь функция отдает полный тип с модификаторами и размерностями (для массивов):
    class A
      {
      };
    
    void OnStart(void)
      {
       const A *const arr[][2][3]={};
       Print(typename(arr));
      }
    
    Результат:
    "class A const * const [][2][3]"

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

11 ноября 2022

MetaTrader 5 build 3500: улучшения и исправления

Terminal

  1. В контекстное меню разделов "Торговля" и "История"  добавлена команда для доступа к новому торговому отчету:

    Добавлена команда для доступа к новому торговому отчету


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

  2. Исправлен расчет начального депозита в торговом отчете.
  3. Исправлена установка уровней "Стоп Лосс" и "Тейк Профит" при использовании панелей быстрой торговли на графике и в "Обзоре рынка". Уровни могли ошибочно наследоваться от ранее открытых позиций, даже если это не требовалось (функционал предназначен для счетов FIFO).
  4. Обновлены переводы пользовательского интерфейса.

MQL5

  1. Исправлена ошибка компилятора, которая позволяла обращаться к полю структуры по константной строке, значением которой является имя поля.
  2. Исправлена проверка состояния клавиш с помощью TerminalInfoInteger(TERMINAL_KEYSTATE_*).

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


MetaTrader 5 WebTerminal build 3500

  1. Исправлено закрытие позиций при получении реквота.
  2. Исправлено переподключение к серверу после разворачивания окна браузера, которое было неактивным в течение продолжительного времени.
  3. Исправлено отображение кредитных средств на счете.
  4. Множество других улучшений и исправлений.

4 ноября 2022

MetaTrader 5 build 3490: мобильная версия веб-терминала и новые методы матриц в MQL5

Мобильная версия веб-терминала

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

В новой версии веб-терминала добавлена полноценная поддержка мобильных устройств.

Помимо этого, в веб-терминал внесено множество исправлений и улучшений.

Новый веб-терминал MetaTrader 5 поддерживает все функции, которые нужны современному трейдеру. Приложение позволяет:

  • Работать с демонстрационными и реальными счетами
  • Получать котировки любых финансовых инструментов
  • Торговать на любых рынках
  • Проводить технический анализ котировок при помощи 30+ индикаторов и 20 графических объектов
  • Анализировать данные Экономического календаря


Terminal

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

    Расширены функции диспетчера задач. Теперь он позволяет отслеживать потребляемые ресурсы еще точнее.


  2. В настройки терминала добавлена вкладка OpenCL для управления доступными устройствами. Новый менеджер OpenCL позволяет явно указывать устройства, которые будут использоваться для расчетов.

    В настройки терминала добавлена вкладка OpenCL для управления доступными устройствами.

  3. Добавлена подстановка уровней Стоп Лосс и Тейк Профит в стакане цен для счетов, работающих в режиме FIFO (может быть включен на стороне брокера).

    Режим FIFO подразумевает, что позиции по каждому инструменту должны закрываться в том порядке, в каком они были открыты. Чтобы закрытие позиций по стоп-уровням всегда соответствовало правилу FIFO, на стороне клиентского терминала реализована следующая логика:

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

    Теперь при открытии стакана цен по инструменту, по которому уже есть позиции, в поля Стоп Лосс и Тейк Профит будут автоматически проставляться уровни существующих позиций (если таковые были установлены).

  4. Исправлено удаление уровней Стоп Лосс и Тейк Профит кнопками "Х" в разделе "Инструменты\Торговля". Ошибка возникала при отключенной функции быстрой торговли. Теперь при нажатии кнопки будет открываться торговый диалог с пустым значением соответствующего уровня.

  5. Внесены правки в торговый отчет — исправлены подписи на графиках и расчёт итоговой комиссии. Кроме того, в некоторых случаях показывался некорректный Profit в статистике отчета, а также неверные значения в тултипах при наведении на графики эквити и баланса.

MQL5

  1. Добавлены методы векторов и матриц CopyTicks и CopyTicksRange. Они позволяют легко копировать массивы тиковых ценовых данных в векторы и матрицы.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    Тип копируемых данных указывается в параметре flags при помощи перечисления ENUM_COPY_TICKS. Доступны следующие значения:
    COPY_TICKS_INFO    = 1,       // тики, вызванные изменениями Bid и/или Ask
    COPY_TICKS_TRADE   = 2,       // тики, вызванные изменениями Last и Volume
    COPY_TICKS_ALL     = 3,       // все тики, в которых есть изменения
    COPY_TICKS_TIME_MS = 1<<8,    // время в миллисекундах
    COPY_TICKS_BID     = 1<<9,    // цена Bid
    COPY_TICKS_ASK     = 1<<10,   // цена Ask
    COPY_TICKS_LAST    = 1<<11,   // цена Last
    COPY_TICKS_VOLUME  = 1<<12,   // объем
    COPY_TICKS_FLAGS   = 1<<13,   // флаги тика
    При выборе нескольких типов данных (доступно только для матриц) порядок строк в матрице будет соответствовать порядку значений в перечислении.

  2. Расширены возможности методов matrix::Assign и vector::Assign.
    Теперь матрице можно назначить одномерный массив или вектор:
    bool matrix::Assign(const vector &vec);
    Результатом будет однострочная матрица.
    Также вектору теперь можно назначить матрицу (будет выполнено сглаживание матрицы):
    bool vector::Assign(const matrix &mat);
    
  3. Добавлены методы Swap для векторов и матриц.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Каждый массив, вектор или матрица ссылаются на буфер памяти, который содержит элементы данного объекта. Метод Swap фактически меняет местами указатели на данные буферы, не проводя записи элементов в памяти. Поэтому матрица остается матрицей, а вектор вектором. При обмене матрицы и вектора вы получите однострочную матрицу с элементами вектора и вектор с элементами матрицы в плоском представлении (смотрите метод Flat).
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {25, 30, 35, 40},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- обменяем указатели на матрицы местами
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Метод Swap также позволяет работать с динамическими массивами (массив фиксированного размера в качестве параметра передавать нельзя). При этом массив может быть любой размерности, но согласованного размера. Это означает, что общий размер матрицы или вектора должен быть кратен нулевой размерности массива. Нулевой размерностью массива называется количество элементов, которые содержатся по первому индексу массива. Например, для динамического трехмерного массива double array[][2][3] нулевой размерностью будет произведение размеров второго и третьего измерения, то есть 2x3=6. Значит, такой массив можно использовать в методе Swap только с матрицами и векторами, общий размер которых кратен 6: 6, 12, 18, 24 и т.д.

    Покажем это на примере:
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- заполним матрицу 1x10 значением 7.0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- попробуем провести обмен между матрицей и массивом
      double array_small[2][5]= {{1, 2, 3, 4, 5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // размер матрицы не кратен размеру первого измерения массива
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- возьмем матрицу побольше и снова попробуем провести обмен
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // статический массив нельзя использовать для обмена с матрицей
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- еще одна попытка обменять массив и матрицу
      double array_dynamic[][10];    // динамический массив
      ArrayResize(array_dynamic, 3); // выставим размер первого измерения
      ArrayCopy(array_dynamic, array_static);
    //--- теперь для обмена используем динамический массив
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  нет ошибки
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. Добавлены методы LossGradient для векторов и матриц. Данный метод вычисляет вектор или матрицу частных производных функции потерь по предсказанным значениям. В линейной алгебре такой вектор называется градиентом и применяется в машинном обучении.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. Включено использование FOREIGN KEYS в SQLite, что позволяет строить связи между таблицами в SQL-запросах.   Пример:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. Исправлен выбор нужного метода класса в зависимости от константности метода и объекта.

MetaEditor

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

MetaTester

  1.  Повышена чувствительность у переключателя скорости тестирования в визуальном режиме.

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



17 сентября 2022

MetaTrader 5 build 3440: Новый отчет по торговому счету

Terminal

  1. Добавлен новый отчет по торговой истории счета. По набору параметров и представлению информации он схож с уже привычными отчетами по Сигналам. Теперь и в самой платформе вам станут доступны:
    • Помесячные показатели прироста в виде графика и таблицы
    • График изменения эквити
    • Лепестковая диаграмма, позволяющая быстро оценить состояние счета
    • Статистика сделок по инструментам
    • Множество дополнительных показателей для анализа торговли

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


  2. Исправлено заполнение доски опционов при несовпадении количества или типа инструмента у контрактов Call и Put.
  3. Исправлен некорректный выбор позиции в торговом диалоге при закрытии позиции встречной. Ошибка возникала при сортировке доступных встречных ордеров по любой колонке, кроме тикета.
  4. Ускорен вывод записей в журнал платформы.
  5. Исправлено отображение комментариев на графиках пользовательских символов.

MQL5

  1. Исправлена работа функции CArrayList::LastIndexOf. Ранее она всегда возвращала -1 вместо индекса последнего найденного элемента.
  2. Добавлен метод векторов и матриц Assign. Он позволяет заменить содержимое матрицы/вектора данными переданной матрицы/вектора или массива.
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    Пример:
      //--- копирование матриц
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- копирование массива в матрицу
      double arr[5][5]={{1,2},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {3,4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */
  3. Добавлен метод векторов и матриц CopyRates. Он позволяет легко копировать массивы ценовых данных в векторы и матрицы.
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    Тип копируемых данных указывается в параметре rates_mask при помощи перечисления ENUM_COPY_RATES. Доступны следующие значения:
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATES_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    Последние два значения предназначены для удобного выбора сразу нескольких основных параметров бара — цен Open, High, Low, Close и времени.

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

  4. Исправлено отображение объектов "Текстовая метка". При использовании свойств OBJPROP_XOFFSET и OBJPROP_YOFFSET на график мог выводиться неверный фрагмент изображения.

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

    Напомним, что спецификатор const объявляет переменную константой и не позволяет изменять значение этой переменной в процессе выполнения программы. Допускается только однократная инициализация переменной при ее объявлении. Пример константных переменных в функции OnCalculate:

    int OnCalculate (const int rates_total,      // размер массива price[]
                     const int prev_calculated,  // обработано баров на предыдущем вызове
                     const int begin,            // откуда начинаются значимые данные
                     const double& price[]       // массив для расчета
       );
    

    Но в примере ниже обнаружилась ошибка компилятора, который позволял неявное приведение указателей для параметров-ссылок:

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b); // недопустимо
            Print( a,":",b );
      }
    Теперь данная недопустимая операция будет детектироваться компилятором и выдавать ошибку.

MetaEditor

  1. Исправлено отображение ссылок на комплексные числа в отладчике.
  2. Улучшена работа MQL5 Cloud Protector. Ранее в редких случаях защита файлов могла завершаться ошибкой.
  3. Исправления по крешлогам.


Новый веб-терминал MetaTrader 5

Представляем абсолютно новый веб-терминал для MetaTrader 5. Мы сделали его современным и быстрым, обновив не только внешний вид, но и полностью переписав ядро. В плане интерфейса веб-терминал стал похож на уже привычную версию платформы для iPad:



По сравнению со старой версии в нем появилось множество новых функций:

  • Возможность запрашивать реальные счета с заполнением детальной формы регистрации и предоставлением подтверждающих документов
  • Поддержка подписок на ценовые данные и возможность получения котировок с задержкой
  • Большее количество аналитических объектов, более удобное управление
  • Отображение входов и выходов из рынка на графике
  • Отображение на графике событий экономического календаря
  • Удобная настройка инструментов в Обзоре рынка, отображение дневного изменения цены
  • Существенно упрощен интерфейс: убрано контекстное меню графика и верхнее меню; все команды для управления графиком, наложения объектов и индикаторов размещены на панелях слева и сверху; оставшиеся команды размещены в одном меню-гамбургере
  • Ночная тема интерфейса
Попробуйте новый веб-терминал на www.mql5.com прямо сейчас. В скором времени он появится и у ваших брокеров.

4 августа 2022

MetaTrader 5 build 3390: Float в OpenCL и математических функциях, методы активации и потерь для машинного обучения

Terminal

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

    Добавлено автоматическое открытие туториала при первом подключении к торговому счету.

  2.  Исправлена ошибка групповых операций "Закрыть прибыльные/убыточные позиции". Ранее для закрытия соответствующих позиций платформа использовала встречные позиции при их наличии. Например, если у вас было две убыточные позиции Buy по EURUSD и одна прибыльная позиция Sell по EURUSD, то при массовом закрытии убыточных позиций были бы закрыты все три имеющиеся позиции. Buy и Sell были бы закрыты операцией Close by, а оставшаяся Buy — обычной операцией закрытия. Теперь команды работают как запланировано, закрывая только выбранные позиции — прибыльные или убыточные.
  3. Исправлено отображение ценовой истории для отрицательных цен на графиках с периодом D1. Теперь графики с негативными ценами отображаются правильно на всех таймфреймах.
  4. Оптимизировано и значительно снижено потребление системных ресурсов терминалом.
  5. Обновлена база фундаментальных данных торговых инструментов. Количество агрегаторов, доступных для просмотра биржевого инструмента, расширено до 15, что позволяет находить информацию по максимально большому числу тикеров на самых популярных экономических агрегаторах.

    Обновлена база фундаментальных данных торговых инструментов.

    На мировом рынке котируются не менее 7 000 ликвидных акций и более 2 000 ETF. Кроме того, есть множество фьючерсов и других производных инструментов. Платформа MetaTrader 5 содержит огромную базу данных по биржевым инструментам и позволяет прямо из Market Watch в один клик перейти на сайт агрегатора для получения фундаментальных данных. Для удобства инвесторов для каждой ценной бумаги мы предлагаем на выбор множество источников информации.
  6. Исправлена подстановка уровней Стоп Лосс и Тейк Профит в окне выставления нового ордера. Теперь для счетов, работающих в режиме FIFO, значения стоп-уровней будут автоматически устанавливаться в соответствии со стоп-уровнями уже открытых позиций по тому же инструменту. Это необходимо для соблюдения правила FIFO.

MQL5

  1. Математические функции теперь могут работать с матрицами и векторами.

    Мы продолжаем расширять возможности платформы MetaTrader 5 для алготрейдинга и машинного обучения. Ранее мы добавили новый тип данных — матрицы и векторы, которые позволяют отказаться от использования массивов для обработки данных. Для работы с ними мы добавили в язык MQL5 более 70 методов, которые позволяют проводить вычисления из линейной алгебры и статистики в виде одной операции. Умножение, преобразование и решение системы уравнений — всё это теперь делается просто и без лишнего программирования. Добавление новых типов не оставило в стороне и математические функции.

    Математические функции изначально были предназначены для проведения математических операций над скалярными величинами. Теперь большая часть этих функций может использоваться и с новыми типами данных — матрицами и векторами — MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1, MathLog1p, MathArccosh, MathArcsinh, MathArctanh, MathCosh, MathSinh, MathTanh. В этом случае матрица или вектор обрабатываются почленно. Пример:
    //---
      matrix a= {{1, 4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    В случае MathMod и MathPow в качестве второго параметра может быть использован как скаляр, так и матрица или вектор соответствующего размера.

    Покажем на примере, как вычислить стандартное отклонение с помощью математических функций над вектором.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- используем инициализирующую функцию для заполнения вектора
      vector r(10, ArrayRandom); // массив случайных чисел от 0 до 1
    //--- вычислим среднее значение
      double avr=r.Mean();       // среднее значение массива
      vector d=r-avr;            // вычислим массив отклонений от среднего значения
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // массив квадратов отклонений
      double sum=s2.Sum();       // сумма квадратов отклонений
    //--- вычислим стандартное отклонение 2-мя способами
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. В шаблонных функциях теперь можно использовать записи matrix<double>, matrix<float>, vector<double>, vector<float> вместо соответствующих типов matrix, matrixf, vector, vectorf.
  3. Доработаны математические функции для работы с типом float. В связи с появившейся возможностью применения математических функций к матрицам и векторам типа float, были также доработаны соответствующие функции, применяемые к скалярам типа float. Раньше параметры этих функций безусловно приводились к типу double, вызывалась соответствующая реализация математической функции, и затем результат приводился к типу float. Теперь в случае типа float параметры и результаты не подвергаются приведению, так как вызываются реализации математических функций, соответствующих типу float.

    Разница в вычислениях на примере математического синуса:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  массив случайных чисел от 0 до 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Добавлены методы матриц и векторов Activation (активационная функция) и Derivative (производная активационной функции) с параметрами:
    AF_ELU               Exponential Linear Unit
    AF_EXP               Exponential
    AF_GELU              Gaussian Error Linear Unit
    AF_HARD_SIGMOID      Hard Sigmoid
    AF_LINEAR            Linear
    AF_LRELU             Leaky REctified Linear Unit
    AF_RELU              REctified Linear Unit
    AF_SELU              Scaled Exponential Linear Unit
    AF_SIGMOID           Sigmoid
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Swish
    AF_TANH              Hyperbolic Tangent
    AF_TRELU             Thresholded REctified Linear Unit
    Функция активации в нейронной сети определяет, как взвешенная сумма входного сигнала преобразуется в выходной сигнал узла или узлов на уровне сети. Выбор функции активации имеет большое влияние на возможности и производительность нейронной сети. В разных частях модели могут использоваться разные функции активации. В MQL5 реализованы не только все известные функции активации, но и производные активационной функции. Производные функции нужны для быстрого вычисления поправки на основании полученной ошибки во время обучения нейронной сети.

  5. Добавлен метод матриц и векторов Loss (функция потерь) со следующими параметрами:
    LOSS_MSE            Mean Squared Error
    LOSS_MAE            Mean Absolute Error
    LOSS_CCE            Categorical Crossentropy
    LOSS_BCE            Binary Crossentropy
    LOSS_MAPE           Mean Absolute Percentage Error
    LOSS_MSLE           Mean Squared Logarithmic Error
    LOSS_KLD            Kullback-Leibler Divergence
    LOSS_COSINE         Cosine similarity/proximity
    LOSS_POISSON        Poisson
    LOSS_HINGE          Hinge
    LOSS_SQ_HINGE       Squared Hinge
    LOSS_CAT_HINGE      Categorical Hinge
    LOSS_LOG_COSH       Logarithm of the Hyperbolic Cosine
    LOSS_HUBER          Huber

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

  6. Добавлены методы матриц и векторов matrix::CompareByDigits и vector::CompareByDigits. Они сравнивают элементы двух матриц/векторов на совпадение значащих цифр.

  7. Добавлена поддержка функций MathMin и MathMax для строк. В этом случае функции будут использовать лексикографическое сравнение — буквы сравниваются согласно алфавиту и с учетом регистра.

  8. Увеличено максимальное количество объектов OpenCL c 256 до 65536. Хендлы на OpenCL-объекты в MQL5-программе создаются с помощью функций CLContextCreate, CLBufferCreate и CLProgramCreate. Прежнее ограничение в 256 хендлов не позволяло эффективно работать в методах машинного обучения.

  9. Разрешено использование OpenCL на картах без поддержки double. Ранее в MQL5-программах безусловно использовались только GPU с поддержкой double, хотя множество задач допускают и предназначены для расчетов с использованием float. Тип float изначально считается родным для проведения параллельных вычислений, так как занимает меньше места. Теперь это требование убрано.

    Если для решения задачи требуется использовать только GPU с поддержкой double, то это можно явно указать при вызове CLContextCreate с помощью нового значения CL_USE_GPU_DOUBLE_ONLY (разрешается использовать только устройства, которые поддерживают вычисления с типом double).
       int cl_ctx;
    //--- инициализация OpenCL контекста
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Исправлена работа функции CustomBookAdd. Ранее, если в поле MqlBookInfo::volume_real указывалось нулевое значение, снимок стакана цен не создавался. Теперь проверка выполняется так:
    Передаваемые данные проверяются на корректность: для каждого элемента должны быть указаны тип, цена и объем. При этом MqlBookInfo.volume и MqlBookInfo.volume_real не должны быть нулевыми или отрицательными: если оба объема отрицательны, то это будет считаться ошибкой. Указывать можно любой из объемов или оба — берется тот, который указан или является положительным:

       volume=-1 && volume_real=2 — будет использован volume_real=2,

       volume=3 && volume_real=0 — будет использован volume=3.

    Объем с повышенной точностью MqlBookInfo.volume_real имеет больший приоритет по сравнению с обычным MqlBookInfo.volume. Если для элемента стакана указаны оба значения, будет использовано volume_real.

    Если хотя бы один элемент стакана описан неверно, система отбросит переданное состояние полностью.

  11. Исправлена работа функции CalendarValueLast. Ошибка заключалась в том, что в некоторых случаях последовательные вызовы функции после изменений в экономическом календаре (параметр change получал новое значение после вызова) могли пропускать события при использовании фильтра по валюте.
    CalendarValueLast(change, result, "", "EUR")
  12. Исправлено поведение функции ArrayBSearch — при наличии нескольких одинаковых элементов возвращается ссылка на первый по порядку, а не на случайный, как было ранее.
  13. Исправлен учёт видимости шаблонной функции в классе. Ошибка заключалась в том, что функции шаблона класса, объявленные как private/protected, оказывались фактически общедоступными (public).

MetaEditor

  1. Исправлены ошибки и неоднозначное поведение MetaAssist.
  2. Добавлена поддержка макроса %terminal%, который означает путь к каталогу данных платформы, где установлен данный терминал. Например, %terminal%\MQL5\Experts. 

    Добавлена поддержка макроса %terminal%, который означает путь к каталогу данных платформы, где установлен данный терминал.

  3. Улучшено отображение массивов в отладчике.
  4. Увеличен буфер для копирования значений из отладчика.
  5. Улучшены подсказки при ошибках.
  6. В файле проекта *.mproj теперь прописываются относительные пути. Ранее пути были абсолютные, что приводило к ошибкам компиляции при перемещении проекта.
  7. Добавлено автоматическое встраивание BMP-ресурсов в виде глобально доступных 32-битных массивов битмапа при включении в проекты. Это избавляет от необходимости вызывать в коде ResourceReadImage для чтения графического ресурса.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Улучшено чтение расширенных форматов BMP-файлов.
  9. Обновлены переводы пользовательского интерфейса.
  10. Исправления по крешлогам.

2 июня 2022

MetaTrader 5 build 3320: Улучшения и исправления

Terminal

  1. Расширены подсказки к объектам сделок, отображаемым на графиках.
    • Для сделок выхода из рынка добавлен показ прибыли.
    • Для сделок, совершенных в результате срабатывания Тейк Профита или Стоп Лосса, добавлена соответствующая индикация — TP/SL.

    Аналогичные подсказки добавлены к линиям, соединяющим сделки входа и выхода.

    Расширены подсказки к объектам сделок


  2. Ускорена работа графической системы.
  3. Terminal: Добавлено журналирование групповых операций над открытыми ордерами и позициями. При выполнении такой команды в журнал выводится сообщение вида "bulk closing of XXX positions started".
  4. Terminal: Исправлено групповое закрытие встречных позиций.
  5. Terminal: Исправлено обновление объектов, которыми отображается торговая история на графике. Ошибка возникала при изменении торгового инструмента у графика.

MQL5

  1. Продолжается работа над функциями для матриц и векторов: добавляется поддержка float и complex.
  2. Оператор "!" (LNOT) для указателя теперь проверяет его на валидность через неявный вызов функции CheckPointer. Для быстрой проверки на NULL следует использовать оператор "==". Например: ptr==NULL или ptr!=NULL.

MetaTester

  1. Исправлено отображение объектов сделок на графике тестирования.
  2. Ускорена работа графической системы.

MetaEditor

  • Обновлены переводы интерфейса.

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

20 мая 2022

MetaTrader 5 build 3300: Быстрая компиляция и улучшенная навигация по коду в MetaEditor

Terminal

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


  2. Ускорена отрисовка графического интерфейса.
  3. Улучшена поддержка адресов IPv6.
  4. Исправлен расчет высоты нижнего поля даты и ширины правого поля цены при первом запуске платформы.

MQL5

  1. Добавлена функция для работы с матрицами и векторами —  RegressionMetric. Она задает метрику для оценки регрессии.
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    В качестве метрик могут использоваться:
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // Средняя абсолютная ошибка
       REGRESSION_MSE,     // Средняя квадратичная ошибка
       REGRESSION_RMSE,    // Корень из средней квадратичной ошибки
       REGRESSION_R2,      // R в квадрате
       REGRESSION_MAPE,    // Средняя абсолютная ошибка в процентах
       REGRESSION_MSPE,    // Среднеквадратичная ошибка в процентах
       REGRESSION_RMSLE    // Среднеквадратичная логарифмическая ошибка
      };
  2. Добавлена возможность записи массивов с размером данных более INT_MAX (массивы структур).

MetaEditor

  1. Доработана панель вкладок:
    • Панель не скрывается, даже если открыто только одно окно. Таким образом, вам всегда остаются доступны команды контекстного меню вкладки.
    • Для каждой вкладки добавлена кнопка 'X' для закрытия. Помимо этого, вкладки можно закрывать средней кнопкой мыши или через контекстное меню.


  2. Добавлена команда для быстрой компиляции программ. В этом режиме не выполняется оптимизация кода, что значительно сокращает время создания исполняемого файла EX5. Используйте этот режим в активной стадии разработки, когда требуется быстро проверить написанный код. А уже при компиляции программы для реальной работы включайте режим максимальной оптимизации для наилучшей производительности.


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

  3. Улучшено управление кодом:
    • Разделены команды для перехода к объявлению и реализации. Ранее использовалась одна команда, которая выводила меню выбора. Теперь вы сразу можете переходить к необходимой части кода.
    • Добавлена подстановка распознанного ключевого слова по нажатию "Tab" в дополнение в "Enter".




  4. Добавлена возможность автоматического отображения локальных переменных в списке наблюдения в отладчике. Для этого включите опцию "Локальные" в контекстном меню. Во время отладки по мере перехода по коду в список будут автоматически выводиться переменные из текущей области видимости.


  5. Улучшена работа списка наблюдения в отладчике для векторов и матриц.
  6. Исправлены пути в проектных файлах. Ошибка могла приводить к пропаданию файлов из проектов.

Tester

  1. Улучшена остановка тестерных агентов при завершении работы платформы.
  2. Добавлен пятый узел для MQL5 Cloud Network, он размещен в Гонконге. Это ускорит оптимизацию роботов с использованием сети в ближайших регионах.

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

29 апреля 2022

MetaTrader 5 build 3280: Улучшения и исправления по отзывам трейдеров

Terminal

  1. Исправлено заполнение стандартных уровней Trailing Stop в контекстном меню открытых ордеров и позиций.


  2. Обновлены переводы пользовательского интерфейса.

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

21 апреля 2022

MetaTrader 5 build 3270: Улучшения и исправления

Terminal

  1. Улучшен встроенный чат:
    • Обновлен дизайн — теперь сообщения показывают без "облачков", разгружая диалоги от лишних деталей. Добавлены аватары и разделители дат.
    • В меню сообщений добавлены команды копирования и удаления.
    • Исправлены ошибки и повышена стабильность работы.



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

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

15 апреля 2022

MetaTrader 5 build 3260: Массовые операции, функции матриц и векторов и улучшения в чате

Terminal

  1. Добавлены команды для массового закрытия позиций и снятия отложенных ордеров.

    В контекстном меню раздела торговли появился новый пункт — "Массовые операции". Список доступных команд формируется в нем интеллектуально, в зависимости от выбранной операции и типа вашего счета.



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

    Если выбрать позицию, в меню появляются дополнительные команды:

    • Закрытие всех позиций по тому же символу
    • Закрытие всех позиций в том же направлении (для хеджинговых счетов)
    • Закрытие встречных позиций по тому же символу (для хеджинговых счетов)
    • Разворот позиций (для неттинговых счетов)

    Если выбрать отложенный ордер, в меню появляются дополнительные команды:

    • Удаление всех отложенных ордеров по тому же символу
    • Удаление всех отложенных ордеров того же типа по тому же символу

    Для работы этих команд пользователь должен разрешить торговлю одним кликом в настройках платформы: Сервис \ Настройки \ Торговля.
  2. Расширены функции встроенных чатов:
    • Добавлена возможность отвечать на сообщение. Текст исходного сообщения будет включаться в ответ в виде цитаты.
    • Добавлена возможность создавать сообщения с разными типами содержимого: изображения с текстом, текст с вложениями и т.д.
    • Исправлено отображение разделителя прочитанных и непрочитанных сообщений.
    • Исправлены различные ошибки и повышена стабильность работы.



  3. Оптимизирована и значительно ускорена работа графической системы терминала. На отображение интерфейса будет тратиться меньше ресурсов.
  4. Исправлен расчет дневного изменения цены для фьючерсов. Если брокер транслирует клиринговую цену, то расчет будет осуществляться от нее.
    ((Last - Клиринговая цена)/Клиринговая цена)*100
    Полное описание расчета для всех видов инструментов доступно в документации.

  5. Исправлены ошибки при покупке MQL5-сервисов:
    • В некоторых случаях платежные системы могли выводить некорректные сообщения об ошибках при удачных операциях.
    • На промежуточных этапах аренды продукта в Маркете на странице могла отображаться некорректная цена.

  6. Исправлена работа кнопки "Запуск" на странице купленного/скачанного продукта в Маркете. Теперь она корректно запускает приложение на первом из открытых графиков.
  7. Исправлен учет некоторых типов сделок при формировании истории позиций.

MQL5

  1. Добавлены новые функции для работы с матрицами и векторами:
    • Median — возвращает медиану элементов матрицы или вектора
    • Quantile — возвращает q-й квантиль элементов матрицы/вектора или элементов вдоль указанной оси матрицы
    • Percentile — возвращает q-й перцентиль элементов матрицы/вектора или элементов вдоль указанной оси матрицы
    • Std — рассчитывает стандартное отклонение элементов матрицы или вектора
    • Var — рассчитывает дисперсию элементов матрицы или вектора
    • CorrCoef — рассчитывает коэффициент корреляции матрицы или вектора
    • Correlate — рассчитывает кросс-корреляцию двух векторов
    • Convolve — возвращает дискретную линейную свертку двух векторов
    • Cov — вычисляет ковариационную матрицу

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

    На данный момент доступно три метода:
    • ArgSort — сортирует массив по заданному измерению, по умолчанию — по последнему (axis=-1).
    • Range — возвращает число элементов в указанном измерении массива. Аналог ArrayRange.
    • Size — возвращает количество элементов массива. Аналог ArraySize.

    Пример:
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {10, 36,  2, 12,  5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {33, 37, 25, 13,  4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- Отсортируем массив
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // Результат в журнале:
    // indexes
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. Идет работа по добавлению встроенных методов для строк.
    На данный момент доступны следующие методы:
    • BufferSize — возвращает размер буфера, распределенного для строки.
    • Compare — сравнивает между собой две строки и возвращает результат сравнения в виде целого числа.
    • Length — возвращает число символов в строке.
    • Find — ищет подстроку в строке.
    • Upper — переводит строку в верхний регистр.
    • Lower — переводит строку в нижний регистр.
    • Replace — производит замену подстроки.
    • Reserve — резервирует буфер для строки.

    Все методы работают аналогично строковым функциям.

    Пример:
    void OnStart()
      {
       string test="some string";
       PrintFormat("String length is %d",test.Length());
      }
    
    // Результат в журнале:
    // String length is 11
  4. Добавлено значение SYMBOL_SUBSCRIPTION_DELAY в перечисление ENUM_SYMBOL_INFO_INTEGER — размер задержки у котировок, передаваемых по символу.

    Используется только для инструментов, работающих по подписке, как правило при трансляции данных в бесплатном тестовом режиме.

    Свойство можно запрашивать только для символов, выбранных в Обзоре рынка. В ином случае вы получите ошибку ERR_MARKET_NOT_SELECTED (4302).

  5. Добавлено свойство ACCOUNT_HEDGE_ALLOWED в перечисление ENUM_ACCOUNT_INFO_INTEGER — разрешение на открытие встречных позиций и отложенных ордеров. Используется только для хеджинговых счетов, позволяя реализовать требования некоторых регуляторов, когда на счете запрещается иметь встречные позиции, но разрешается иметь несколько позиций по одному символу в одном направлении.

    Если эта опция отключена, на счетах запрещается одновременно иметь разнонаправленные позиции и ордера по одному и тому же инструменту. Например, если на счете имеется позиция Buy, то пользователь не может открыть позицию Sell или выставить отложенный ордер на продажу. При попытке сделать это пользователю будет выдаваться ошибка TRADE_RETCODE_HEDGE_PROHIBITED.

  6. Добавлены новые свойства в перечисление ENUM_SYMBOL_INFO_DOUBLE:
    • SYMBOL_SWAP_SUNDAY
    • SYMBOL_SWAP_MONDAY
    • SYMBOL_SWAP_TUESDAY
    • SYMBOL_SWAP_WEDNESDAY
    • SYMBOL_SWAP_THURSDAY
    • SYMBOL_SWAP_FRIDAY
    • SYMBOL_SWAP_SATURDAY

    Они позволяют получить коэффициент начисления свопов для каждого дня недели. 1 — одиночное начисление свопов, 3 — тройное, 0 — начисление отсутствует.

  7. Исправлена ошибка в работе функций CopyTicks и CopyTicksRange, приводившая к отдаче устаревших данных при переходе через полночь. Ошибка возникала в случаях, когда по инструменту не поступали тики.
  8. Исправления по крешлогам.

11 февраля 2022

MetaTrader 5 build 3210: добавлены новые методы матриц и управление минимальным/максимальным значением индикатора

MQL5

  1. Добавлены функции Min, Max, ArgMin, ArgMax и Sum для векторов и матриц, которые позволяют находить минимальное и максимальное значения, соответствующие индексы и сумму.
  2. Добавлена поддержка методов Flat для матриц. Это позволяет адресоваться к элементу матрицы через один индекс, а не через два.
    double matrix::Flat(ulong index) const;      // getter
    void matrix::Flat(ulong index,double value); // setter

    Псевдокод вычисления адреса элемента матрицы:

    ulong row=index / mat.Cols();
    ulong col=index % mat.Cols();
    
    mat[row,col]

    Например, для матрицы matrix mat(3,3) доступы можно записать так:

      на чтение — x=mat.Flat(4), что эквивалентно записи x=mat[1][1]
      на запись — mat.Flat(5, 42), что эквивалентно записи mat[1][2]=42

    В случае вызова функции с некорректным для матрицы индексом будет сгенерирована критическая ошибка исполнения OutOfRange.

  3. Улучшено форматирование дробных чисел во входных параметрах MQL5-программы. При чтении некоторых вещественных чисел в input-параметры подставлялись числа с большим количеством нулей, например, 0.4 представлялось как 0.400000000002.
  4. Исправлены ошибки в математической библиотеке Math\Stat\Math.mqh. Кроме того, изменена работа функции MathSample этой библиотеки, чтобы соответствовать классическому поведению таких же математических библиотек при выборке с возвратом.
  5. Исправлена ошибка в работе CopyTicks/CopyTicksRange, приводящая к отдаче устаревших данных при переходе через полночь для тех случаев, когда по инструменту не поступают тики
  6. Добавлены новые значения INDICATOR_FIXED_MINIMUM и INDICATOR_FIXED_MAXIMUM в перечисление ENUM_CUSTOMIND_PROPERTY_INTEGER.
    При помощи этих свойств можно включать/отключать фиксирование минимального и максимального значений индикатора с помощью функции IndicatorSetInteger. При вызове IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true) используется текущее минимальное/максимальное значение, соответственно


Tester

  1. Изменен алгоритм расчета Sharpe Ratio — теперь он считается классическим способом, а его значение приводится к годовому интервалу. Предыдущий алгоритм строился на разбросе полученных прибылей и убытков (PnL), но не учитывал колебания эквити при открытых позициях. Теперь в расчет принимаются взлеты и падения эквити, а само значение коэффициента Шарпа трактуется классическим образом:
    •  Sharpe Ratio < 0              Стратегия убыточна, не годится. Плохо.
    •  0 < Sharpe Ratio  < 1.0    Риск не окупается. Такие стратегии могут браться в работу, если нет альтернатив. Неопределенно.
    • Sharpe Ratio ≥ 1.0             Если коэффициент Шарпа превышает единицу, это означает, что риск окупается, портфель/стратегия работает. Хорошо.
    • Sharpe Ratio ≥ 3.0            Высокий показатель говорит о том, что вероятность получить убыток в каждой конкретной сделке очень мала. Очень хорошо.

Terminal

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


28 января 2022

MetaTrader 5 build 3180: Векторы и матрицы в MQL5 и повышение удобства работы

Terminal

  1. Добавлена активация окна графика при переносе на него символа из "Обзора рынка" или торговой операции из истории счета.

    Оба эти действия меняют финансовый инструмент графика на выбранный. Ранее они не приводили к тому, чтобы окно графика становилось активным. Соответственно, некоторые дальнейшие действия, такие как вызов торгового диалога (F9) или изменение масштаба (+/-) при помощи горячих клавиш, могли неожиданно для пользователя применяться к другому графику. Теперь график, чей символ вы поменяли перетаскиванием, сразу становится выбранным для дальнейшей работы.

  2. Добавлено открытие окна нового ордера при двойном клике на торговой операции в истории счета. При этом в диалог сразу же подставляется финансовый инструмент из операции, на которой вы кликнули, что позволяет торговать быстрее. Аналогичная команда добавлена в контекстное меню.



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

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

    Механизм используется, только если график открывается с шаблоном по умолчанию default.tpl. Если пользователь вручную отключит показ объемов в настройках графика, они не будут включаться опять при его переоткрытии. Пользовательские шаблоны не затрагиваются.

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

  6. Исправлена работа поля объема в панели быстрой торговли на графике. Ранее после ввода нового значения и нажатия клавиши Tab значение сбрасывалось на предыдущее.
  7. Исправлен показ торговой истории на графике. Ранее при переключении между счетами операции от предыдущего счета не удалялись с графиков.
  8. Исправлена оплата сервисов MQL5.com с помощью PayPal.
  9. Исправлено зависание платформы при отображении графика волатильности опциона.
  10. Исправлена проверка прав при вступлении в групповой чат с участниками сообщества MQL5.com. Ранее вновь подключившийся пользователь мог только читать, но не писать сообщения.
  11. Заменена надпись на графике при отсутствии данных. Теперь вместо "Waiting for update" отображается имя инструмента, таймфрейм и описание инструмента.
  12. Доработана поддержка отрицательных цен, добавленная в билде 2450. Для соответствующих инструментов в "Обзоре рынка" теперь могут отображаться и нулевые значения.
  13. Исправлено отображение логотипов продуктов в Маркете при работе под Wine.

MQL5

  1. Продолжаются работы по добавлению поддержки векторов и матриц. Новые функции существенно расширяют возможности для разработчиков решений на основе нейросетей.

    На данный момент уже готово множество функций:
    • Eye — создает матрицу с единицами по указанной диагонали и нулями в других местах.
    • Identity — создает матрицу указанного размера с единицами на главной диагонали и нулями в других местах.
    • Ones — создает матрицу указанного размера, заполненную единицами.
    • Zeroes — создает матрицу указанного размера, заполненную нулями.
    • Full — создает матрицу указанного размера, заполненную указанными значениями.
    • Copy — создает копию матрицы или вектора.
    • Diag — извлекает диагональ из матрицы, а также заполняет указанную диагональ значениями из вектора.
    • Tri — создает матрицу с единицами на заданной диагонали и под ней и нулями в других местах.
    • Row — возвращает строку матрицы в виде вектора, а также заполняет указанную строку значениями из вектора.
    • Col — возвращает столбец матрицы в виде вектора, а также заполняет указанный столбец значениями из вектора.
    • Rows — возвращает количество строк в матрице.
    • Cols — возвращает количество столбцов в матрице.
    • Transpose — транспонирование матрицы.
    • * — произведение матриц, векторов и скаляров — dot-продукт.
    • Power — возведение матрицы в степень.
    • Kron — произведение Кронекера.
    • Cholesky — разложение Холецкого.
    • QR — QR-разложение матрицы.
    • SVD — сингулярное разложение.
    • LU — LU-разложение матрицы.
    • LUP — LUP-разложение матрицы.
    • Norm — вычисление нормы матрицы.
    • Cond — вычисление числа обусловленности матрицы.
    • Spectrum — вычисление спектра матрицы.
    • Det — расчет определителя матрицы.
    • Rank — вычисление ранга матрицы.
    • SLogDet — получение знака и натурального логарифма определителя матрицы.
    • Trace — вычисление следа матрицы.
    • Solve — решение системы линейных уравнений.
    • LstSq — решение системы линейных уравнений методом наименьших квадратов.
    • Inv — расчет обратной матрицы.
    • PInv — расчет псевдообратной матрицы методом Мура — Пенроуза.
    • Compare — сравнение двух матриц с использованием эпсилона.

    Более подробная информация доступна в документации MQL5.

  2. Исправлены ошибки при работе с файлами и базами данных, связанные с ограничением на длину пути. В частности, функция DatabaseOpen позволяла установить путь больше разрешенного, что приводило к некорректному созданию базы. Теперь функция будет корректно возвращать код ошибки ERR_TOO_LONG_FILE_NAME.
  3. Исправлен контроль константности переменных. В некоторых случаях компилятор мог не выдавать ошибку "constant variable cannot be passed as reference".
  4. Исправлены ошибочные предупреждения компилятора об использовании неинициализированной переменной.
  5. Исправлена работа функции ChartWindowOnDropped для индикаторов. Ранее она всегда возвращала нулевое значение.
  6. В модуль интеграции с Python добавлена поддержка Python 3.10.

VPS

  1. Исправлено отображение пункта VPS в Навигаторе. В некоторых случаях он мог исчезать при переключении между счетами.

MetaEditor

  1. Исправлено разворачивание сложных выражений в окне наблюдения при отладке.
Tester
  1. : Исправлен экспорт отчетов тестирования в файл. Некоторые значения могли округляться некорректно, если в качестве валюты депозита использовалась валюта с точность 0 знаков после запятой. Например, JPY.
  2. Исправления по крешлогам.

22 октября 2021

MetaTrader 5 build 3091: Улучшения в работе

Terminal

  1. Исправлен переход на пустую страницу после покупки MQL5-сервисов. Теперь пользователи будут сразу переходить к результатам операции.
  2. Исправлено чрезмерное сжатие изображений документов, загружаемых при запросе реальных счетов. Это повысило качество автоматических проверок KYC и скорость принятия решений.
  3. Исправлена работа графика, открываемого при завершении тестирования.

MQL5

  1. Добавлена поддержка SQLite 3.36.0.

MetaEditor

  1. Добавлена подсветка фона парных скобок. Для включения перейдите в общие настройки MetaEditor.
  2. Улучшена работа отладчика MQL5-программ.

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

21 октября 2021

MetaTrader 5 build 3090: Улучшения и исправления

Terminal

  1. Исправлена ошибка, из-за которой в некоторых случаях могли пропадать пользовательские торговые инструменты.
  2. Доработаны иконки меню и панелей инструментов.
  3. Добавлены три новых языка MQL5.com: французский, итальянский и турецкий.

    Количество языков, на которых доступно крупнейшее сообщество трейдеров MQL5.community, возросло до 11. Мы полностью перевели интерфейс сайта, документацию, а также несколько десятков важных тем на форуме. В скором времени появится перевод статей и экономического календаря.

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

MQL5

  1. Исправлены ошибки в работе функции StringConcatenate.
  2. Исправлено выставление значения _LastError при работе с функцией FileSave. В некоторых случаях вместо описания ошибки, возникшей в функции, переменная могла содержать нулевое значение.
  3. Исправлен импорт данных из ресурсов в массивы типа double.

MetaTester

  1. Исправлена ошибка, приводившая к зависанию окна графика при визуальном тестировании.
Обновлена документация
123456789