Ошибка/проблема TimeCurrent() и iTime()

 

Привет, ребята,

Только что столкнулся с интересной проблемой/багом и не уверен, что она уже была выявлена ранее или даже если она специфична для брокера.

Попробуйте использовать следующее в коде индикатора, запустите индикатор при запуске и обратите внимание на значения, когда вы впервые запустите MT4 (убедитесь, что MT4 не работал по крайней мере 10 минут до перезапуска).

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

Вы заметите, что возвращаемое время на самом деле является временем, когда MT4 был запущен в последний раз.

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

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

С уважением,

PaulB

 
Paul_B:

Привет, ребята,

Только что столкнулся с интересной проблемой/багом и не уверен, что она уже была выявлена ранее или даже если это специфично для брокера.

Попробуйте использовать следующее в коде индикатора, запустите индикатор при запуске и обратите внимание на значения, когда вы впервые запустите MT4 (убедитесь, что MT4 не работал по крайней мере 10 минут до перезапуска).

Вы заметите, что возвращаемое время на самом деле является временем, когда MT4 был запущен в последний раз.

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

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

С уважением,

PaulB


Это ??
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

Привет, deVries,

Вы можете использовать и TIME_SECONDS, это не имеет значения, если код находится в init{} или в начале start{}.

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

 
Paul_B:

Привет, ребята,

Только что столкнулся с интересной проблемой/багом и не уверен, что она уже была выявлена ранее или даже если это специфично для брокера.

Попробуйте использовать следующее в коде индикатора, запустите индикатор при запуске и обратите внимание на значения, когда вы впервые запустите MT4 (убедитесь, что MT4 не работал по крайней мере 10 минут до перезапуска).

Вы заметите, что возвращаемое время на самом деле является временем, когда MT4 был запущен в последний раз.

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

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

С уважением,

PaulB

Разве документация не ясна на 100% по этому вопросу? "Возвращает последнее известное время сервера (время поступления последней котировки) как количество секунд, прошедших с 00:00 1 января 1970 года." если последний тик был 10 минут назад, то TimeCurrent() вернет время, основанное на этом времени....
 
RaptorUK:
Разве документация не ясна на 100% по этому вопросу?

Нет, не совсем так.

Существует важное различие между советниками и индикаторами, которое не описано в документации: Советники получают вызов start() только при наличии соединения с брокером и нового тика, в то время как индикаторы всегда получают начальный вызов start() до или без установления соединения с брокером. Поэтому TimeCurrent() может иметь разное значение в советниках и индикаторах.

Если вам нужно определенно обновленное значение для TimeCurrent() в индикаторе, то вы можете использовать IsConnected(), чтобы проверить, может ли TimeCurrent() ссылаться на последнее известное время в предыдущей сессии.

 

В качестве дополнительного момента, я даже пробовал

https://docs.mql4.com/windows/RefreshRates

перед вызовом TimeCurrent(), и это ничего не изменило. Это, конечно, нужно иметь в виду.

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

 
cyclops993:

Нет, не совсем так.

Существует важное различие между советниками и индикаторами, которое не описано в документации: Советники получают вызов start() только при наличии соединения с брокером и нового тика, в то время как индикаторы всегда получают начальный вызов start() до или без установления соединения с брокером. Поэтому TimeCurrent() может иметь разное значение в советниках и индикаторах.

Не думаю, что это имеет значение, учитывая, что говорится в документации... если вы проверяете TimeCurrent() до появления нового тика, вы получаете время последнего тика. Разве не об этом говорится в документации?
 
RaptorUK:
Я не думаю, что это имеет значение, учитывая, что говорится в документации... если вы проверяете TimeCurrent() до появления нового тика, вы получаете время последнего тика. Разве не об этом говорится в документации?

Это все еще вводит в заблуждение, но если вы хотите быть педантичным, то можете сказать, что проблема не в определении TimeCurrent(), а в определении на https://docs.mql4.com/runtime/start. Там сказано: "При поступлении новых котировок будет выполняться функция start() подключенных экспертов и пользовательских индикаторов". Здесь явно подразумевается, что start() вызывается только в связи с новыми тиками, как в случае с экспертами, и что, следовательно, TimeCurrent() не может возвращать время последнего тика в предыдущей сессии использования программного обеспечения MT4.

[Опять же, один из ответов на все это - игнорировать вызовы start() в индикаторе, если IsConnected() возвращает false].

 
cyclops993:

Это все еще вводит в заблуждение, но если вы хотите быть педантичным [...].

Будучи еще более педантичным, если у вас совершенно новая установка MT4, и вы скопируете в нее файл графика с прикрепленным индикатором перед первым запуском MT4, то, предположительно, индикатор получит вызов start() с сообщением TimeCurrent() как 1/1/1970. Поэтому в документации к TimeCurrent() должно быть написано "...последнее известное время сервера, или 1/1/1970, если не было соединения с сервером".

 
cyclops993:

Будучи еще более педантичным, если у вас совершенно новая установка MT4, и вы скопируете в нее файл графика с прикрепленным индикатором перед первым запуском MT4, то, предположительно, индикатор получит вызов start() с сообщением TimeCurrent() как 1/1/1970. Поэтому в документации к TimeCurrent() должно быть написано "...последнее известное время сервера, или 1/1/1970, если не было соединения с сервером".

Не нужно суетиться. Просто подождите первый/следующий тик, TimeCurrent() обновится, и все в порядке. Индикатор только на исторических ценах бесполезен.
 
angevoyageur:
Не нужно суетиться. Просто дождитесь первого/следующего тика, TimeCurrent() обновится, и все в порядке. Индикатор только на исторических ценах бесполезен.
Я думаю, проблема в том, что первый вызов start() для индикатора может не быть результатом нового тика ... в этом случае TimeCurrent() будет сообщать неверное время. Я не проверял это...

В этом случае я бы просто проигнорировал первый тик ... и продолжил бы нормально со второго тика и далее.
Причина обращения: