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

 

В пятницу 4 ноября 2022 года будет выпущена обновленная версия платформы MetaTrader 5.

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

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

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

Мобильная версия веб-терминала и методы матриц и векторов в MQL5

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


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

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

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

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

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

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


MetaTrader 5 Client Terminal build 3490

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

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

    Менеджер OpenCL для управления доступными устройствами


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

    Менеджер OpenCL для управления доступными устройствами

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

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

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

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

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

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

  6. MQL5: Добавлены методы векторов и матриц 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,   // флаги тика
    При выборе нескольких типов данных (доступно только для матриц) порядок строк в матрице будет соответствовать порядку значений в перечислении.

  7. MQL5: Расширены возможности методов matrix::Assign и vector::Assign.

    Теперь матрице можно назначить одномерный массив или вектор:
    bool matrix::Assign(const vector &vec);
    Результатом будет однострочная матрица.

    Также вектору теперь можно назначить матрицу (будет выполнено сглаживание матрицы):
    bool vector::Assign(const matrix &mat);
  8. MQL5: Добавлены методы 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]]
      */
     }
  9. MQL5: Добавлены методы LossGradient для векторов и матриц. Данный метод вычисляет вектор или матрицу частных производных функции потерь по предсказанным значениям. В линейной алгебре такой вектор называется градиентом и применяется в машинном обучении.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  10. MQL5: Включено использование 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)
    );

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

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


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

Новый WebTerminal — быстрый, современный и безопасный
Новый WebTerminal — быстрый, современный и безопасный
  • 2022.10.12
  • MetaQuotes
  • www.metatrader5.com
Компания MetaQuotes выпустила абсолютно новый веб-терминал для MetaTrader 5. Для торговли в веб-терминале нужен только браузер — веб-версия работает на любых операционных системах и не требует установки дополнительных программ. Работа с веб-терминалом безопасна, так как вся передаваемая информация надежно шифруется. Новый терминал стал...
 
fxsaber #:

Похоже, специально. Зачем?

Треды, хендлы и память перенесены в заголовок окна.

 
MetaQuotes #:

Треды, хендлы и память перенесены в заголовок окна.

Отдельно по советникам нет данных.

 
MetaQuotes:


Подскажите пожалуйста, будет ли добавлен метод в вектора, для организации вытесняющей очереди ?
Что-то наподобие insert с сдвигом.
Понятно, что циклом всё реализуется, но для удобства в векторах не хватает такого метода.

 

Ошибка в работе функции CalendarValueHistory: не производит фильтрацию событий по заданной валюте.

// Проверка правильности работы CalendarValueHistory.
void OnStart()
{
  const string Currency = "AUD";
  
  MqlCalendarValue Values[];

  // Получаем будущие события с фильтром по валюте.
  if (CalendarValueHistory(Values, TimeTradeServer(), TimeTradeServer() + 7 * 24 * 3600, NULL, Currency))
    for (int i = ArraySize(Values) - 1; i >= 0; i--) // Бежим по всем найденным событиям
    {
      MqlCalendarEvent Event;
      MqlCalendarCountry country;
      
      if (CalendarEventById(Values[i].event_id, Event) &&
          CalendarCountryById(Event.country_id, country) &&
          (country.currency != Currency)) // Если валюта события не совпадает с фильтром
        Print("Currency = " + Currency + ", country.currency = " + country.currency); // Распечатываем.
    }
}


Результат.

Currency = AUD, country.currency = USD
Currency = AUD, country.currency = GBP
Currency = AUD, country.currency = CHF
Currency = AUD, country.currency = ZAR
Currency = AUD, country.currency = NZD
Currency = AUD, country.currency = MXN
Currency = AUD, country.currency = JPY
Currency = AUD, country.currency = CAD
Currency = AUD, country.currency = BRL

На b2958 отрабатывает правильно.

Строка для поискаOshibka 048.

 

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

ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrOrange);
ChartSetInteger(0, CHART_COLOR_CHART_UP, clrOrange);

Прошу добавить параметр, для смены цвета по индексу.

ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrOrange, index);
ChartSetInteger(0, CHART_COLOR_CHART_UP, clrOrange, index);
 
Roman #:

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

Прошу добавить параметр, для смены цвета по индексу.

Перерисуйте график с помощью буферов индикатора

 
Vladimir Pastushak #:

Перерисуйте график с помощью буферов индикатора

Ожидал это предложение, но оно не подходит.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Roman, 2022.10.15 21:03

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

Эти функции не подходят, так-как красят всю серию свечей основного графика.
А хотелось бы по индексно менять цвет.

ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrOrange);
ChartSetInteger(0, CHART_COLOR_CHART_UP, clrOrange);

 

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

а так нажал и получил информацию. но мечтать не вредно

 
MetaQuotes:

В пятницу 14 октября 2022 года будет выпущена обновленная версия платформы MetaTrader 5 в бета-режиме.


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


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

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

Терминал уже круто прокачали и довели до совершенства, большая благодарность за проделанную работу всей команде MQ!

Большая просьба в следующих релизах провести давно назревшую модернизацию Тестера Стратегий , так чтобы он в своем улучшенном виде более полноценно поддерживал тестирование сложных ИТ-систем, разработанных на платформе МТ5!

Из наиболее критичного:

1. Обеспечить полноценную работу системы событий ChartEvents

2. Предоставить спец. стартовые функции для задание периода тестирования, таймфрейма и инструментов из кода советника

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

4. Активировать поддержку экрана Экономический Календарь им загрузку исторических значений экономических событий

5. Обеспечить поддержку работы с  файловыми функциями и базами данных sqlite.

Заранее благодарю!