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

 
Aleksey Vyazmikin:

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


У меня работает все :-)

Maxim Kuznetsov:

вообще это ЗЛО...

Может мне так проще? Пару раз в неделю ручками запустить, если видишь, что можешь доверять, а потом с какими-то критериями доверия, м.б., и на автомат повешу.

Мотивы долго объяснять и нецелесообразно.

 
Alexander Belozerov:

У меня работает все :-)

Вот так всегда :(

 
Aleksey Vyazmikin:

Вот так всегда :(


Кто же тут угадает, почему у Вас не работает? Может в ОС какие-то глюки или блокировки? MT5 с правами администратора запускаете? (иначе работать точно не будет)

В общем у меня работает в "terminal64.exe" на графике EURUSD некоего популярного ДЦ/брокера, который имеет лицензию ЦБ РФ по Forex, что спокойно проверяется переводом времени до запуска скрипта.

Ну, и, скорее всего, Вы мой код подизменили, судя по скриншоту, может что-то не то сделали, а так все равно, кроме Вас вряд ли наверняка догадаешься, в чем причина 

 
Aleksey Vyazmikin:

Вот так всегда :(


Хотя на Вашем месте, м.б., я бы еще попробовал везде в коде заменить "short" на "int", мало ли где-то структура-аргумент функции "SetSystemTime" несколько иначе организована, и то я в этом сильно сомневаюсь, а искать эту информацию не горю желанием.

Да, и разрешены ли DLL везде?

 
Alexander Belozerov:

Кто же тут угадает, почему у Вас не работает? Может в ОС какие-то глюки или блокировки? MT5 с правами администратора запускаете? (иначе работать точно не будет)

В общем у меня работает в "terminal64.exe" на графике EURUSD некоего популярного ДЦ/брокера, который имеет лицензию ЦБ РФ по Forex, что спокойно проверяется переводом времени до запуска скрипта.

Ну, и, скорее всего, Вы мой код подизменили, судя по скриншоту, может что-то не то сделали, а так все равно, кроме Вас вряд ли наверняка догадаешься, в чем причина 


Код не правил вообще.

Я запускаю на MOEX - брокер Открытие - может это как-то влияет?

Если библиотеки не разрешить, то вообще не запустить.

Windows 7 64x - права администратора.

Alexander Belozerov:

Хотя на Вашем месте, м.б., я бы еще попробовал везде в коде заменить "short" на "int", мало ли где-то структура-аргумент функции "SetSystemTime" несколько иначе организована, и то я в этом сильно сомневаюсь, а искать эту информацию не горю желанием.

Да, и разрешены ли DLL везде?

Попробую заменить.

 
Aleksey Vyazmikin:

Код не правил вообще.

Я запускаю на MOEX - брокер Открытие - может это как-то влияет?

Если библиотеки не разрешить, то вообще не запустить.

Windows 7 64x - права администратора.

Попробую заменить.


Да, скорее всего, это какие-то неведомые глюки софтовые и т. п., можно только попробовать установить терминал др. брокера, на др. компьютере попробовать и т. п. В общем Alpari MT5 build 1643, вроде последний билд, - у меня все работает, терминал 64-битный. Разница во времени с сайтом https://www.mobatime.ru/ не превышает 2 секунд.

Замена "short" на "int", откровенно говоря, сомневаюсь, что она даст что-либо.

Чтобы у Alpari не регистрироваться, наверное, можете здесь MT5 взять, и подключиться к "MetaQuotes-Demo", а также в MT4 попробовать.

Дополнение: на моем VDS, который работает через удаленный рабочий стол Windows, и на нем используется Windows Server 2008 R2 (x64, Standart, SP1) тоже все работает.
 

А не работает потому, что нужно синхронизировать не SysTime а LoсalTime

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

#import "kernel32.dll"
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
 
prostotrader:

А не работает потому, что нужно синхронизировать не SysTime а LoсalTime

В чем реальная разница? Хотя бы в том, что Вы лично попробовали оба варианта? Простите, но пока я только замену букв вижу, и заметьте, что у меня работает код скрипта, который приведен выше.

 
Alexander Belozerov:

В чем реальная разница? Хотя бы в том, что Вы лично попробовали оба варианта? Простите, но пока я только замену букв вижу, и заметьте, что у меня работает код скрипта, который приведен выше.

Заинтересовался. Почему-то у меня тоже работает именно SetLocalTime. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724936(v=vs.85).aspx:

The system uses UTC internally. Therefore, when you call SetLocalTime, the system uses the current time zone information to perform the conversion, including the daylight saving time setting. Note that the system uses the daylight saving time setting of the current time, not the new time you are setting. Therefore, to ensure the correct result, call SetLocalTime a second time, now that the first call has updated the daylight saving time setting.

Перевод от гугл:

Система использует UTC внутренне. Поэтому, когда вы вызываете SetLocalTime, система использует текущую информацию о часовом поясе для выполнения преобразования, включая настройку летнего времени. Обратите внимание, что в системе используется настройка времени летнего времени текущего времени, а не новое время, которое вы устанавливаете. Поэтому, чтобы обеспечить правильный результат, вызовите SetLocalTime второй раз, теперь, когда первый вызов обновил настройку летнего времени.

То есть SetSystemTime не учитывает настройки региона в ОС: часовой пояс и переход на летнее время.


О том, почему не выходит синхронизировать при разнице времен на 37 секунд. Интересно, а как при такой синхронизации поступать с тиками, пришедшими в "нелегальное", пропущенное время? Удалить их из истории тиков, поправить минутки и др.? Это должен сделать терминал или сервер?

Кстати, не следует питать надежды на то, что системное время на сервере MT хорошо синхронизировано с астрономическим. Я задавал об этом вопрос разработчикам, они ответили, что уже лет 10 в серверах MT предоставляется штатная функция синхронизации времени по протоколу SNTP (до секунд), но применять ее или нет, решают администраторы серверов. Если понаблюдать за последним временем сервера в окне обзора рынка, можно увидеть вручную разницу в номере последней секунды, и эта разница между серверами устойчива.

SetLocalTime function (Windows)
  • msdn.microsoft.com
Sets the current local time and date. Syntax Parameters lpSystemTime [in] A pointer to a SYSTEMTIME structure that contains the new local date and time. The wDayOfWeek member of the SYSTEMTIME structure is ignored. Return value If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get...
 

Всем привет.

Подскажите почему при вызове функции SetLocalTime или SetSystemTime скрипт просто закрывается, И не появляется MessageBox?

Ошибок ни каких не выдает.

Использую MT4.

Когда по дебагу смотрю  переменную TradeServerTime то стазу за фигурной скобкой стоит 2 пробела.

WindowsSystemTime{  wYear:2017 wMonth:10 wDayOfWeek:5 wDay:20 wHour:15 wMinute:9 wSecond:51 wMilliseconds:0 }

Пробовал запускать все от админа.


#property   script_show_inputs
#property   strict

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

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

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

int OnStart()
{
   bool        bSetSystemTimeResult=false;
   datetime    dtBeforeScriptTime=TimeLocal();
   MqlDateTime dtStruct;
   TimeToStruct(TimeCurrent()+3600*iDeltaHours, dtStruct);
   TradeServerTime.wYear         =  int(dtStruct.year);
   TradeServerTime.wMonth        =  int(dtStruct.mon);
   TradeServerTime.wDayOfWeek    =  int(dtStruct.day_of_week);
   TradeServerTime.wDay          =  int(dtStruct.day);
   TradeServerTime.wHour         =  int(dtStruct.hour);
   TradeServerTime.wMinute       =  int(dtStruct.min);
   TradeServerTime.wSecond       =  int(dtStruct.sec);
   TradeServerTime.wMilliseconds =  0;
   bSetSystemTimeResult=SetLocalTime(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;
}