Библиотеки: Usage

 

Usage:

Расчет вычислительной нагрузки - длительность выполнения расчетов от общего времени.

Usage

Автор: fxsaber

 

Так на MT4 выглядит череда торговых приказов.

Захлебывается советник в своих торговых приказах. Поэтому без спец. механизма будет пропускать тики.

 
fxsaber:

Спасибо! Полезная штука.

 

Поскольку библиотека, в частности, создана для боевых советников на слабых VPS, то очень важны ее скоростные характеристики.

В перезалитом варианте обходятся все выявленные на данный момент особенности замедления работы MT4/5.

 
Исправлена досадная ошибка.
 

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

И в голову пришла вот такая полезная конструкция, которая позволяет проверить ситуации переполнения WinAPI-счетчиков.

static ulong GetMicrosecondCount2_Res = ULONG_MAX - 1000000;

ulong GetMicrosecondCount2()
{  
//  static ulong GetMicrosecondCount2_Res = ULONG_MAX - 1000000;

  return(GetMicrosecondCount2_Res += 800000);
}

#define GetMicrosecondCount GetMicrosecondCount2

#include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  USAGE Usage;
}

Очень простая, но эффективная конструкция, чтобы проверить свой код на потенциальные ошибки. Идея универсальна - работает на переполнение любых счетчиков.


В данном случае сразу получилось воспроизвести зависание. И можно спокойно в дебаге разобраться в причинах, а не гадать.

 
GetMicrosecondCount может выдать значение меньше, чем на предыдущем вызове (без ULONG-переполнения). Примеры таких ситуаций.
2021.04.29 06:43:31.915   Alert: NewValue = 296000074313, PrevValue = 296001329284

2021.04.29 06:43:32.149   Alert: NewValue = 296086250613, PrevValue = 296087264090

2021.04.29 06:43:31.868   Alert: NewValue = 295129291901, PrevValue = 295130576710

2021.04.29 06:43:32.180   Alert: NewValue = 295955613012, PrevValue = 295956589070

2021.04.29 06:43:32.180   Alert: NewValue = 295146223171, PrevValue = 295147199454

2021.04.29 06:43:32.149   Alert: NewValue = 295065995432, PrevValue = 295067005968

2021.04.29 06:43:32.149   Alert: NewValue = 295078776581, PrevValue = 295079787357

Каждая строка получена разными советниками на трех терминалах MT4.

И на MT5 подобное происходит, но значительно реже MT4.

 
fxsaber:
GetMicrosecondCount может выдать значение меньше, чем на предыдущем вызове (без ULONG-переполнения). Примеры таких ситуаций.

Каждая строка получена разными советниками на трех терминалах MT4.

И на MT5 подобное происходит, но значительно реже MT4.

Во многих случаях разница составляет примерно 1.01 секунды. Что за магическое число?

 
Andrey Khatimlianskii:

Во многих случаях разница составляет примерно 1.01 секунды. Что за магическое число?

К сожалению, не знаю даже, что за WinAPI функция используется внутри.

 
fxsaber:

К сожалению, не знаю даже, что за WinAPI функция используется внутри.

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

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

Renat Fatkhullin, 2018.08.01 10:17

После проверки машины исполнения MQL5 кода оказалось, что у нас работала гибридная схема замера в GetMicrosecondCount:

  • для Windows 8 и выше использовалась чуть более быстрая функция GetSystemTimePreciseAsFileTime, зависимая от системного времени
  • для остальных случаев связка QueryPerformanceFrequency + QueryPerformanceCounter
  • в обоих случаях GetMicrosecondCount выполнял свою функцию выдачи микросекунд с начала старта программы

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

Лично я и Слава были уверены, что работает чистый QueryPerformanceCounter. И такой код был. Но ошиблись из-за наличия гибридной модели.

Сейчас будет работать исключительно QueryPerformanceFrequency + QueryPerformanceCounter.

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

Мы со Славой приносим свои извинения!

 
Andrey Khatimlianskii:

Спасибо за наводку. Получается, что в MT4 под WinServer2019 нехорошая реализация.

Ну и в MT5 нарвался, так что и там что-то ненадежное осталось.

Причина обращения: