Счетчики временных интервалов

Чтобы засечь интервал времени с точностью до секунды, достаточно взять разницу между двумя значениями datetime, полученными с помощью TimeLocal. Однако иногда нам требуется более высокая точность. Для этой цели MQL5 позволяет получать системные счетчики миллисекунд (GetTickCount, GetTickCount64) или микросекунд (GetMicrosecondCount).

uint GetTickCount()

ulong GetTickCount64()

Функции возвращают количество миллисекунд, прошедших с момента загрузки операционной системы. Точность отсчета времени ограничена стандартным системным таймером (~10-15 миллисекунд). Для более точного измерения интервалов используйте функцию GetMicrosecondCount.

В случае функции GetTickCount тип возвращаемого значения uint предопределяет период времени, через который счетчик будет переполняться: примерно 49.7 суток. Иными словами, отсчет снова пойдет с 0, если компьютер не выключался столь длительное время.

В отличие от неё, функция GetTickCount64 возвращает значения ulong, и этот счетчик не переполняется в обозримом будущем (584'942'417 лет).

ulong GetMicrosecondCount()

Функция возвращает количество микросекунд, прошедших со старта MQL-программы.

Примеры использования функций счетчиков и Sleep сведены в скрипт TimeCount.mq5.

void OnStart()
{
   const uint startMs = GetTickCount();
   const ulong startMcs =  GetMicrosecondCount();
   
   // цикл на 5 секунд
   while(PRTF(GetTickCount()) < startMs + 5000)
   {
      PRTF(GetMicrosecondCount());
      Sleep(1000);
   }
   
   PRTF(GetTickCount() - startMs);
   PRTF(GetMicrosecondCount() - startMcs);
}

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

GetTickCount()=12912811 / ok
GetMicrosecondCount()=278 / ok
GetTickCount()=12913903 / ok
GetMicrosecondCount()=1089845 / ok
GetTickCount()=12914995 / ok
GetMicrosecondCount()=2182216 / ok
GetTickCount()=12916087 / ok
GetMicrosecondCount()=3273823 / ok
GetTickCount()=12917179 / ok
GetMicrosecondCount()=4365889 / ok
GetTickCount()=12918271 / ok
GetTickCount()-startMs=5460 / ok
GetMicrosecondCount()-startMcs=5458271 / ok