Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - страница 35

 

У меня сильно не совпадает потребление F2-памяти с TERMINAL_MEMORY_USED.

void OnStart()
{
  Print(TerminalInfoInteger(TERMINAL_MEMORY_USED)); // 507
}

Где ошибка?

 
geritretar #:
MetaTrader 5 x64 build 5104 started for MetaQuotes Ltd. Windows 11 build 22631 (Без AVX2).

Если через меню терминала менять тему на "Светлая" или "Темная", то тема терминала меняется.

Если же в терминале установить тему "Системная", то тема устанавливается светлой и смена темы в Windows тему терминала не меняет.

Как говорится, что я делаю не так? (Винда дефолтная, без твиков. То же было и на билде 5100.)

b5107

Подскажите, что надо делать, чтобы тема терминала сама менялась при изменении темы windows со светлой на темную и обратно.

Пока что поведение терминала прежнее.

 
Renat Fatkhullin #:

Сразу же отсылает.

Замеряли?

Ваш индикатор Ping замеряет исключительно время между двумя котировками, а не реальный сетевой пинг. Никакой детерминированности или гарантии частоты прихода котировок нет и не может быть по определению. Это Tick's Frequency индикатор, но никак не Ping.

Есть опыт запуска этого индикатора на той же машине, где торговый сервер...

В случае отсутствия латенси, если между тиками торгового сервера N миллисекунд, то и между соответствующими OnTick MQL-программы должно пройти ровно N миллисекунд. Это далеко не так, к сожалению.


Предлагаю не доверять этому индикатору, а самому померить данное несоответствие на своих машинах с нулевым пингом.

#define TOSTRING(A) #A + " = " + DoubleToString(A, 1) + " ms.| \t"

void OnTick()
{
  static MqlTick PrevTick = {};
  static ulong PrevTime = 0;
  static double Summary = 0;
  
  const ulong NowTime = GetMicrosecondCount();  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (PrevTime)
    {
      const ulong Num1 = Tick.time_msc - PrevTick.time_msc;
      const double Num2 = (NowTime - PrevTime) / 1000.0;
      
      Summary += Num2 - Num1;
      
      Print(TOSTRING(Num1) + TOSTRING(Num2) + TOSTRING(Num2 - Num1) + TOSTRING(Summary));
    }
    else
      Print(TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST) / 1000.0));
    
    PrevTick = Tick;
    PrevTime = NowTime;
  }
}


Результат с ненулевым пингом.

TerminalInfoInteger(TERMINAL_PING_LAST) / 1000.0 = 101.1 ms.|  
Num1 = 2826.0 ms.|  Num2 = 2823.3 ms.|  Num2 - Num1 = -2.7 ms.|  Summary = -2.7 ms.|  
Num1 = 1615.0 ms.|  Num2 = 1613.4 ms.|  Num2 - Num1 = -1.6 ms.|  Summary = -4.3 ms.|  
Num1 = 2421.0 ms.|  Num2 = 2426.0 ms.|  Num2 - Num1 = 5.0 ms.|  Summary = 0.7 ms.|  
Num1 = 403.0 ms.|  Num2 = 399.4 ms.|  Num2 - Num1 = -3.6 ms.|  Summary = -2.9 ms.|  
Num1 = 202.0 ms.|  Num2 = 200.7 ms.|  Num2 - Num1 = -1.3 ms.|  Summary = -4.2 ms.|  
Num1 = 1211.0 ms.|  Num2 = 1216.4 ms.|  Num2 - Num1 = 5.4 ms.|  Summary = 1.1 ms.|  
Num1 = 806.0 ms.|  Num2 = 800.7 ms.|  Num2 - Num1 = -5.3 ms.|  Summary = -4.2 ms.|  
Num1 = 203.0 ms.|  Num2 = 206.5 ms.|  Num2 - Num1 = 3.5 ms.|  Summary = -0.6 ms.|  
Num1 = 202.0 ms.|  Num2 = 196.9 ms.|  Num2 - Num1 = -5.1 ms.|  Summary = -5.8 ms.|  
Num1 = 604.0 ms.|  Num2 = 609.6 ms.|  Num2 - Num1 = 5.6 ms.|  Summary = -0.1 ms.|  
Num1 = 202.0 ms.|  Num2 = 200.4 ms.|  Num2 - Num1 = -1.6 ms.|  Summary = -1.7 ms.|  
Num1 = 409.0 ms.|  Num2 = 404.9 ms.|  Num2 - Num1 = -4.1 ms.|  Summary = -5.7 ms.|  
Num1 = 200.0 ms.|  Num2 = 199.8 ms.|  Num2 - Num1 = -0.2 ms.|  Summary = -5.9 ms.|  
Num1 = 604.0 ms.|  Num2 = 610.6 ms.|  Num2 - Num1 = 6.6 ms.|  Summary = 0.7 ms.|  

