Как для тестирования в тестере стратегий получить время GMT?

 

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

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


Вот код моих стараний. Самым надежным оказался ручной метод (Первый вариант). 

//+------------------------------------------------------------------+
//|                                              help mql5 forum.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int Winter_standard_time_zone=2;           //Standard Winter time zone (GMT +/- hour)
input bool Daylight_saving_time=true;            //Broker uses daylight saving time
int handle=0;
string vTimeGMT="",DaylightSavings="";
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int sT_tiMe=0;
   int tiMe=0;
   tiMe=(int)iTime(Symbol(),PERIOD_D1,0);
//---
   if(tiMe-sT_tiMe>=1)
     {
      sT_tiMe=tiMe;

      // Первый вариант 
      int TimeCorrection=Winter_standard_time_zone*3600 /*секунды в одном часу*/;
      int month=Month();
      if(Daylight_saving_time && month>=4 && month<=10)
        {
         TimeCorrection=(Winter_standard_time_zone+1 /*Летом + один час*/)*3600;
         DaylightSavings="Летнее время";
        }
      else
         DaylightSavings="Зимнее время";
      vTimeGMT="Первый вариант расчетов времени GMT: "+TimeToString((int)TimeCurrent()-TimeCorrection,TIME_SECONDS)
               +" / TimeCurrent: "+TimeToString(TimeCurrent(),TIME_SECONDS);
      Print("-------------");
      Print(DaylightSavings);
      Print(vTimeGMT);

      // Второй вариант 
      // При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent(). 
      // TimeGMTOffset()- Возвращает текущую разницу между временем GMT и локальным временем компьютера, TimeLocal(),
      // в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.
      vTimeGMT="Второй вариант расчетов времени GMT: "+TimeToString((int)TimeCurrent()+TimeGMTOffset(),TIME_SECONDS)
               +" / TimeCurrent: "+TimeToString(TimeCurrent(),TIME_SECONDS);
      Print(vTimeGMT);

      // Третий вариант 
      // При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent(). 
      // TimeGMTOffset()- Возвращает текущую разницу между временем GMT и локальным временем компьютера, TimeLocal(),
      // в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.
      // TimeGMTOffset() =  TimeGMT() - TimeLocal()
      vTimeGMT="Третий вариант расчетов времени GMT: "+TimeToString((int)TimeCurrent()+(TimeGMT()-TimeLocal()),TIME_SECONDS)
               +" / TimeCurrent: "+TimeToString(TimeCurrent(),TIME_SECONDS);
      Print(vTimeGMT);

      // Четвертый вариант 
      // При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent(). 
      // TimeGMTOffset()- Возвращает текущую разницу между временем GMT и локальным временем компьютера, TimeLocal(),
      // в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.
      // TimeDaylightSavings() -Возвращает поправку на летнее время в секундах, если был произведен переход на летнее время. Зависит от настроек времени на компьютере пользователя.
      vTimeGMT="Четвертый вариант расчетов времени GMT: "+TimeToString((int)TimeCurrent()+TimeGMTOffset()-TimeDaylightSavings(),TIME_SECONDS)
               +" / TimeCurrent: "+TimeToString(TimeCurrent(),TIME_SECONDS);
      Print(vTimeGMT);
     }
  }
//+------------------------------------------------------------------+


Полученный результат:

0       14:34:57.789    TestGenerator: current spread 20 used
2       14:34:57.808    2017.03.30 00:00:00  help mql5 forum inputs: Winter_standard_time_zone=2; Daylight_saving_time=1; 
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: -------------
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Зимнее время
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Первый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Второй вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Третий вариант расчетов времени GMT: 00:00:00 / TimeCurrent: 00:00:00
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Четвертый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: -------------
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: Зимнее время
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: Первый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: Второй вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: Третий вариант расчетов времени GMT: 00:00:00 / TimeCurrent: 00:00:00
0       14:34:57.819    2017.03.31 00:00:00  help mql5 forum EURUSD,Daily: Четвертый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: -------------
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: Летнее время
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: Первый вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: Второй вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: Третий вариант расчетов времени GMT: 00:00:00 / TimeCurrent: 00:00:00
0       14:34:57.831    2017.04.03 00:00:00  help mql5 forum EURUSD,Daily: Четвертый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: -------------
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: Летнее время
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: Первый вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: Второй вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: Третий вариант расчетов времени GMT: 00:00:00 / TimeCurrent: 00:00:00
0       14:34:57.842    2017.04.04 00:00:00  help mql5 forum EURUSD,Daily: Четвертый вариант расчетов времени GMT: 22:00:00 / TimeCurrent: 00:00:00
0       14:34:57.852    EURUSD,Daily: 266611 tick events (1005 bars, 267611 bar states) processed in 0:00:00.031 (total time 0:00:00.062)

Все результаты кроме первого - неправильны!

Но хотелось в тесте время TimeGMT получить автоматически. Подскажите если есть такая возможность.

 
cripple:

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

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


Вот код моих стараний. Самым надежным оказался ручной метод (Первый вариант). 


Полученный результат:

Все результаты кроме первого - неправильны!

