Время и часовые пояса у брокеров

 
Друзья нужна помощь, совсем запутался.
1)Как в советниках выставляться часовые пояса ?
2)В тесте учитываются пояса или нет ?
Например у нас есть временные ограничения по торговле, запрещено торговать в 00 часов по GMT+3.
Это 21:00 по GMT+0.
У одного брокера +3 GMT а у другого +2.
Что нужно сделать ? заранее выставлять время GMT+0 или добавлять ко времени ?
extern GMT = 3;
extern time_ban = 0;
if(Hour()!=time_ban+GMT){торгуем}
//В этом случае у нас запрещена торговля будет в 3 ночи а не в 0.. 

или заранее выставлять время GMT+0 ?

extern GMT = 3;
extern time_ban = 21;
if(Hour()!=time_ban+GMT){торгуем}

Что если у брокера GMT -2 ?

Или же нужно делать внутренне время советника ?

GetTimeGMT(GMT0); Запарсить время GMT+0 с time.com
ВНУТРЕННЕЕ_ВРЕМЯ = GMT0+3;
if(ВНУТРЕННЕЕ_ВРЕМЯ!=0){ТОРГУЕМ}

Ни один из эти вариантов мне кажется не правильным,
Возможно это кому то покажется смешным но мне правда не понятно как это сделать..
Буду рад любым подсказкам! 

 
Sergey Lisnyak:
Друзья нужна помощь, совсем запутался.
1)Как в советниках выставляться часовые пояса ?
2)В тесте учитываются пояса или нет ?
Например у нас есть временные ограничения по торговле, запрещено торговать в 00 часов по GMT+3.
Это 21:00 по GMT+0.
У одного брокера +3 GMT а у другого +2.
Что нужно сделать ? заранее выставлять время GMT+0 или добавлять ко времени ?

или заранее выставлять время GMT+0 ?

Что если у брокера GMT -2 ?

Или же нужно делать внутренне время советника ?

Ни один из эти вариантов мне кажется не правильным,
Возможно это кому то покажется смешным но мне правда не понятно как это сделать..
Буду рад любым подсказкам! 

есть замечательная ф-ция TimeGMT()

 
Sergey Lisnyak:

Возможно это кому то покажется смешным но мне правда не понятно как это сделать..
Буду рад любым подсказкам! 

Все программы, написанные на MQL, оперируют временем сервера. Его не нужно преобразовывать. Если указано, что не торговать с 0 до 7 часов, то по времени сервера торговля и не будет происходить в этот период. Тестер работает аналогично - по времени котировок, указанных в истории котировок. 

Если же нужно преобразовать время, взятое на другом компьютере, во время сервера брокера, то да, в некотором роде это может стать проблемой, т. к. универсального способа определения времени смещения от GMT у сервера не существует. Я обычно делаю так:

datetime g_serverTimeGMTOffset;                                                                    // Смещение между временем сервера и GMT в секундах
bool g_bIsTickProcessed;                                                                           // Признак обработки первого тика приложением


int OnInit()
{
   ...

   g_isTickProcessed = false;
   
   ...
}

void OnTick()
{
   ...

   if (!g_bIsTickProcessed)
   {
      g_bIsTickProcessed = true;
      g_serverTimeGMTOffset = (datetime)(MathRound(((TimeCurrent() - TimeGMT()) / 3600)) * 3600);
   }
   ...
}

До тех пор, пока g_bIsTickProcessed равно false, использовать значение g_serverTimeGMTOffset нельзя, т. к. в выходные TimeCurrent() вернет время последнего тика пятницы.

 
Maxim Kuznetsov:

есть замечательная ф-ция TimeGMT()

Это локальное время которое зависит от часового пояса и времени на компьютере, не хочется от этого зависить.

Ihor Herasko:

Все программы, написанные на MQL, оперируют временем сервера. Его не нужно преобразовывать. Если указано, что не торговать с 0 до 7 часов, то по времени сервера торговля и не будет происходить в этот период. Тестер работает аналогично - по времени котировок, указанных в истории котировок. 

