Ошибка/проблема TimeCurrent() и iTime() - страница 2

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

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

Да, именно это я и имел в виду.
 
Это индикатор, почему вас волнует, что такое TimeCurrent. Сделайте свой цикл с подсчетом индикатора for и рисуйте на барах. Не смотрите на TimeCurrent, не смотрите на Bid.
 
Я строю на графике определенные времена, которые совпадают с GMT, поэтому это имеет большое значение при попытке получить смещение между временем сервера MT4 и GMT.
 

Paul_B:
I'm plotting certain times on a chart which match to GMT, so it matters a great deal when trying to get the offset between MT4 server time and GMT.

<g> Мне кажется, вы еще не освоились с культурой этого форума. Последовательность ответов модераторов и других пользователей форума с большим стажем всегда такова: "Вы делаете что-то не так", а затем "Зачем вам это нужно?", когда выясняется, что вы не делаете что-то не так.

На вашем месте я бы просто выходил из вызовов start(), если IsConnected() ложно. Или вы могли бы хранить счетчик тиков в статической переменной и игнорировать тик #1, но это неоправданно задержит запуск при нормальных обстоятельствах.

 
Спасибо за информацию cyclops993, в настоящее время у меня все работает, но то, что у меня есть, не кажется идеальным решением или особенно надежным. Я буду изучать IsConnected() немного дальше.
 
Paul_B: Я строю определенные времена на графике, которые совпадают с GMT, поэтому это имеет большое значение при попытке получить смещение между временем сервера MT4 и GMT.
Теперь мы понимаем, почему. (Почему вы не объяснились в ОП?) Точно так же, как мой код
      nextAutoUpdate = timeSrv + HR2400;
      if(Srvr_To_UTC_Auto) if(
         IsDllsAllowed()){                            // Complained @ init
         int      srvrToUTC         = LocalTimeToUTC() - TimeCurrent();
         double   nearestHalfHour   = MathRound(srvrToUTC / 1800.);
         Srvr_To_UTC_Hours          = nearestHalfHour / 2.; // Update external
      }

Я поддерживаю предложение RaptorUK, для индикатора Игнорировать первый тик и обновлять все бары на втором.

Это также не совсем неожиданно. Поскольку индикаторы не могут спать, если советник загружает индикатор в init через iCustom, вызов не может вернуть значение буфера, пока индикатор не выполнит init и start.

 
Paul_B:
Спасибо за информацию cyclops993, в настоящее время у меня это работает, но то, что у меня есть, не кажется идеальным решением или особенно надежным. Я буду исследовать IsConnected() немного дальше.

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

Если вы хотите повысить уверенность в том, что есть правильно установленное соединение и действительный TimeCurrent(), то вы также можете искать AccountNumber() != 0 и AccountBalance() > 0. Или вы можете просто ждать второго тика, ценой многосекундных задержек на символах с низкой ликвидностью.

 

Спасибо, ребята, я запрограммирую индикатор на ожидание второго тика.

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

 
cyclops993:

<g> Мне кажется, вы еще не освоились с культурой этого форума. Последовательность ответов модераторов и других пользователей форума с большим стажем всегда такова: "Вы делаете что-то не так", а затем "Зачем вам это нужно?", когда выясняется, что вы не делаете что-то не так.

На вашем месте я бы просто выходил из вызовов start(), если IsConnected() ложно. Или вы могли бы хранить счетчик тиков в статической переменной и игнорировать тик #1, но это неоправданно задержит запуск при нормальных обстоятельствах.

Если пользователь не предоставил тестовый код для демонстрации проблемы, трудно дать конкретную помощь, и часто лучшее предположение, которое можно сделать, это ошибка в коде. ...Возможно, вам стоит взять на себя ответственность и отвечать на все вопросы и просьбы о помощи. Это решило бы все ваши проблемы, и вам не пришлось бы нападать на тех, кто просто пытается помочь. . .
 
RaptorUK:
Если пользователь не предоставляет тестовый код для демонстрации проблемы [...].

В ОП не было ничего неправильного или отсутствующего. Было ясно, что Paul_B совершенно обоснованно предположил, исходя из документации MT4, что start() вызывается только в ответ на новые тики.(Почему он хотел проверить TimeCurrent(), не имеет значения, и вообще-то это не наше дело).

Ваш ответ был, по сути, хорошей версией RTFM, несмотря на то, что руководство явно не хватает в этой области [что, подчеркну, необычно; качество документации MT4 довольно хорошее]. В ответ Angevoyageur назвал это шумихой, что, похоже, является частью паттерна патологически чувствительных реакций на любую критику MT4, какой бы мягкой она ни была. Затем WHRoeder вклинился со словами "вы не хотите этого делать", после чего скопировал и вставил какой-то код, который явно не имел отношения к делу, потому что Paul_B явно уже знал, как рассчитать смещение GMT.

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