Помогите разобраться, где я накосячил в индикаторе

 

Добрый день,


Когда запускаю индикатор - он работает норм.


Но через некоторое время - начинает рисовать горбы на том месте, где их недавно не было.


Скрины с периодичностью в 2 минуты с одного и того же графика. Никак не могу понять - где я накосячил. Вот основной код индикатора:


  if (prev_calculated > 0) {
      startI = rates_total - prev_calculated;
  } else {
      startI = rates_total - 1;
  };


  for (int i = startI; i >=0; i--)
  {
 
     SummBuffer[i] = SummI(i, fprice1, fprice2, fprice3);
        
     BBMainBuffer[i] = 0;
     BBUpBuffer[i] = 0;
     BBDownBuffer[i] = 0;
     MaShort[i] = 0;
     MaLong[i] = 0;
       
     double BB[];
    
     ArrayResize(BB, Depth);
     if (i + Depth < rates_total) {
       for (int a = i; a < i + Depth; a++){
            BB[a - i] = SummI(a, fprice1, fprice2, fprice3);
       }
     }
        
     //if (i==0){
     // for (int bz = 0; bz < BandsPeriod; bz++)
     // { 
     //    Alert(BB[bz]);  
     // }
     // Alert(i);
     //};
 
      BBMainBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0);
      BBUpBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0);
      BBDownBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0);
        
      MaShort[i] = iMAOnArray(BB, MaShortPeriod, MaShortPeriod, 0, MODE_EMA, 0);
      MaLong[i] = iMAOnArray(BB, MaShortPeriod + MaLongPeriodDelta, MaShortPeriod + MaLongPeriodDelta, 0, MODE_EMA, 0);
        
      //Print(iTime(Symbol(), 0, i), " ", BBUpBuffer[i]);
                 
  }


просьба подсказать где я накосячил?..

 
SergeyN:

просьба подсказать где я накосячил?..

Без полного кода можно только предполагать. Так, если буфера индикатора - это BBMainBuffer, BBUpBuffer и BBDownBuffer, то при вызове iBandsOnArray всегда используется один и тот же индекс бара - 0. Зачем тогда цикл? Логичнее передать функции переменную цикла - i.

 
Ihor Herasko:

Без полного кода можно только предполагать. Так, если буфера индикатора - это BBMainBuffer, BBUpBuffer и BBDownBuffer, то при вызове iBandsOnArray всегда используется один и тот же индекс бара - 0. Зачем тогда цикл? Логичнее передать функции переменную цикла - i.

По поводу массива BB - знаю что лишний, т.к можно использовать основной буфер. Но у меня пока не получается заставить корректно работать функцию iBandsOnArray - не могу понять как shift работает. Поэтому перегоняю в небольшой массив и с 0-ым shiftom всегда возвращает корректные значения. Я грешу на rates_total - prev_calculated, т.к ощущение, что какой то бар пропускается просто. 
 
SergeyN:
По поводу массива BB - знаю что лишний, т.к можно использовать основной буфер. Но у меня пока не получается заставить корректно работать функцию iBandsOnArray - не могу понять как shift работает. Поэтому перегоняю в небольшой массив и с 0-ым shiftom всегда возвращает корректные значения. Я грешу на rates_total - prev_calculated, т.к ощущение, что какой то бар пропускается просто. 

Если хотите реальной помощи, то прикрепите полный код индикатора (файлом). Чтобы найти причину, недостаточно просто взгляда на индикатор. Нужно его запустить его и понять, что как и где рассчитывается. Кроме того, никто не будет дописывать более-менее очевидные вещи (объявление переменных и расстановку буферов), чтобы запустить у себя. Да и догадаться, что делает функция Summl вряд ли кто-то сможет. Поэтому нужен весь код.

 
Ihor Herasko:

Если хотите реальной помощи, то прикрепите полный код индикатора (файлом). Чтобы найти причину, недостаточно просто взгляда на индикатор. Нужно его запустить его и понять, что как и где рассчитывается. Кроме того, никто не будет дописывать более-менее очевидные вещи (объявление переменных и расстановку буферов), чтобы запустить у себя. Да и догадаться, что делает функция Summl вряд ли кто-то сможет. Поэтому нужен весь код.


Советник во вложении. Параметры:

 


Такую конструкцию советник нарисовал при открытии. Если нажать "ОК" в параметрах - то рисует то, что нужно.

Файлы:
RingData.mq4  14 kb
 
SergeyN:


Такую конструкцию советник нарисовал при открытии. Если нажать "ОК" в параметрах - то рисует то, что нужно.

Ага, понял, в чем дело. Нужно вот так сделать:

      BBMainBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0); 
      BBUpBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0); 
      BBDownBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0); 
 
Ihor Herasko:

Ага, понял, в чем дело. Нужно вот так сделать:

Да, спасибо большое! Похоже в этом дело. Все таки функции вида ХХХonArray для меня загадкой остаются. Работают без нареканий только если подать на вход массив размера точно такого, который нужен для вычислений. Хотя, судя по параметрам могут работать и на больших массивах с выбором диапазона для расчета значений.


В данном случае переписал так:

     ArrayResize(BB, BandsPeriod);
     ArrayResize(MaS, MaShortPeriod);
     ArrayResize(MaL, MaShortPeriod + MaLongPeriodDelta);

     if (i + Depth < rates_total) {
       for (int a = i; a < i + Depth; a++){
            int num = a - i;
            double val = SummI(a);
           
            if (num < BandsPeriod) BB[num] = val;
            if (num < MaShortPeriod) MaS[num] = val;
            if (num < MaShortPeriod + MaLongPeriodDelta) MaL[num] = val;
       }
     }
        
      BBMainBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0);
      BBUpBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0);
      BBDownBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0);
        
      MaShort[i] = iMAOnArray(MaS, 0, MaShortPeriod, 0, MODE_EMA, 0);
      MaLong[i] = iMAOnArray(MaL, 0, MaShortPeriod + MaLongPeriodDelta, 0, MODE_EMA, 0);


На истории "волшебство" прекратилось. У правого края графика иногда наблюдаются странные скачки на период 1-2 секунды. Выглядят так:


Обновленную версию прикрепил к сообщению, буду благодарен, если есть мысли откуда они появляются.

Файлы:
RingData.mq4  13 kb
Причина обращения: