Тема возникла в связи со следующей задачей (МТ4):
1. Новости парсятся с investing.com по GMT+2.
2. В основном это совпадает со временем серверов:
- FXCM
- Roboforex
- Alpari
- ICM
кроме TeleTrade, там ещё (-1 час).
3. При переходе на летнее/зимнее время время серверов скачет.
4. Хочется автоматически вычислять смещение для корректировки времени новостей по серверному времени.
5. При этом обеспечить корректную работу как в реале, так и в тестере.
Подборка информации по определению времени (МТ4).
http://www.worldtimezone.com/time-europe12.php
Смещение торгового времени сервера
https://www.mql5.com/ru/forum/95631
...
localOffset=TimeGMT()-TimeLocal(); // GMT смещение локального времени
из https://www.mql5.com/ru/blogs/post/677209 , а там насколько помню, из обсуждений TimeGMT()
Только уточнить, что вот это:
serverOffset=TimeGMT()-TimeCurrent(); // GMT смещение времени сервера
нужно вставлять в OnTick() и при условии, что OnTick() не вызывается другими функциями кода. Иначе будем получать неправильный результат в выходные, т. к. TimeCurrent() указывает в это время на последний тик пятницы. Есть риск получить serverOffset больше 24-х часов.)))
...
|
TimeGMT
Возвращает время GMT, которое вычисляется с учётом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.
Вызов без параметров
datetime TimeGMT(); |
Вызов с параметром типа MqlDateTime
datetime TimeGMT( |
Параметры
dt_struct
[out] Переменная типа структуры MqlDateTime.
Возвращаемое значение
Значение типа datetime
Примечание
Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.
Для организации счетчиков и таймеров высокого разрешения нужно использовать функцию GetTickCount(), которая выдает значения в миллисекундах.
При работе в тестере стратегий время TimeGMT() всегда равно моделируемому серверному времени TimeCurrent().
...
|
TimeCurrent
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.
Вызов без параметров
datetime TimeCurrent(); |
Вызов с параметром типа MqlDateTime
datetime TimeCurrent( |
Параметры
dt_struct
[out] Переменная типа структуры MqlDateTime.
Возвращаемое значение
Значение типа datetime
Примечание
Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.
Для организации счетчиков и таймеров высокого разрешения нужно использовать функцию GetTickCount(), которая выдает значения в миллисекундах.
При работе в тестере стратегий время последней котировки TimeCurrent() моделируется в соответствии с историческими данными.
...
|
TimeLocal
Возвращает локальное время компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.
Вызов без параметров
datetime TimeLocal(); |
Вызов с параметром типа MqlDateTime
datetime TimeLocal( |
Параметры
dt_struct
[out] Переменная типа структуры MqlDateTime.
Возвращаемое значение
Значение типа datetime
Примечание
Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.
Для организации счетчиков и таймеров высокого разрешения нужно использовать функцию GetTickCount(), которая выдает значения в миллисекундах.
При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent().
...
Настроить синхронизацию времени виндовус например по "time.nist.gov" так-как TimeGMT() тупо берёт время с компа и добавляет к нему смещение GMT.
Тестер для анализа смещения времени сервера от GMT и детектирования ошибки установки часов компьютера (ошибки более 30 минут не детектируются):
//+------------------------------------------------------------------+ //| TimeTest.mq4 | //| LibreCoin (c)2017 | //| https://www.mql5.com/ru/blogs/post/690942 | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, KirillovYV aka LibreCoin." #property link "https://www.mql5.com/ru/blogs/post/690942" #property version "1.001" #property strict #property description "**************************************************" #property description " Expert TimeTest v1.001 (mql4)" #property description " Server offset from GMT calculator and" #property description " computer clock error (max: 30 min) indicator" #property description " From Russia with Love! :-)" #property description " https://www.mql5.com/ru/blogs/post/690942" #property description "**************************************************" //+------------------------------------------------------------------+ //| Tuning Interface | //+------------------------------------------------------------------+ input int BaseOffSet=0; //OffSet базовое смещение в часах input int TimeErrorLimit=5; //TimeErrorLimit - порог предупреждения ошибки часов компьютера в секундах //+------------------------------------------------------------------+ //| Expert variable definitions | //+------------------------------------------------------------------+ int serverOffset; int OffSetHour; int OffSetError; //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- serverOffset=(int)(TimeCurrent()-TimeGMT())-BaseOffSet*3600; // GMT смещение времени сервера Print( "BaseOffSet=",((BaseOffSet>=0)?("+"):("")),BaseOffSet, " TimeGMT=",TimeGMT(), " TimeCurrent=",TimeCurrent(), " Server OffSet=",serverOffset); OffSetHour=(int)(MathFloor((serverOffset+1799.0)/3600.0)); OffSetError=(int)(MathMod((OffSetHour*3600.0-serverOffset+1800),3600.0)-1800); Print( "OffSetHour=",((OffSetHour>=0)?("+"):("")),OffSetHour, " OffSetError(sec)=",OffSetError); {if(OffSetError>=TimeErrorLimit) { Print("Нужна синхронизация часов компьютера!"); }}//if(OffSetError>=TimeErrorLimit) } //+------------------------------------------------------------------+
Предложения и комментарии приветствуются! :-)