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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
SergeyN
352
SergeyN  

Добрый день,


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


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


Скрины с периодичностью в 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]);
                 
  }


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

Ihor Herasko
21816
Ihor Herasko  
SergeyN:

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

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

SergeyN
352
SergeyN  
Ihor Herasko:

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

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

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

SergeyN
352
SergeyN  
Ihor Herasko:

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


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

 


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

Файлы:
RingData.mq4 14 kb
Ihor Herasko
21816
Ihor Herasko  
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); 
SergeyN
352
SergeyN  
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
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий