Так на MT4 выглядит череда торговых приказов.
Захлебывается советник в своих торговых приказах. Поэтому без спец. механизма будет пропускать тики.
Спасибо! Полезная штука.
Поскольку библиотека, в частности, создана для боевых советников на слабых 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; }
Очень простая, но эффективная конструкция, чтобы проверить свой код на потенциальные ошибки. Идея универсальна - работает на переполнение любых счетчиков.
В данном случае сразу получилось воспроизвести зависание. И можно спокойно в дебаге разобраться в причинах, а не гадать.
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.
GetMicrosecondCount может выдать значение меньше, чем на предыдущем вызове (без ULONG-переполнения). Примеры таких ситуаций.
Каждая строка получена разными советниками на трех терминалах MT4.
И на MT5 подобное происходит, но значительно реже MT4.
Во многих случаях разница составляет примерно 1.01 секунды. Что за магическое число?
Во многих случаях разница составляет примерно 1.01 секунды. Что за магическое число?
К сожалению, не знаю даже, что за WinAPI функция используется внутри.
К сожалению, не знаю даже, что за WinAPI функция используется внутри.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
Renat Fatkhullin, 2018.08.01 10:17
После проверки машины исполнения MQL5 кода оказалось, что у нас работала гибридная схема замера в GetMicrosecondCount:
- для Windows 8 и выше использовалась чуть более быстрая функция GetSystemTimePreciseAsFileTime, зависимая от системного времени
- для остальных случаев связка QueryPerformanceFrequency + QueryPerformanceCounter
- в обоих случаях GetMicrosecondCount выполнял свою функцию выдачи микросекунд с начала старта программы
Такой код появился из-за попытки уменьшить системный оверхед на вызове замера времени. Один из разработчиков перестарался.
Лично я и Слава были уверены, что работает чистый QueryPerformanceCounter. И такой код был. Но ошиблись из-за наличия гибридной модели.
Сейчас будет работать исключительно QueryPerformanceFrequency + QueryPerformanceCounter.
Итогом: да, мы облажались как с реализацией фукции GetMicrosecondCount, так и с защитой ее поведения.
Спасибо за наводку. Получается, что в MT4 под WinServer2019 нехорошая реализация.
Ну и в MT5 нарвался, так что и там что-то ненадежное осталось.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Usage:
Расчет вычислительной нагрузки - длительность выполнения расчетов от общего времени.
Автор: fxsaber