Не совпадает подсчет времени - GetTickCount vs GetMicoSecondsCount

 
Пытаюсь протестировать подсчет микросекунд и выглядит он странно.
Во-первых, тестирование идет с фиксированной задержкой в 1000ms, но в логах время открытие позиции совсем нефиксированное.
2018.03.06 21:06:27.830    2018.02.12 23:00:01   deal performed [#2 sell 1.00 XXXXX at 59.15]
2018.03.06 21:06:27.832    2018.02.12 23:00:02   deal performed [#3 buy 1.00 YYYYY at 59.200]

2018.03.06 21:06:27.833    2018.02.12 23:00:02   EXECUTE: 0 vs 4359    // иногда бывает такой результат GetTickCount vs GetMicrosecondCount
2018.03.06 21:09:05.467    2018.02.12 23:00:02   EXECUTE: 16 vs 3890  // иногда такой
Код такой.
ulong startMili = GetTickCount();
ulong startMicro = GetMicrosecondCount();

iTrades.openPosition("ХХХХХ", -1, 1);
iTrades.openPosition("YYYYY", 1, 1);

Print("EXECUTE: " +
  IntegerToString(GetTickCount() - startMili) + " vs " +
  IntegerToString(GetMicrosecondCount() - startMicro));

Вопросы.

1. Почему время милисекунд и микросекунд не совпадает 16 vs 3890?
2. Почему при задержке в 1000ms логи пишут, что все произошло за 0 милисекунд [думаю, асинхронное исполнение и завершение подсчета надо вынести в OnTrade]
3. Почему в логах, когда пишет результат в 0 милисекунд, то время терминала от ордера до сделки начинается в 2018.02.12 23:00:01 и заканчивается в 2018.02.12 23:00:02 [думаю, функция Print асинхронно печатает]

Xотя нет, если смотреть на время терминала, то задержка как раз в секунду получется, тогда вопрос остается только про разницу между GetTickCount / GetMicrosecondCount

 

У GetTickCount погрешность в 16 мс как раз.

Журнал терминала для замеров времени использовать не нужно.