Ошибка копирования буферов индикатора - номер ошибки:4806

 

Делаю индикатор, для вызова его на младших таймфреймах со старших. Номер ошибки в названии топика(на текущем таймфрейме ошибка не возникает). Как исправить?

Взял код из примера "iAC" там тоже самое выходит.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Label1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID

double p[];
int ac;
input ENUM_TIMEFRAMES time_=PERIOD_CURRENT;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {  
   ac=iAC(NULL,time_);
   Sleep(1000);
   if(ac<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(-1);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,p,INDICATOR_DATA);
   ArraySetAsSeries(p,true);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,4); 
//---
   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[])
  {
  ArraySetAsSeries(time,true);
//---
   int i,limit,BARS;

   if(prev_calculated==0)limit=rates_total-35;
   else
      limit=rates_total-prev_calculated;


   for(i=limit;i>=0;i--)
     {
     BARS=Bars(_Symbol,time_,time[i],TimeCurrent())-1;

      if(CopyBuffer(ac,0,BARS,1,p)<0)
        {
         Alert("Ошибка копирования буферов индикатора AC - номер ошибки:",GetLastError());return(0);
        }

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

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены


Где принтует-то, в Init или ниже?

Добавлено: вот тут


Ниже, при копировании буфферов. Хендл нормально запрашивается. Это мкл 5.

У меня таймсерии массивы p, time.

BARS=Bars(_Symbol,time_,time[i],TimeCurrent())-1;

возвращает количество баров, то есть индекс бара, как в мкл4.

Почитал кто сталкивался с этим, попробовал Sleep  и ничего. Из за какой-то ерунды пол дня барахтаюсь.

 
forexman77:

Делаю индикатор, для вызова его на младших таймфреймах со старших. Номер ошибки в названии топика(на текущем таймфрейме ошибка не возникает). Как исправить?

Взял код из примера "iAC" там тоже самое выходит.

У вас в limit количество баров текущего тайма, предположим 1000. На старшем тайме история всего на 900 баров, но цикл хочет взять 1000, которых на старшем тайме нет.

Проверяйте доступное количество баров на получаемом тайме, и после этого крутите цикл.

 
Vitaly Muzichenko:

У вас в limit количество баров текущего тайма, предположим 1000. На старшем тайме история всего на 900 баров, но цикл хочет взять 1000, которых на старшем тайме нет.

Проверяйте доступное количество баров на получаемом тайме, и после этого крутите цикл.


Переменная "BARS" запрашивает количество баров со старшего таймфрема и с этого количества копирует данные.

 

Вообщем проехали. Кто видел хороший пример, как сделать индикатор на мкл5 показывающий значения со старшего таймфрема, где не так много строк кода?

Я так понял там нужно проверки всякие проводить и прочее, но что-то у меня не получается пока, да и время на эту ерунду нет желания тратить.

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

Честно говоря, кто эти примеры подбирал, нужно семь-пять строк для примера, а начинают на все 300 строк городить много ненужной информации.

 
forexman77:

Делаю индикатор, для вызова его на младших таймфреймах со старших. Номер ошибки в названии топика(на текущем таймфрейме ошибка не возникает). Как исправить?

Взял код из примера "iAC" там тоже самое выходит.

time []- время баров с текущего ТФ. А значит,  BARS может быть нулевым. И вы ещё отнимаете у него 1. Понятно что на некоторых итерациях будет ошибка
 
Galina Bobro:
time []- время баров с текущего ТФ. А значит,  BARS может быть нулевым. И вы ещё отнимаете у него 1. Понятно что на некоторых итерациях будет ошибка

Ну, да логично, поправил. Убрал -1. Данные отрисовываются, после обновления окна, только все данные попадают не на те индексы.

То есть на текущем таймфрейме та же картина, что и на большом.

Тут не все так просто, как в мкл4. Там баршифтом можно найти индекс и взять оттуда со старшего таймфрейма.

Нашел описание проблемы https://www.mql5.com/ru/forum/190003#comment_4877625

Не получается брать данные индикатора со старшего ТФ
Не получается брать данные индикатора со старшего ТФ
  • 2017.04.14
  • www.mql5.com
Уже четвёртый день в индикаторе пытаюсь получить данные стандартного индикатора АО со старшего таймфрейма, и всё никак...
 

Если кому нужно, сделал. Только обновлять окно необходимо вручную.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Label1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID

double p[];
double P[];
int ac;
input ENUM_TIMEFRAMES time_=PERIOD_CURRENT;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {  
   ac=iAC(NULL,time_);
   Sleep(1000);
   if(ac<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(-1);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,P,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,4); 
   SetIndexBuffer(1,p,INDICATOR_CALCULATIONS);
 
//---
   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[])
  {
//---

   int i,limit;

   if(prev_calculated==0)limit=500;
   else
      limit=prev_calculated-1;


   for(i=limit;i<rates_total;i++)
     {
      if(CopyBuffer(ac,0,time[i],1,p)<0)
        {
         Alert("Ошибка копирования буферов индикатора AC - номер ошибки:",GetLastError());return(0);
        }
        P[i]=p[0];

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

Если кому нужно, сделал. Только обновлять окно необходимо вручную.

Огромное спасибо за код, я думал чекнусь. Делал стохастики на младших тайм-фреймах. Подскажите пожалуйста, а что означает это :

 P[i]=p[0];

Я никак не могу понять, по сути мы 0 его.

 
Sergei Melnikov #:

Огромное спасибо за код, я думал чекнусь. Делал стохастики на младших тайм-фреймах. Подскажите пожалуйста, а что означает это :

Я никак не могу понять, по сути мы 0 его.

присвоение i-му элементу массива 

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