Особенности языка mql5, тонкости и приёмы работы - страница 338

 
amrali #:
Пожалуйста, посмотрите в английском разделе:

В английском разделе https://www.mql5.com/en/code/53970 тоже 2024 год.

Vitaly Muzichenko #:
Ещё-бы с iBarShift(...) что-то сделать, функция часто применяемая.

Есть примеры, как её можно ускорить? И заодно тогда iTime, iHigh и т.п.

Надо предложить разработчикам варианты.

 
Renat Fatkhullin #:

Реализовано в сборке 6002, доступной на MetaQuotes-Demo

Нам даже удалось превзойти его с первой попытки.

Спасибо за пример!

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

Особенности языка MQL5, тонкости и хитрости

amrali, 03.07.2026 01:23

Тесты производительности:

StructToTimeFast (EURUSD,H1)    Compiler Version: 5836, AVX2 + FMA3
StructToTimeFast (EURUSD,H1)    13 th Gen Intel Core i7-13700 KF, AVX2 + FMA3
StructToTimeFast (EURUSD,H1)    30.27 ns, checksum = 323450257960585376  /// Функция StructToTime() в MQL
StructToTimeFast (EURUSD,H1)     1.95 ns, checksum = 323450257960585376   // StructToTimeFast
TimeToStructFast (EURUSD,H1)    Compiler Version: 5836, AVX2 + FMA3
TimeToStructFast (EURUSD,H1)    13 th Gen Intel Core i7-13700 KF, AVX2 + FMA3
TimeToStructFast (EURUSD,H1)    1970.01.01 01:02:44 - 2999.12.31 23:23:34
TimeToStructFast (EURUSD,H1)    21.34 ns, checksum = 6246603919299185333  /// Функция TimeToStruct() в MQL
TimeToStructFast (EURUSD,H1)     2.79 ns, checksum = 6246603919299185333   // TimeToStructFast
                            

Версия компилятора: 6013:

StructToTimeFast (EURUSD,H1)    Compiler Version: 6013, AVX2 + FMA3
StructToTimeFast (EURUSD,H1)    13 th Gen Intel Core i3-1305 U, AVX2 + FMA3
StructToTimeFast (EURUSD,H1)     6.81 ns, checksum = 323495722718210653  /// Функция StructToTime() в MQL
StructToTimeFast (EURUSD,H1)     6.88 ns, checksum = 323495722718210653   // StructToTimeFast
TimeToStructFast (EURUSD,H1)    Compiler Version: 6013, AVX2 + FMA3
TimeToStructFast (EURUSD,H1)    13 th Gen Intel Core i3-1305 U, AVX2 + FMA3
TimeToStructFast (EURUSD,H1)    1970.01.01 00:17:35 - 2999.12.31 23:59:58
TimeToStructFast (EURUSD,H1)    32.50 ns, checksum = 6236137421645416417  /// Функция TimeToStruct() в MQL
TimeToStructFast (EURUSD,H1)    13.79 ns, checksum = 6236137421645416417   // TimeToStructFast

Спасибо.

 

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

template <typename T>
void WrongFunc()
{
  return(0); // 'void' function returns a value
}
 

Я ещё раз изучил результаты предыдущих тестов и заметил нечто, что, возможно, объясняет столь значительный разрыв в производительности.

Я подозреваю, что текущая реализация в версии компилятора 6013 использует арифметику со знаком, тогда как исходная эталонная реализация Нери-Шнайдера основана на арифметике без знака.

Чтобы сделать тест более объективным, я изменил функцию `TimeToStructFast()`, чтобы она выполняла ту же проверку входных данных (здесь), что и встроенная функция `TimeToStruct()`:

   if(time<0 || time>=91674063532800)
      return(false);

Это добавляет ту же проверку диапазона перед преобразованием, что делает сравнение более прямым.

С учётом дополнительной проверки обновлённые результаты (в прилагаемом скрипте) следующие:

TimeToStructFast (XAUUSD,H1)    Compiler Version: 6013, AVX2 + FMA3
TimeToStructFast (XAUUSD,H1)    13 th Gen Intel Core i3-1305 U, AVX2 + FMA3
TimeToStructFast (XAUUSD,H1)    1970.01.01 00:43:39 - 2999.12.31 23:54:43
TimeToStructFast (XAUUSD,H1)    33.96 ns, checksum = 6234931204052642718  /// Функция TimeToStruct() в MQL
TimeToStructFast (XAUUSD,H1)    22.03 ns, checksum = 6234931204052642718   // TimeToStructFast
TimeToStructFast (XAUUSD,H1)    34.92 ns, checksum = 6234931204052642718   // TimeToStruct_Signed

