Синхронизация времени Windows по времени торгового сервера

 

Есть желание по ряду причин синхронизировать время в Windows по времени торгового сервера.

Можно ли это как-то сделать, обойдясь только средствами MQL4.

Пробую вот такой вариант, но не срабатывает:

#import "C:\\Windows\\system32\\kernel32.dll"
   bool  SetSystemTime(MqlDateTime& dt_struct);
#import

int OnStart()
{
   MqlDateTime dtStruct;
   TimeToStruct(TimeCurrent(), dtStruct);
   SetSystemTime(dtStruct);            //вызов функции из kernel32.dll
   MessageBox(StringFormat("TimeCurrent\t=%s\n\nLocalTime\t\t=%s",
                           TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                           TimeToString(TimeLocal(), TIME_DATE|TIME_MINUTES|TIME_SECONDS)),
               NULL, MB_ICONEXCLAMATION);
   return   INIT_SUCCEEDED;
}
 
Что-то я не вижу вызов функции установки времени. Или так должно быть?
 
Alexey Viktorov:
Что-то я не вижу вызов функции установки времени. Или так должно быть?

ой, это я похоже в торопях кинул сюда все; исправил; суть в том, что не работает, м.б. структуры времени для MQL4 и WinAPI не совпадают или что?

Даже при запуске MT4 с правами администратора в итоге:

TimeCurrent = 2017.08.04 18:48:17

LocalTime = 2017.08.04 18:48:11

 

Да, действительно:

1) не совпадают структуры а) MqlDateTime и б) аргумент функции SetSystemTime

2) в отредактированном варианте все работает, но только при запуске MetaTrader 4 с правами администратора.

Рабочий вариант:

#property   description "Скрипт устанавливает локальное время по торговому серверу"
#property   version     "0.00"   //!!!BETA!!!
#property   script_show_inputs
#property   strict

struct WindowsSystemTime
{
   short wYear;
   short wMonth;
   short wDayOfWeek;
   short wDay;
   short wHour;
   short wMinute;
   short wSecond;
   short wMilliseconds;
}  TradeServerTime;

#import "kernel32.dll"
   bool  SetSystemTime(WindowsSystemTime& dtWindowsStruct);
#import

input int   iDeltaHours =  -3;         //Подбирается по часовым поясам

int OnStart()
{
   bool        bSetSystemTimeResult=false;
   datetime    dtBeforeScriptTime=TimeLocal();
   MqlDateTime dtStruct;
   TimeToStruct(TimeCurrent()+3600*iDeltaHours, dtStruct);
   TradeServerTime.wYear         =  short(dtStruct.year);
   TradeServerTime.wMonth        =  short(dtStruct.mon);
   TradeServerTime.wDayOfWeek    =  short(dtStruct.day_of_week);
   TradeServerTime.wDay          =  short(dtStruct.day);
   TradeServerTime.wHour         =  short(dtStruct.hour);
   TradeServerTime.wMinute       =  short(dtStruct.min);
   TradeServerTime.wSecond       =  short(dtStruct.sec);
   TradeServerTime.wMilliseconds =  0;
   bSetSystemTimeResult=SetSystemTime(TradeServerTime);            //вызов функции из kernel32.dll
   MessageBox(StringFormat("BeforeScriptTime\t\t=    %s\nTimeCurrent\t\t=    %s\nLocalTime\t\t\t=    %s",
                           TimeToString(dtBeforeScriptTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                           TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                           TimeToString(TimeLocal(), TIME_DATE|TIME_MINUTES|TIME_SECONDS)),
               NULL, MB_ICONASTERISK);
   return   INIT_SUCCEEDED;
}
 
Alexander Belozerov:

Да, действительно:

1) не совпадают структуры а) MqlDateTime и б) аргумент функции SetSystemTime

2) в отредактированном варианте все работает, но только при запуске MetaTrader 4 с правами администратора.

Рабочий вариант:


Полезная вещь!

А на MT5 будет работать?

 
Aleksey Vyazmikin:

Полезная вещь!

А на MT5 будет работать?


Практически наверняка, ну, Вы попробуйте, м.б., что-то модифицировать надо немножко.

Скорее всего, для любопытства и саморазвития, погодя сделаю сам, хотя это все надо в конечном итоге засовывать в свой вспомогательный советник.

 
Alexander Belozerov:

Практически наверняка, ну, Вы попробуйте, м.б., что-то модифицировать надо немножко.

Скорее всего, для любопытства и саморазвития, погодя сделаю сам, хотя это все надо в конечном итоге засовывать в свой вспомогательный советник.


Пробовал в MT5 - синхронизации нет - получил такую табличку:


 
Aleksey Vyazmikin:   Пробовал в MT5 - синхронизации нет - получил такую табличку:

Тики от сервера редки, вот и разница

 
STARIJ:

Тики от сервера редки, вот и разница


Не наблюдаю - вижу тики чаще чем раз в секунду, а разница остается.

 
Aleksey Vyazmikin:

Не наблюдаю - вижу тики чаще чем раз в секунду, а разница остается.

в настройках винды убери синхронизацию времени. Если винда в виртуалке, то и на хост машине тоже

вообще это ЗЛО - часто подкручивать часы невесть от какого сигнала с какой задержкой..
системный NTP правильно настройте чтобы часики тикали равномерно и синхронно с серверами времени, будет счастье: часы реального времени будут отличаться от серверных на разницу GMT, метки времени в тиках будут отличаться от часов на "накладные задержки" (время путешествия тика от генерации до приёма на вашей стороне, это можно будет замерить)

 
Maxim Kuznetsov:

в настройках винды убери синхронизацию времени. Если винда в виртуалке, то и на хост машине тоже

вообще это ЗЛО - часто подкручивать часы невесть от какого сигнала с какой задержкой..
системный NTP правильно настройте чтобы часики тикали равномерно и синхронно с серверами времени, будет счастье: часы реального времени будут отличаться от серверных на разницу GMT, метки времени в тиках будут отличаться от часов на "накладные задержки" (время путешествия тика от генерации до приёма на вашей стороне, это можно будет замерить)


Синхронизация отключена, конечно.

Часто подкручивать не хочу - нормальный сервер времени по Москве, что б работал и учитывал местные причуды перехода на зиму лету, найти не могу.

Понятно, что сверх точной синхронизации не будет, но меня устроит лаг в 1,5 секунды.