Если же нужно преобразовать время, взятое на другом компьютере, во время сервера брокера, то да, в некотором роде это может стать проблемой, т. к. универсального способа определения времени смещения от GMT у сервера не существует. Я обычно делаю так:

До тех пор, пока g_bIsTickProcessed равно false, использовать значение g_serverTimeGMTOffset нельзя, т. к. в выходные TimeCurrent() вернет время последнего тика пятницы.

Да верно, торговать с 0 до 7 он не будет, вот только понятие с 0 до 7 у разных брокеров разное, у некоторых закрытие дневной сессии в 00:00 у некоторых в 22:00.
Как вычислить разницу GMT мне понятно, просто хотел узнать как вы ограничиваете торговлю у себя. Сдвиг GMT плюсуют ко времени бана или просто пишут в настройках изначально настройки со сдвигом GMT+0, всегда думал что это как то должно делаться элементарно но как то все оказалось запутанным для меня.
Например если добавлять сдвиг ко времени бана тогда может получится марока если сдвиг отрицательный, GMT-3 = 00:00-3 = -3 а не 21:00.

 
Sergey Lisnyak:

Например если добавлять сдвиг ко времени бана тогда может получится марока если сдвиг отрицательный, GMT-3 = 00:00-3 = -3 а не 21:00.

Просто потому, что способ выбран неправильный. Нужно оперировать таймштампом. С ним все просто:

datetime dtGMTByServerTime = TimeCurrent() - g_serverTimeGMTOffset;

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

 
Ihor Herasko:

Просто потому, что способ выбран неправильный. Нужно оперировать таймштампом. С ним все просто:

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

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

 
Ihor Herasko:

т. к. универсального способа определения времени смещения от GMT у сервера не существует


сейчас не знаю (не занимался mql 3 последние года) , а раньше точно вот этот код был рабочий, я проверял

https://www.mql5.com/ru/forum/123222/page4#comment_3229236

PS: запустил у себя скрипт на Альпари, все правильно написал:

2018.05.15 22:23:16.412 geth_timeGMT EURUSD,M1: ServerGMT = 3

видимо можно определить GMT программно ;)

Еще раз про таймзоны, GMT, серверное и локальное время
Еще раз про таймзоны, GMT, серверное и локальное время
  • 2010.01.17
  • www.mql5.com
На форуме не раз обсуждались аналогичные темы и уже найдены многие ответы...
 
Igor Makanu:


сейчас не знаю (не занимался mql 3 последние года) , а раньше точно вот этот код был рабочий, я проверял

https://www.mql5.com/ru/forum/123222/page4#comment_3229236

PS: запустил у себя скрипт на Альпари, все правильно написал:

2018.05.15 22:23:16.412 geth_timeGMT EURUSD,M1: ServerGMT = 3

видимо можно определить GMT программно ;)

Метод, конечно, интересный, но очень ненадежный, т. к.:

  1. Используется предположение о том, что время наибольшей активности именно 12:30 GMT. На многих символах это не так. Например, на символе BTCUSD, получилось значение 7, хотя реальное смещение 3 (на EURUSD и GBPUSD отображается верно).
  2. Анализируются котировки в истории, смещение GMT которых может отличаться от текущего смещения времени брокера. Наиболее распространенный пример - неделя между переходами на зимнее/летнее время. У разных стран эта дата отличается друг от друга. Например, США переходят на зимнее время неделей позже, чем страны Европы. В итоге время наибольшей активности смещается на 1 час относительно времени большинства брокеров.

 
Ihor Herasko:

Метод, конечно, интересный, но очень ненадежный

со временем вообще все не надежно, было помню, что то время терминала брокеры меняли, то переход на зимнее время.....я уже давно перестал пытаться тестировать в тестере стратегий более чем за 2 года историю - смысла нет, только время тратить сидя у тестера стратегий

как вариант делать подготовленные котировки - тогда будет все корректно и можно даже без дыр и гэпов сделать, но опять же смысла нет - волатильность будет другая если далеко в истории тестировать

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

Причина обращения: