Особенности языка mql5, тонкости и приёмы работы - страница 74

 
Vitaly Muzichenko:

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

Определить факт выходного дня можно по локальному времени.

А вот вычисление GMTOffset сервера нужно делать только в OnTick. До тех пор, пока тик не пришел, не используем в расчетах время сервера. В большинстве случаев этого действительно не требуется.

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

 
GMTOffset на форекс-символах можно определить по времени закрытия/открытия торговой недели. Ведь локальное время этого события известно.
 
Ihor Herasko:

Определить факт выходного дня можно по локальному времени.

А вот вычисление GMTOffset сервера нужно делать только в OnTick. До тех пор, пока тик не пришел, не используем в расчетах время сервера. В большинстве случаев этого действительно не требуется.

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

fxsaber:
GMTOffset на форекс-символах можно определить по времени закрытия/открытия торговой недели. Ведь локальное время этого события известно.

У нас в субботу и воскресенье не известно время сервера, нам только известно время поступления последней котировки. В каком часовом поясе работает сервер - также не известно.

Очень не хватает функции, которая будет показывать текущее время сервера, что-то наподобие: TimeServer(); тогда всегда можно знать, что время сервера больше, чем время последней котировки, значит или выходной, или завис. GMTOffset нас не спасает.

P.S. Вопрос касается не только форекс-символов.
 
Vitaly Muzichenko:

У нас в субботу и воскресенье не известно время сервера, нам только известно время поступления последней котировки. В каком часовом поясе работает сервер - также не известно.

Для форекса решается, как сказал выше.

 
Vitaly Muzichenko:

У нас в субботу и воскресенье не известно время сервера

За то известно локальное время.

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

Очень не хватает функции, которая будет показывать текущее время сервера, что-то наподобие: TimeServer(); тогда всегда можно знать, что время сервера больше, чем время последней котировки, значит или выходной, или завис. GMTOffset нас не спасает.

Зная локальное время, даже гадать не нужно. По нему определяем, выходной сейчас или нет. А знание GMTOffset сервера как раз дает возможность рассчитать время сервера. Я не спорю, что функция TimeServer() была бы удобна. Тем не менее, даже без нее сейчас можно выкрутиться.

 
Ihor Herasko:

За то известно локальное время.

Зная локальное время, даже гадать не нужно. По нему определяем, выходной сейчас или нет. А знание GMTOffset сервера как раз дает возможность рассчитать время сервера. Я не спорю, что функция TimeServer() была бы удобна. Тем не менее, даже без нее сейчас можно выкрутиться.

Это-же не время сервера

Документация по MQL5: Дата и время / TimeGMTOffset
Документация по MQL5: Дата и время / TimeGMTOffset
  • www.mql5.com
Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.
 
Vitaly Muzichenko:

Это-же не время сервера

Я говорю про TimeLocal(). Естественно, нам потребуется и TimeGMTOffset. Если при этом идут тики, то мы без проблем вычисляем ServerGMTOffset. Если советник получил хотя бы один реальный тик, то далее ему не страшны выходные, т. к. по TimeLocal() он может вычислить текущее время сервера.

Проблема возникает тогда, когда советник начал работу без прихода тика. В этом случае нужно определить, не выходной ли сейчас. Если выходной, то все расчеты, связанные с реальным временем сервера придется отложить до окончания выходных. Если так уж необходимо совершить вычисления в выходные, то просим пользователя указать ServerGMTOffset. Получив эти данные и используя TimeLocal() и TimeGMTOffset(), получаем текущее время сервера.

 
Ihor Herasko:

Я говорю про TimeLocal(). Естественно, нам потребуется и TimeGMTOffset. Если при этом идут тики, то мы без проблем вычисляем ServerGMTOffset. Если советник получил хотя бы один реальный тик, то далее ему не страшны выходные, т. к. по TimeLocal() он может вычислить текущее время сервера.

Проблема возникает тогда, когда советник начал работу без прихода тика. В этом случае нужно определить, не выходной ли сейчас. Если выходной, то все расчеты, связанные с реальным временем сервера придется отложить до окончания выходных. Если так уж необходимо совершить вычисления в выходные, то просим пользователя указать ServerGMTOffset. Получив эти данные и используя TimeLocal() и TimeGMTOffset(), получаем текущее время сервера.

Именно. Вешаем советник на график во время "нет тиков". Это может быть что угодно, и даже выходной.

Через 15 минут после закрытия сессии/рынка, время последнего тика имеем 15 минут назад(советник этого не знает, впрочем и мы тоже), но по какому времени работает сервер? Это действительно 15 минут назад, или может 1ч.15м, или 3ч.15м. назад?

 
Vitaly Muzichenko:

Именно. Вешаем советник на график во время "нет тиков". Это может быть что угодно, и даже выходной.

Через 15 минут после закрытия сессии/рынка, время последнего тика имеем 15 минут назад(советник этого не знает, впрочем и мы тоже), но по какому времени работает сервер? Это действительно 15 минут назад, или может 1ч.15м, или 3ч.15м. назад?

Виталий, время часовых поясов отличаются друг от друга не меньше чем на 1 час. Точнее сказать, кратно 1 часу. Соответственно если отличие больше чем на час, то значит что-то произошло.

Более конкретно можно в OnInit получить разницу локального и серверного времени, затем сравнивать это с текущей разницей. В общем варианты на любителя.

 
Alexey Viktorov:

Виталий, время часовых поясов отличаются друг от друга не меньше чем на 1 час. Точнее сказать, кратно 1 часу. Соответственно если отличие больше чем на час, то значит что-то произошло.

Более конкретно можно в OnInit получить разницу локального и серверного времени, затем сравнивать это с текущей разницей. В общем варианты на любителя.

Вешаю в субботу советник на график, но советник может получить время последнего тика, это к примеру в Обзоре рынка 23:58, и моё локальное 04:45. Время сервера Я не знаю.

Вопрос: сколько прошло времени от последнего тика по времени сервера(терминала)

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