Попробуйте на машине с нулевым.

 
Forester #:

Таймер по прежнему делает отсчет от последнего срабатывания OnTimer() и не сбрасывается в 0 при вызовах EventKillTimer(); EventSetMillisecondTimer(100); EventSetTimer(100);
У меня паузы до 3 минут бывают пока большие файлы скачиваются - соответственно после запуска EventSetMillisecondTimer(100); OnTimer() сработает через 3 минуты+100мс.
Нелогичное поведение. Можно  исправить на ожидаемое в 100мс?

Код советника в первом посте https://www.mql5.com/ru/forum/487790/page18#comment_56857418

В вашем коде советника выведите время сразу после запуска таймера и проверьте, когда сработает таймер в следующий раз.

Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек

 
Slava #:

Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек

Запускал тот код. Он, действительно, показывает ошибку таймера.

 
fxsaber #:

Запускал тот код. Он, действительно, показывает ошибку таймера.

Какая ошибка таймера? 5 секунд плюс 100 миллисекунд?

PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?

 
fxsaber #:
Обратите внимание на новую языковую конструкцию.

С массивами так не получится. Только через ArraySwap.

Вообще хотелось бы из массива uchar сразу получить массив любого типа.
Пример использования:
имеется массив float по ссылке получаем его представление, как uchar и сжимаем через CryptEncode(), сохраняем на диск. Экономия дискового пространства в 5-10 раз.

Потом, когда нужно обратиться к этим данным: считываем с диска и распаковываем - из CryptEncode() получаем uchar.

Вот и опять надо получить к нему доступ как к float.

Сейчас видимо только в цикле с преобразованием через union каждого элемента можно такое сделать?

 
Slava #:
Какая ошибка таймера? 5 секунд плюс 100 миллисекунд?

Между выходом из OnTimer и следующем заходом в OnTimer должно пройти 100 мс, судя по коду.

 
Slava #:

В вашем коде советника выведите время сразу после запуска таймера и проверьте, когда сработает таймер в следующий раз.

Судя по Вашему коду, таймер и должен срабатывать через 5 сек + 100 миллисек

Можно и не печатать. В первом посте есть вывод времени в логах от самого терминала:
2025.06.04 11:01:12.364 OnTimer via 4108 ms   - момент предыдущего вызова OnTimer() и его остановки через EventKillTimer() и начало работы медленной функции на 5 секунд
2025.06.04 11:01:17.364 5) Work time: 4999 ms - через 5 сек фунция завершила работу
2025.06.04 11:01:17.364 start timer           - и запустила таймер  EventSetMillisecondTimer(100); 
2025.06.04 11:01:22.472 OnTimer via 5107 ms   - таймер сработал через 5.1 секунды, а не через 0.1 секунды
Тут видно момент запуска таймера и момент его срабатывания. Разница в 5с + 100мс
Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - Создайте проект через визард.
Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - Создайте проект через визард.
  • 2025.06.03
  • User_mt5
  • www.mql5.com
то функция работает очень быстро и таймер всегда срабатывает через 100мс. то следущий сработает через паузу 5 сек 100мс - нужно именно так. Работа через паузу таймером нужна для работы с графической панелью
 
Slava #:

PS Оказывается в лог уже выводится сообщение "start timer". Следующее сообщение "OnTimer via nnn ms" примерно через 100 миллисекунд. Прямо так в представленном логе и написано. Что не так?

100мс только после первого запуска таймера - при последующих уже дополнительные задержки, равные времени от предыдущего срабатывания Ontimer().