Ваш индикатор Ping замеряет исключительно время между двумя котировками, а не реальный сетевой пинг. Никакой детерминированности или гарантии частоты прихода котировок нет и не может быть по определению. Это Tick's Frequency индикатор, но никак не Ping.
Есть опыт запуска этого индикатора на той же машине, где торговый сервер...
В случае отсутствия латенси, если между тиками торгового сервера N миллисекунд, то и между соответствующими OnTick MQL-программы должно пройти ровно N миллисекунд. Это далеко не так, к сожалению.
Предлагаю не доверять этому индикатору, а самому померить данное несоответствие на своих машинах с нулевым пингом.
Таймер по прежнему делает отсчет от последнего срабатывания OnTimer() и не сбрасывается в 0 при вызовах EventKillTimer(); EventSetMillisecondTimer(100); EventSetTimer(100); У меня паузы до 3 минут бывают пока большие файлы скачиваются - соответственно после запуска EventSetMillisecondTimer(100); OnTimer() сработает через 3 минуты+100мс. Нелогичное поведение. Можно исправить на ожидаемое в 100мс?
PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?
Вообще хотелось бы из массива uchar сразу получить массив любого типа. Пример использования: имеется массив float по ссылке получаем его представление, как uchar и сжимаем через CryptEncode(), сохраняем на диск. Экономия дискового пространства в 5-10 раз.
Потом, когда нужно обратиться к этим данным: считываем с диска и распаковываем - из CryptEncode() получаем uchar.
Вот и опять надо получить к нему доступ как к float.
Сейчас видимо только в цикле с преобразованием через union каждого элемента можно такое сделать?
В вашем коде советника выведите время сразу после запуска таймера и проверьте, когда сработает таймер в следующий раз.
Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек
Можно и не печатать. В первом посте есть вывод времени в логах от самого терминала:
2025.06.0411:01:12.364 OnTimer via 4108 ms - момент предыдущего вызова OnTimer() и его остановки через EventKillTimer() и начало работы медленной функции на 5 секунд
2025.06.0411:01:17.3645) Work time: 4999 ms - через 5 сек фунция завершила работу
2025.06.0411:01:17.364 start timer - и запустила таймер EventSetMillisecondTimer(100);
2025.06.0411:01:22.472 OnTimer via 5107 ms - таймер сработал через 5.1 секунды, а не через 0.1 секунды
Тут видно момент запуска таймера и момент его срабатывания. Разница в 5с + 100мс
то функция работает очень быстро и таймер всегда срабатывает через 100мс. то следущий сработает через паузу 5 сек 100мс - нужно именно так. Работа через паузу таймером нужна для работы с графической панелью
PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?
100мс только после первого запуска таймера - при последующих уже дополнительные задержки, равные времени от предыдущего срабатывания Ontimer().
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса
Renat Fatkhullin, 2025.06.02 11:51
Смотреть лучше через встроенный таск менеджер самого терминала по F2.У меня сильно не совпадает потребление F2-памяти с TERMINAL_MEMORY_USED.
Где ошибка?
b5107
Подскажите, что надо делать, чтобы тема терминала сама менялась при изменении темы windows со светлой на темную и обратно.
Пока что поведение терминала прежнее.
Сразу же отсылает.
Замеряли?
Ваш индикатор Ping замеряет исключительно время между двумя котировками, а не реальный сетевой пинг. Никакой детерминированности или гарантии частоты прихода котировок нет и не может быть по определению. Это Tick's Frequency индикатор, но никак не Ping.
Есть опыт запуска этого индикатора на той же машине, где торговый сервер...
В случае отсутствия латенси, если между тиками торгового сервера N миллисекунд, то и между соответствующими OnTick MQL-программы должно пройти ровно N миллисекунд. Это далеко не так, к сожалению.
Предлагаю не доверять этому индикатору, а самому померить данное несоответствие на своих машинах с нулевым пингом.
Результат с ненулевым пингом.
Попробуйте на машине с нулевым.
Таймер по прежнему делает отсчет от последнего срабатывания OnTimer() и не сбрасывается в 0 при вызовах EventKillTimer(); EventSetMillisecondTimer(100); EventSetTimer(100);
Код советника в первом посте https://www.mql5.com/ru/forum/487790/page18#comment_56857418У меня паузы до 3 минут бывают пока большие файлы скачиваются - соответственно после запуска EventSetMillisecondTimer(100); OnTimer() сработает через 3 минуты+100мс.
Нелогичное поведение. Можно исправить на ожидаемое в 100мс?
В вашем коде советника выведите время сразу после запуска таймера и проверьте, когда сработает таймер в следующий раз.
Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек
Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек
Запускал тот код. Он, действительно, показывает ошибку таймера.
Запускал тот код. Он, действительно, показывает ошибку таймера.
Какая ошибка таймера? 5 секунд плюс 100 миллисекунд?
PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?
Обратите внимание на новую языковую конструкцию.
С массивами так не получится. Только через ArraySwap.
Вообще хотелось бы из массива uchar сразу получить массив любого типа.
Пример использования:
имеется массив float по ссылке получаем его представление, как uchar и сжимаем через CryptEncode(), сохраняем на диск. Экономия дискового пространства в 5-10 раз.
Потом, когда нужно обратиться к этим данным: считываем с диска и распаковываем - из CryptEncode() получаем uchar.
Вот и опять надо получить к нему доступ как к float.
Сейчас видимо только в цикле с преобразованием через union каждого элемента можно такое сделать?
Какая ошибка таймера? 5 секунд плюс 100 миллисекунд?
Между выходом из OnTimer и следующем заходом в OnTimer должно пройти 100 мс, судя по коду.
В вашем коде советника выведите время сразу после запуска таймера и проверьте, когда сработает таймер в следующий раз.
Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек
Тут видно момент запуска таймера и момент его срабатывания. Разница в 5с + 100мс
PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?
100мс только после первого запуска таймера - при последующих уже дополнительные задержки, равные времени от предыдущего срабатывания Ontimer().