Но хотелось в тесте время TimeGMT получить автоматически. Подскажите если есть такая возможность.

TimeGMT

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

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

datetime  TimeGMT();

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

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

Параметры

dt_struct

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

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

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

Примечание

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

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

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

 
Vitaly Muzichenko:

TimeGMT

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

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

datetime  TimeGMT();

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

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

Параметры

dt_struct

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

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

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

Примечание

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

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

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


Вы красным выделили то что я в первой строке из справочника написал. 

Но Так и не ответили как самому рассчитать Time GMT чтоб это работало в тестере стратегий.

 

Можете вручную задавать к времени  TimeCurrent()  сдвиг на нужное время, но оно будет постоянным, и без учёта перехода на летнее время

 

Так же странно что TimeGMTOffset() и  TimeGMT() - TimeLocal() по сути одно и тоже

      // TimeGMTOffset()- Возвращает текущую разницу между временем GMT и локальным временем компьютера, TimeLocal(),
      // в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.
      // TimeGMTOffset() =  TimeGMT() - TimeLocal()


 но результат получается разный:

0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Второй вариант расчетов времени GMT: 21:00:00 / TimeCurrent: 00:00:00
0       14:34:57.808    2017.03.30 00:00:00  help mql5 forum EURUSD,Daily: Третий вариант расчетов времени GMT: 00:00:00 / TimeCurrent: 00:00:00
 
Vitaly Muzichenko:

Можете вручную задавать к времени  TimeCurrent()  сдвиг на нужное время, но оно будет постоянным, и без учёта перехода на летнее время


Посмотрите мой представлений код, там все уже реализовано

input int Winter_standard_time_zone=2;           //Standard Winter time zone (GMT +/- hour)
input bool Daylight_saving_time=true;            //Broker uses daylight saving time
int handle=0;
string vTimeGMT="",DaylightSavings="";
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int sT_tiMe=0;
   int tiMe=0;
   tiMe=(int)iTime(Symbol(),PERIOD_D1,0);
//---
   if(tiMe-sT_tiMe>=1)
     {
      sT_tiMe=tiMe;

      // Первый вариант 
      int TimeCorrection=Winter_standard_time_zone*3600 /*секунды в одном часу*/;
      int month=Month();
      if(Daylight_saving_time && month>=4 && month<=10)
        {
         TimeCorrection=(Winter_standard_time_zone+1 /*Летом + один час*/)*3600;
         DaylightSavings="Летнее время";
        }
      else
         DaylightSavings="Зимнее время";
      vTimeGMT="Первый вариант расчетов времени GMT: "+TimeToString((int)TimeCurrent()-TimeCorrection,TIME_SECONDS)
               +" / TimeCurrent: "+TimeToString(TimeCurrent(),TIME_SECONDS);
      Print("-------------");
      Print(DaylightSavings);
      Print(vTimeGMT);
     }
  }


Но вопрос был: как Time GMT рассчитать автоматически для тестера стратегий? В реальном времени все и так работает.

 

Автоматически — никак.

Только конвертировать серверное время (время котировок) к GMT с учетом указанного сдвига (нужно определить для каждого брокера) и перехода на летнее/зимнее (тоже бывает по разным правилам у разных брокеров).

 
Vitaly Muzichenko:

Можете вручную задавать к времени  TimeCurrent()  сдвиг на нужное время, но оно будет постоянным, и без учёта перехода на летнее время

Можно, я когда-то делал такое. Только приходится отдельную библиотеку атачить к своему коду. Задача разбивается на две части: 1 - определить какое время на сервере зимнее/летнее. 2 - определить время gmt зная сдвиг о времени сервера и учитывая возможный переход на зиму/лето.
В параметры робота добавляем два параметра: 1 - определяет сдвиг времени сервера по зимнему времени относительно gmt. 2 - отвечает за переход зима/лето.

Переход зима/лето: 1 - не выполняется, 2 - выполняется по США, 3 - выполняется по Европе.

 
Дополнение к посту.

Основу специализированной библиотеки составляют два enum-a и переписанная параметрическая TimeGMT.

У функции три параметра: 1 - исходное время, 2 - сдвиг времени сервера (зима), 3 - признак перехода зима/лето.

Если работаем в реале то TimeGMT вызывает классический расчет, а если в тестер - производим спец расчет на основе входных параметров и времени сервера.
 
Vladimir Batrudinov:
Дополнение к посту.

Основу специализированной библиотеки составляют два enum-a и переписанная параметрическая TimeGMT.

У функции три параметра: 1 - исходное время, 2 - сдвиг времени сервера (зима), 3 - признак перехода зима/лето.

Если работаем в реале то TimeGMT вызывает классический расчет, а если в тестер - производим спец расчет на основе входных параметров и времени сервера.

Самообман

 
Vitaly Muzichenko:

Самообман

Спорное утверждение. Знаю точно - метод работает и не только для определения времени в тестере стратегий.

Неоднократно пользовался этим методом в МТ5 - там он работает четко и без сбоев, в МТ4 есть архитектурные отличия и работа там ведется немного по иному - но и тут вполне работает все.

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