ошибка iBarShift

 
Привет! в индикаторе использую функцию iBarShift(NULL,0,time[i]). При переключени по таймфрейма эта функция возвращает -1, причем хаотично! и если сделать проверку, то бар на указанное время в истории cуществует, но тем не менее функция возвращает ошибку, но повторюсь - хаотично! подскажите, как это исправить?
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
  • www.mql5.com
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Tango_X:
Привет! в индикаторе использую функцию iBarShift(NULL,0,time[i]). При переключени по таймфрейма эта функция возвращает -1, причем хаотично! и если сделать проверку, то бар на указанное время в истории cуществует, но тем не менее функция возвращает ошибку, но повторюсь - хаотично! подскажите, как это исправить?

Возможно, в момент переключения таймфрейма, этих исторических баров еще нет и они подкачиваются позднее.
Проверьте количество баров на переключаемом ТФ в функции OnInit().
А по хорошему нужен воспроизводимый код и пример результата с ошибкой.
Иначе играть в догадки никто не будет.

 
Alexander Sevastyanov #:

Возможно, в момент переключения таймфрейма, этих исторических баров еще нет и они подкачиваются позднее.
Проверьте количество баров на переключаемом ТФ в функции OnInit().
А по хорошему нужен воспроизводимый код и пример результата с ошибкой.
Иначе играть в догадки никто не будет.

Спасибо! вроде так и есть. Сделал проверку на количество бар в OnInit = вернуло 0

 

Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
   int bars=Bars(_Symbol,_Period);
   if(bars>0) {
      Print("---Количество баров в истории терминала по символу-периоду на данный момент = ",bars);
   } else { //нет доступных баров
      //--- видимо, данные по символу не синхронизированы с данными на сервере
      bool synchronized=false;
      //--- счетчик цикла
      int attempts=0;
      // сделаем 5 попыток дождаться синхронизации
      while(attempts<5) {
         if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED)) {
            //--- есть синхронизация, выходим
            synchronized=true;
            break;
         }
         //--- увеличим счетчик
         attempts++;
         //--- подождем 10 миллисекунд до следующей итерации
         Sleep(10);
      }
      //--- вышли из цикла по факту синхронизации
      if(synchronized) {
         Print("Количество баров в истории терминала по символу-периоду на данный момент = ",Bars(_Symbol,_Period));
         Print("Самая первая в истории терминала дата по символу-периоду на данный момент = ",
               (datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE));
         Print("Самая первая дата в истории по символу на сервере = ",
               (datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
      }
      //--- синхронизация данных так и не была достигнута
      else {
         Print("Не удалось получить количество баров на ",_Symbol);
         return(false);
      }
   }

//+------------------------------------------------------------------+

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
 
Tango_X #:

Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже

История не подгружается мгновенно по всем ТФ. Хотите актуальную историю по нескольким ТФ, нужно ее запрашивать раз в 60-90 секунд через Copy...() функции.

Да, и OnInit() не та функция для подгрузки истории. Она только для инициализации эксперта/индикатора. Делайте подгрузку в OnCalculate().

 
Tango_X #:

Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже

При ошибке получения данных, выходите из OnCalculate() с возвратом 0. Тогда на следующем тике опять будет полный перерасчёт индикатора как при первом запуске (если это не на выходных).

На выходных - при отсутствии тиков, их нужно эмулировать. Почитайте основные принципы здесь: https://www.mql5.com/ru/articles/13578

Готовим мультисимвольные мультипериодные индикаторы
Готовим мультисимвольные мультипериодные индикаторы
  • www.mql5.com
В статье рассмотрим принципы создания мультисимвольных мультипериодных индикаторов и получение от них данных в советниках и индикаторах. Рассмотрим основные нюансы использования мульти-индикаторов в советниках и индикаторах, и их отрисовку через буферы пользовательского индикатора.
 
спасибо всем! буду разбираться!