---
title: "MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5 - Последние обновления"
description: "Добавлена поддержка работы с моделями ONNX (Open Neural Network Exchange). ONNX — открытая библиотека для построения нейронных сетей... - Последние обновления"
image: "https://www.metatrader5.com/c/17/1/public-project.png"
url: "https://www.metatrader5.com/ru/releasenotes/terminal/2278"
---

# MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5

## Добавлена поддержка работы с моделями ONNX (Open Neural Network Exchange). ONNX — открытая библиотека для построения нейронных сетей глубокого обучения

10 марта 2023

### Terminal

1. Исправлена ошибка при подсчете итоговой прибыли в [торговом отчете](https://www.metatrader5.com/ru/releasenotes/terminal/2251).
2. Обновлены [фундаментальные данные](https://www.metatrader5.com/ru/terminal/help/trading/market_watch#fundamental) по торговым инструментам, доступные через Обзор рынка.
3. Исправлен запуск торговой платформы под Wine 7.0.1 при работе в [Linux-системах](https://www.metatrader5.com/ru/terminal/help/start_advanced/install_linux).
4. Исправлено добавление символов в Обзор рынка через строку поиска. Символ, найденный по описанию, было невозможно добавить в список кликом мыши на его строке.

### MQL5

1.  Добавлена поддержка работы с моделями [ONNX](https://ru.wikipedia.org/wiki/ONNX) (Open Neural Network Exchange). ONNX — открытая библиотека для построения нейронных сетей глубокого обучения. Этот формат поддерживается множеством платформ, включая [Chainer](https://www.mql5.com/go?link=https://chainer.org/), [Caffee2](https://www.mql5.com/go?link=https://caffe2.ai/) и [PyTorch](https://www.mql5.com/go?link=https://pytorch.org/). Создав ONNX модель при помощи специализированных инструментов, вы можете интегрировать ее в свою MQL5-программу и использовать для принятия торговых решений. Описание всех поддерживаемых функций доступно в [документации](https://www.mql5.com/ru/docs/onnx). Пример работы с тестовой моделью доступен в [публичных проектах](https://www.metatrader5.com/ru/metaeditor/help/mql5storage/projects#public) в MetaEditor. Найдите проект ONNX.Price.Prediction в разделе "Инструменты \ Публичные проекты", а затем нажмите "Присоединиться" в контекстном меню. Проект загрузится на компьютер и появится в Навигаторе:

   ![Пример работы с ONNX моделю в публичных проектах](https://www.metatrader5.com/c/17/1/public-project.png)

   Скомпилируйте проект и запустите его на 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 доступны в [документации](https://www.mql5.com/ru/docs/onnx).
2. Добавлена поддержка нового алгоритма умножения матриц [General Matrix Multiplication](https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms#Level_3) (GeMM). Он позволяет значительно ускорить вычисления на большинстве процессоров за счет распараллеливания задач и более правильного использования кэшей L1/L2/L3. Скорость вычисления при этом сравнима с такими известными пакетами, как [Math Kernel Library](https://en.wikipedia.org/wiki/Math_Kernel_Library) (MKL) и [OpenBLAS](https://en.wikipedia.org/wiki/OpenBLAS). В ближайшее время мы опубликуем подробные сравнительные тесты. Новый алгоритм на данный момент поддерживается в методе [matrix::GeMM](https://www.mql5.com/ru/docs/matrix/matrix_products/matrix_gemm). Если ваш процессор поддерживает инструкции [AVX](https://ru.wikipedia.org/wiki/AVX) и [FMA](https://ru.wikipedia.org/wiki/FMA) (большинство процессоров, выпущенных после 2013 года), алгоритм будет задействован автоматически.
3.  Добавлена поддержка передачи матриц и векторов в DLL. Теперь вы можете [импортировать функции](https://www.mql5.com/ru/docs/basis/preprosessor/import), использующие этот тип данных, из внешних библиотек. Матрицы и векторы передаются в 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](https://www.mql5.com/ru/docs/series/copyseries) для копирования синхронизированных таймсерий из [MqlRates](https://www.mql5.com/ru/docs/constants/structures/mqlrates) в отдельные массивы.

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

   В отличие от CopyRates, которая возвращает полный набор таймсерий в виде массива MQLRates, функция CopySeries позволяет программисту получать только нужные таймсерии на основе комбинации флагов, указывающих тип запрашиваемых таймсерий. При этом порядок массивов, передаваемых в функцию, должен соответствовать порядку полей в структуре [MqlRates](https://www.mql5.com/ru/docs/constants/structures/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](https://www.mql5.com/ru/docs/constants/structures/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](https://www.mql5.com/ru/docs/trading/ordersend). Ошибка могла возникать при параллельной торговле на одном счете через разные платформы.
6. Исправлена ошибка импорта EX5-библиотек. Она возникала, если имя импортируемой библиотеки совпадало с именем файла, в который она импортируется.

### MetaEditor

1.  Добавлена рассылка Push-уведомлений участникам [групповых проектов](https://www.metatrader5.com/ru/metaeditor/help/mql5storage/projects#shared). Теперь каждый участник всегда будет в курсе любых изменений в файлах или настройках проекта. Для получения уведомлений укажите свой [MetaQuotes ID](https://www.mql5.com/ru/articles/476) в разделе "Настройки \ Безопасность" вашего профиля [MQL5.community](https://www.mql5.com/).

   ![Push-уведомления об изменениях в проекте](https://www.metatrader5.com/c/17/1/notification__iphone.jpg)
2. Обновлены иконки файлов в Навигаторе. Новые более простые метафоры облегчат восприятие информации.

### Tester

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

### **MetaTrader 5 Web Terminal build 3620**

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

   ![Новые цветовые схемы для веб-терминала](https://www.metatrader5.com/c/17/1/web-color-scheme.jpg)
2.  Переработано окно спецификации торгового инструмента. Все данные перекомпонованы в компактные логические блоки для более удобного просмотра.

   ![Обновленное окно спецификации торгового инструмента](https://www.metatrader5.com/c/17/1/web-specification.jpg)
3. Исправлено открытие реальных счетов через веб-терминал. В некоторых случаях после заполнения регистрационной формы сервер мог возвращать ошибку.
4. Исправлена ошибка в торговом диалоге. Если пользователь открывал диалог модификации позиции, а затем закрывал позицию кнопкой "X" в окне инструментов, содержимое диалога не сбрасывалось. Теперь в этом случае диалог будет автоматически возвращаться в режим выставления нового ордера.
5. Исправлено отображение поля Server в диалоге управления счетами.
6. Исправлено отображение текущего таймфрейма на панели инструментов.
7. Исправлено отображение объема в количестве единиц базового актива в торговом диалоге.
8. Исправлена модификация уровней "Стоп Лосс" и "Тейк Профит". В некоторых случаях модификация одного значения могла приводить к сбросу второго.
9. Исправлено отображение предупреждения о рисках инвестора.

**Предыдущие новости:**

- [MetaTrader 5 для iPhone/iPad: улучшение торговых и аналитических функций графиков](https://www.metatrader5.com/ru/releasenotes/terminal/2277)
- [MetaTrader 5 build 3550: улучшения и исправления](https://www.metatrader5.com/ru/releasenotes/terminal/2265)
- [MetaTrader 5 build 3540: 2FA/TOTP аутентификация и улучшенный Обзор рынка в веб-терминале](https://www.metatrader5.com/ru/releasenotes/terminal/2264)
- [MetaTrader 5 build 3520: добавлена 2FA/TOTP аутентификация с помощью Google Authenticator](https://www.metatrader5.com/ru/releasenotes/terminal/2262)
- [MetaTrader 5 build 3510: улучшения веб-терминала](https://www.metatrader5.com/ru/releasenotes/terminal/2261)
