Правильно ли работает TimeTradeServer()?

 

Согласно документации:

TimeTradeServer

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

У меня в индикаторе получается, что при инициализации значение TimeTradeServer() на три часа меньше значения  TimeCurrent().

А при следующем вызове таймера получает правильное значение.


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Встречайте учебник «Программирование на MQL5 для трейдеров»

fxsaber, 2024.04.05 09:23

Случайно через поиск на сайте узнал важные подробности про TimeTraderServer.


Обнаружил, что из ME по CTRL+F1 на названии функции можно сразу попасть на эту справку.


Спасибо за Учебник и интеграцию!

 
fxsaber #:

Спасибо, я не заметил что есть учебник.

Однако в нем не отмечена проблема первого запуска у TimeTradeServer();

А она ЕСТЬ!

Я хотел использовать эту функцию для решения проблемы остановки времени на выходных у TimeCurrent().

Все работает, кроме первого запуска.


 
Aleksander Gladkov #:

Однако в нем не отмечена проблема первого запуска у TimeTradeServer();

Посмотрите обсуждение.

Bug report: Wrong TimeTradeServer() in indicators.
Bug report: Wrong TimeTradeServer() in indicators.
  • 2024.04.05
  • amrali
  • www.mql5.com
Forum on trading, automated trading systems and testing trading strategies Possible bug in TimeTradeServer amrali , 2024.04...
 
fxsaber #:

Посмотрите обсуждение.

Обсуждение лишь фиксирует наличие проблемы, но не предлагает решения.

В качестве заплатки лучшее это "Get both, TimeCurrent and TimeTradeServer, return TimeCurrent if it's greater than TimeTradeServer, else return TimeTradeServer. "

 
Aleksander Gladkov #:

Обсуждение лишь фиксирует наличие проблемы, но не предлагает решения.

В качестве заплатки лучшее это "Get both, TimeCurrent and TimeTradeServer, return TimeCurrent if it's greater than TimeTradeServer, else return TimeTradeServer. "

Лучше проверять TerminalInfoInteger(TERMINAL_CONNECTED), как уже было предложено в английской ветке. Было бы странно запрашивать время сервера, не имея коннекта к нему.

 

Получился такой код:

datetime TimeServer()
{  datetime tts=0;
   datetime tc=TimeCurrent();
   if (TerminalInfoInteger(TERMINAL_CONNECTED)) tts = TimeTradeServer();
   if (tc>tts) return(tc);
   else return(tts);
 }

Жаль только в самом терминале дата сервера при первом запуске не правильная
 
Stanislav Korotky #:

Лучше проверять TerminalInfoInteger(TERMINAL_CONNECTED), как уже было предложено в английской ветке. Было бы странно запрашивать время сервера, не имея коннекта к нему.

А почему обязательно коннектиться к серваку, если время сервера формируется из локального времени?

 
Alexey Viktorov #:

А почему обязательно коннектиться к серваку, если время сервера формируется из локального времени?

Нужна зацепка для расчета - получить хотя бы часовой пояс сервера. Иначе получится наугад.

 
Ihor Herasko #:

Нужна зацепка для расчета - получить хотя бы часовой пояс сервера. Иначе получится наугад.

А, ну да, об этом я и не подумал.

 

Сейчас при старте терминала имеем равенство TimeTradeServer() ==TimeGMT()


Это никуда не годится!

Предлагаю простое решение:

Если терминал запущен первый раз, то ищется значение разницы TimeCurrent()-TimeLocal(), если есть доступ к серверу, вписывается в настройку TimeTradeServer();

Терминал при его закрытии запоминает в своих текущих настройках значение разницы TimeCurrent()-TimeLocal(), если есть доступ к серверу;

При следующем запуске использует при открытии эту разницу для установки времени TimeTradeServer() и проверяется не изменилась ли разница;

Тогда только самый первый запуск терминала будет иметь не правильное значение TimeTradeServer().

Все последующие уже будут в порядке.