Сбой в работе функции iTime() - страница 2

 
FxPro7009 #:

Добавил RefreshRates() в начало OnInit(). Возвращает false.

Перенес из OnInit()  в OnStart(). Так работает.

Поставил снова в OnInit(), но не в начало, а в конец функции. Работает.

-----

RefreshRates() в первых строках OnInit() стабильно возвращает false. GetLastError()=0.

Вам ведь дали решение.

Если у вас скрипт, то можете добавить в начало что-нибудь подобное:

void OnStart()
  {
   if(!IsTFDataReady(PERIOD_Vivoda))
      Sleep(10000);
   // Код скрипта
  }

А еще лучше, можете добавить в функцию IsTFDataReady() вывод кода ошибки в алерт. Тогда вы обнаружите, что часто, запрашиваемые вами данные находятся в состоянии обновления. Ошибка 4066 вроде.

Погуглите эту ошибку, информации по ней полно, так как это обсуждалось много раз.

 
Vladislav Boyko #:

Вам ведь дали решение.

Если у вас скрипт, то можете добавить в начало что-нибудь подобное:

А еще лучше, можете добавить в функцию IsTFDataReady() вывод кода ошибки в алерт. Тогда вы обнаружите, что часто, запрашиваемые вами данные находятся в состоянии обновления. Ошибка 4066 вроде.

Погуглите эту ошибку, информации по ней полно, так как это обсуждалось много раз.

У меня iTime() запускается в цикле несколько раз (по числу баров между Началом и Финалом) , и все с одинаковой ошибкой. См. вложение файл https://c.mql5.com/3/391/2022.08.15.log.  Так, что толку в функции  IsTFDataReady() не вижу ни какого, запускать iTime() еще несколько раз, не имеет смысла.

GetLastError() запускают в случае ошибки, когда iTime возвращает ноль. Такого у меня не было никогда. Ошибки нет, значит  GetLastError всегда будет тоже ноль.

Вопрос принципиальный, функция работает не корректно. То работает, то нет. Кто нибудь наступит на эти грабли...

Решений может быть несколько, и я их знаю. 1) У меня две функции, одна для прошлого, другая для будущего времени. Если одна проходит с ошибкой по времени, значит запускаю вторую. 2)Можно изменить логику программы, например вычислять время "в ручную", делением на 15(минут) с отбросом остатка. Придем к кратному пятнадцати времени, которое и будет искомым. 3)Можно бросать скрипт на 15 минутный график. При желании можно обновить его, нажав правую кнопку мыши, и выбрать в меню. 4) Можно просто ничего не менять, а бросать его(скрипт) дважды. Второй раз всегда успешный.

RefreshRates() в первых строках OnInit() стабильно возвращает false. Это хорошо? Так и должно быть?

 

Думаю проблема в том, что скрипт работает с копией исторических данных, а не с самими данными. Скорость обновления данных зависит от трафика в интернете. Отсюда произрастает элемент случайности: то скрипт работает, то сбоит. Добавил в OnInit():

int OnInit()
{
Sleep(500);
RefreshRates();

...

Пауза для обновления данных. RefreshRates для обновления копии.

 
FxPro7009 #:

GetLastError() запускают в случае ошибки, когда iTime возвращает ноль. Такого у меня не было никогда. Ошибки нет, значит  GetLastError всегда будет тоже ноль.

Нет. iTime может вернуть какое-то время, которое не равно нулю. При этом в GetLastError() будет лежать ошибка.

FxPro7009 #:

3)Можно бросать скрипт на 15 минутный график.

Тогда iTime() (или Time[]) будет возвращать корректное значение. По тому, что открыто окно с графиком этого таймфрейма и котировки всегда актуальны.

FxPro7009 #:

RefreshRates() в первых строках OnInit() стабильно возвращает false. Это хорошо? Так и должно быть?

Так и должно быть. RefreshRates() возвращает false по той причине, что данные соответствуют текущему состоянию клиентского терминала. true она вернет только если за время текущего исполнения программы (OnStart, OnTick, ...) пришел новый тик. Собственно и значение, которое возвращает RefrashRates() проверяют, только в том редком случае, если нужно узнать, приходил новый тик или нет. В подавляющем большинстве случаев возвращаемое RafrashRates() значение никто не проверяет.
Да и вызов RefreshRates() не поможет вам обновить котировки неиспользуемого таймфрейма.

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