Даже после добавления дополнительной проверки диапазона функция ` TimeToStructFast()` по-прежнему работает примерно на 35 % быстрее, чем встроенная функция `TimeToStruct() ` , при этом выдавая идентичные контрольные суммы.

Функция TimeToStruct_Signed() демонстрирует производительность, сопоставимую со встроенной функцией TimeToStruct().

Если моё предположение относительно арифметики со знаком и без знака верно, то в встроенной реализации, возможно, ещё есть место для дальнейшей оптимизации.

Файлы:
 

Форум, посвящённый торговле, автоматизированным торговым системам и тестированию торговых стратегий

Библиотеки: Высокопроизводительные функции работы со временем (TimeUtils)

amrali, 18.07.2026 17:47

Обновление от 18 июля 2026 г. — версия 2.50

  • Добавлены функции AddPeriod() и SubPeriod() для арифметических операций с календарными периодами.
  • Добавлены функции WithXxx() для замены отдельных полей даты и времени.
  • Добавлены перегрузки IsInSession() для проверки повторяющихся ежедневных сессий.
Страница с исходным кодом библиотеки: https://www.mql5.com/ru/code/53970
 
amrali #:
Страница с исходным кодом библиотеки: https://www.mql5.com/ru/code/53970
Обновления есть только в англоязычной версии https://www.mql5.com/en/code/53970
High-Performance Time Functions (TimeUtils)
High-Performance Time Functions (TimeUtils)
  • 2024.12.03
  • www.mql5.com
High-performmance functions for dealing with time.
 
Edgar Akhmadeev #:
Обновления доступны только в английской версии на сайте https://www.mql5.com/ru/code/53970
Об этой проблеме сообщено в MetaQuotes, и она должна быть исправлена в ближайшее время.
 
amrali #:

Я еще раз проанализировал результаты предыдущих тестов и заметил нечто, что может объяснить столь значительный разрыв в производительности.

Я подозреваю, что текущая реализация в версии компилятора 6013 использует арифметику со знаком, тогда как исходная эталонная реализация Нери-Шнайдера основана на арифметике без знака.

Чтобы сделать тест более объективным, я модифицировал функцию `TimeToStructFast()`, чтобы она выполняла ту же проверку входных данных (здесь), что и встроенная функция `TimeToStruct()`:

Это добавляет ту же проверку диапазона перед преобразованием, что делает сравнение более прямым.

С учётом дополнительной проверки обновлённые результаты (в прилагаемом скрипте) следующие:

Даже после добавления дополнительной проверки диапазона функция TimeToStructFast() по-прежнему работает примерно на 35 % быстрее, чем встроенная функция TimeToStruct(), при этом выдавая идентичные контрольные суммы.

Функция TimeToStruct_Signed() демонстрирует производительность, сопоставимую со встроенной функцией TimeToStruct().

Если моё предположение относительно арифметики со знаком и без знака верно, то во встроенной реализации, возможно, ещё есть возможности для дальнейшей оптимизации.

Похоже, исправлено в версии 6033
Файлы:
Ver 6033.jpg  154 kb
 
amrali #:

Я еще раз проанализировал результаты предыдущих тестов и заметил нечто, что может объяснить столь значительный разрыв в производительности.

Я подозреваю, что текущая реализация в версии компилятора 6013 использует арифметику со знаком, тогда как исходная эталонная реализация Нери-Шнайдера основана на арифметике без знака.

Чтобы сделать тест более объективным, я модифицировал функцию `TimeToStructFast()`, чтобы она выполняла ту же проверку входных данных (здесь), что и встроенная функция `TimeToStruct()`:

Это добавляет ту же проверку диапазона перед преобразованием, что делает сравнение более прямым.

С учётом дополнительной проверки обновлённые результаты (в прилагаемом скрипте) следующие:

Даже после добавления дополнительной проверки диапазона функция TimeToStructFast() по-прежнему работает примерно на 35 % быстрее, чем встроенная функция TimeToStruct(), при этом выдавая идентичные контрольные суммы.

Функция TimeToStruct_Signed() демонстрирует производительность, сопоставимую со встроенной функцией TimeToStruct().

Если моё предположение относительно арифметики со знаком и без знака верно, то во встроенной реализации, возможно, ещё есть возможности для дальнейшей оптимизации.

Похоже, проблема устранена (как упомянул renut в версии 6002)
 
Amir Yacoby # :
Похоже, проблема устранена (как экспериментальный ребут в версию 6002)
Я по-прежнему наблюдаю ту же задержку в 6033.