Ошибка в терминале приводящая к ERR_HISTORY_NOT_FOUND

 

Что имеем:

Пользовательский индикатор. В отдельном окне. DRAW_HISTOGRAM.

В ходе своей работы запрашивает через стандартную функцию CopyRates(), котировки ДРУГОГО периода, НЕ того на котором он запущен.

Проблема:

При первом запуске на графике или особенно, при закрытие полностью терминала с включенным этим индикатором, и последующим запуске терминала, выдает ERR_HISTORY_NOT_FOUND абсолютно на весь период истории.

Стоит по переключать периоды графика, и он начинает показывать всегда. Все повторяется при закрытии и открытии терминала с этим индикатором снова. Билд терминала: 695

Код:

 

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "Trend"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

double         HistogramBuffer[];

int OnInit()
{   
   SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);   
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);  
   ArraySetAsSeries(HistogramBuffer, true);   
   ArrayInitialize(HistogramBuffer, 0.0);
   return(0);
}

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[])
{   
   ArraySetAsSeries(time,true);  
   
   for(int i=0;i<rates_total-prev_calculated;i++)
   {
      HistogramBuffer[i]=IndicatorData(PERIOD_D1,time[i],1);
   }  
   return(rates_total);
}

double IndicatorData(ENUM_TIMEFRAMES timeFrame, datetime from, int count) {  
   MqlRates rates_array[];
   ResetLastError();
   
   int finded_rates=CopyRates(Symbol(), timeFrame, from, count, rates_array);
   ArraySetAsSeries(rates_array,true);
      
   if(finded_rates<=0) {
      Print("Ошибка копирования ценовых данных ",GetLastError(), " от: ",from, " количесвтом: ",count);
   }  
   return rates_array[0].open;   
}
Файлы:
 

Rosh, а что мне там смотреть я наизусть там выучил уже почти все! Ясно что в каждый конкретный момент времени может быть и недоступна история, но даже если перед каждым вызовом CopyRates(), прописать CheckLoadHistory(), все равно при ПЕРВОМ запуске будет ERR_HISTORY_NOT_FOUND!

Если я чего-то недопонял, ок, тогда как дополнить код, чтобы индикатор рисовался всегда сразу после запуска терминала

 
lunix: Если я чего-то недопонял, ок, тогда как дополнить код, чтобы индикатор рисовался всегда сразу после запуска терминала?   
 Попробуйте вставить код, рекомендованный Рошем, в OnInit(). У меня индикаторы запускаются экспертом, а в эксперт вставлен аналогичный код. Всё рисуется сразу. Может, и с Вашим вариантом будет работать.
 

Yedelkin, попробовал, все также, добавил в OnInit следующее:

   datetime first_date=D'2002.01.01 00:00';
   int res=CheckLoadHistory(Symbol(),PERIOD_D1,first_date);
   switch(res)
     {
      case -1 : Print("Unknown symbol ",Symbol());             break;
      case -2 : Print("Requested bars more than max bars in chart "); break;
      case -3 : Print("Program was stopped ");                        break;
      case -4 : Print("Indicator shouldn't load its own data ");      break;
      case -5 : Print("Load failed ");                                break;
      case  0 : Print("Loaded OK ");                                  break;
      case  1 : Print("Loaded previously ");                          break;
      case  2 : Print("Loaded previously and built ");                break;
      default : Print("Unknown result ");
     }

 Не помогло! Могли бы вы проверить сами у себя этот исходник, вариант кода с CheckLoadHistory, в приложении!

Файлы:
 
lunix:

Yedelkin, попробовал, все также, добавил в OnInit следующее:

 Не помогло! Могли бы вы проверить сами у себя этот исходник, вариант кода с CheckLoadHistory, в приложении! 

  Попробуйте теперь поменять дневной период на одноминутный. У меня график появился

https://charts.mql5.com/1/13/gbpusd-m1-metaquotes-software-corp.png

Но с сообщением, что индикатор не может загрузить свои собственные данные. 

=====================================

Почему-то картинка не вставляется. А код <img src="https://charts.mql5.com/1/13/gbpusd-m1-metaquotes-software-corp.png" width="782" height="330" alt="GBPUSD, M1, MetaQuotes Software Corp., Contest" title="GBPUSD, M1, MetaQuotes Software Corp., Contest"> - удаляется из HTML-версии сообщения :/
 
Yedelkin:

 Попробуйте теперь поменять дневной период на одноминутный. У меня график появился

<img src="https://charts.mql5.com/1/13/gbpusd-m1-metaquotes-software-corp.png" width="782" height="330" alt="GBPUSD, M1, MetaQuotes Software Corp., Contest" title="GBPUSD, M1, MetaQuotes Software Corp., Contest"> 

Но с сообщением, что индикатор не может загрузить свои собственные данные. 

Да если поставить период M1, то работает, но это одно и тоже что текущий период графика! А если через  CopyRates() иной период запрашивать, то эта ошибка! Тут явно ошибкой терминала пахнет.
 
lunix:
Да если поставить период M1, то работает, но это одно и тоже что текущий период графика! А если через  CopyRates() иной период запрашивать, то эта ошибка! Тут явно ошибкой терминала пахнет.
 Люблю разбираться в чужом коде, но сейчас испытываю нехватку времени. Пишите в Сервис-деск с приложением кода и мыслей.
 
Yedelkin:
 Люблю разбираться в чужом коде, но сейчас испытываю нехватку времени. Пишите в Сервис-деск с приложением кода и мыслей.

:) Вы конечно юморист, спасибо конечно вам и за это участие, там кода 2 строки конечно..

Просто суть одна: при запросе данных иного периода, чем тот на котором работает индикатор, не работает с первой инициализации! 

 
Yedelkin:
 На просмотр Вашего кода и поиск проблемного места в "двух строках" я потратил минут 7. В итоге - картинка появилась. Объяснил, почему на дальнейшие вопросы ответить не смогу. У Вас это почему-то вызывает ассоциации с юмором. 
У меня ассоциации с юмором вызывает фраза " Люблю разбираться в чужом коде". Я ничего плохого не имел ввиду, это наоборот комплимент, если это реально так. Вас больше не смею задерживать, говорю лишь одно, что проблема не решена, так как речь именно идет о запросе данных ДРУГОГО периода через  CopyRates();
 

Понял, предыдущее своё сообщение удалил.

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