вместо КодоБейз : получаем микросекунды

6 сентября 2025, 06:44
Maxim Kuznetsov
0
18

Мелкая DLL с исходником - текущее время в микросекундном разрешении

Необходимость такой функции вызвана отсутствием аналога в платформе MT и полным недоверием серверным меткам времени.  То что сервер проставляет в поля time_mcs тиков больше похоже на полную лажу, чем на правду.

Желающие могут переделать непосредственно на MQL, без дополнительной DLL, но мне как С-шнику проще так:

#ifndef MQL_MCS_H
#define MQL_MCS_H 1

#define MQL_API(ret) __declspec(dllexport) ret __stdcall

#include <stdint.h>

MQL_API(uint64_t) mcs(void);

#endif
#include <windows.h>
#include <sysinfoapi.h>

#include "mql_mcs.h"

MQL_API(uint64_t) mcs(void)
{
    FILETIME ft;
    //ZeroMemory(ft);
    GetSystemTimeAsFileTime(&ft);
    // 64-bit number of 100-nanosecond intervals since midnight Jan 1, 1601
    long long nsc100 = (LONGLONG)ft.dwLowDateTime + ((LONGLONG)(ft.dwHighDateTime) << 32LL);
    // convert to unix epoch (since Jan 1, 1970)
    nsc100 = nsc100 - 116444736000000000LL;
    // 100 nsc = 0.1 mcs 
    return (uint64_t)(nsc100/10L);
}

время получается в микросекундах, без смещения таймзоны. То есть непосредственно UTC

мейк-файл в архиве сделан для GCC (собственно я только им и пользуюсь, обхожу визуальную студию за версту)


Файлы:
mql_mcs.zip  31 kb