Определение времени сервера и времени выхода новостей

22 марта 2017, 07:38
Yury Kirillov
1
618
...блог обновляется...

Тема возникла в связи со следующей задачей (МТ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

...

Ihor Herasko 2016.09.16 13:08     RU
Maxim Kuznetsov:
   serverOffset=TimeGMT()-TimeCurrent();  // GMT смещение времени сервера
   localOffset=TimeGMT()-TimeLocal();     // GMT смещение локального времени


из https://www.mql5.com/ru/blogs/post/677209 , а там насколько помню, из обсуждений TimeGMT()

Только уточнить, что вот это:

serverOffset=TimeGMT()-TimeCurrent();  // GMT смещение времени сервера

нужно вставлять в OnTick() и при условии, что OnTick() не вызывается другими функциями кода. Иначе будем получать неправильный результат в выходные, т. к. TimeCurrent() указывает в это время на последний тик пятницы. Есть риск получить serverOffset больше 24-х часов.)))

...

Справочник MQL4 / Дата и время / TimeGMT

TimeGMT

Возвращает время GMT, которое вычисляется с учётом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

Вызов без параметров

datetime  TimeGMT();

Вызов с параметром типа MqlDateTime

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // переменная типа структуры
   );

Параметры

dt_struct

[out]  Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.

Для организации счетчиков и таймеров высокого разрешения нужно использовать функцию GetTickCount(), которая выдает значения в миллисекундах.

При работе в тестере стратегий время TimeGMT() всегда равно моделируемому серверному времени TimeCurrent().

...

Справочник MQL4 / Дата и время / TimeCurrent

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.

Вызов без параметров

datetime  TimeCurrent();

Вызов с параметром типа MqlDateTime

datetime  TimeCurrent(
   MqlDateTime&  dt_struct      // переменная типа структуры
   );

Параметры

dt_struct

[out]  Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.

Для организации счетчиков и таймеров высокого разрешения нужно использовать функцию GetTickCount(), которая выдает значения в миллисекундах.

При работе в тестере стратегий время последней котировки TimeCurrent() моделируется в соответствии с историческими данными.

...

Справочник MQL4 / Дата и время / TimeLocal

TimeLocal

Возвращает локальное время компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

Вызов без параметров

datetime  TimeLocal();

Вызов с параметром типа MqlDateTime

datetime  TimeLocal(
   MqlDateTime&  dt_struct      // переменная типа структуры
   );

Параметры

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)
  }
//+------------------------------------------------------------------+


Предложения и комментарии приветствуются! :-)





Файлы:
TimeTest.mq4  6 kb
Поделитесь с друзьями: