时间间隔计数器

要检测精确到秒的时间间隔,只需计算使用 TimeLocal 获得的两个 datetime 值之间的差值。然而,有时候我们需要更高的精度。为此,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();
   
   // loop for 5 seconds
   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