Как включить код индикатора в советник ? - страница 2

 
Andrei-1:

Есть код, но очень мудрёный (компилятор несколько раз выдавал предупреждение упростить код). Я пошагово после важных изменений рисую результат на экране для наглядности.

Последняя версия, 2 года не пользовался, тонкости не помню. 

 

Это гон.

Всё что нужно это в ините с буферами 

double BB[];

double MA_bb[], Ma_bb_plus[]; 

сделать  ArrayResize ArraySetAsSerises

+

пересчитывать количество баров не больше чем размер буферов.

Всё! 

 

Или ты из групы Мне чем посложнее? 

 

Пример действительно не тривиальный

я из группы "Чем проще тем лучше"

вот такой код вышел

double BB[];
double MA_bb[], Ma_bb_plus[];

int init(){  

ArraySetAsSeries( BB, true);
ArraySetAsSeries( MA_bb, true);
ArraySetAsSeries( Ma_bb_plus, true);

}

void start()
{
    calc_ind(60);
    if (BB[1] != 0)
       Print("Заработало");
    else
       Print("Что-то опять не так"); 
}

void calc_ind(int TF)
{

 int    BandsPeriod=24;
 double BandsDeviations=2.0;
 int ma_per = 10;
 int ma_per2 = 5;
 int Bands_ma_mode=MODE_EMA;
 int bars  = 300;
 int to_calc = 0;

   int limit;
   int i;
//----

      if (BB[1] != 0 ) to_calc = 2; else to_calc = bars; 

      for(i= to_calc; i >= 0; i--) // for(i=limit - 1; i>=0; i --) 
     {
         double bb_top = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); 
         double bb_low = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); 
         if (bb_top != 0)
         BB[i] = -(bb_low/bb_top - 1); 

         MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); 
         Ma_bb_plus[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); 

     }       



  }


Выдает

"Что-то опять не так"


Как здесь использовать ArrayResize?

 
при этом мне не надо считать все показатели индикатора, только 300 последних, нужно ли тут изменять размерность массива ?
 

явно обозначил размерность и "заработало" :

double BB[300];
double MA_bb[300], Ma_bb_plus[300];

int init(){  

ArraySetAsSeries( BB, true);
ArraySetAsSeries( MA_bb, true);
ArraySetAsSeries( Ma_bb_plus, true);

}

void start()
{
    calc_ind(60);
    if (BB[1] != 0)
       Print("Заработало");
    else
       Print("Что-то опять не так"); 
}

void calc_ind(int TF)
{

 int    BandsPeriod=24;
 double BandsDeviations=2.0;
 int ma_per = 10;
 int ma_per2 = 5;
 int Bands_ma_mode=MODE_EMA;
 int bars  = 300;
 int to_calc = 0;

   int limit;
   int i;
//----

      if (BB[1] != 0 ) to_calc = 2; else to_calc = bars; 

      for(i= to_calc; i >= 0; i--) // for(i=limit - 1; i>=0; i --) 
     {
         double bb_top = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); 
         double bb_low = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); 
         if (bb_top != 0)
         BB[i] = -(bb_low/bb_top - 1); 
         
          
         
         MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); 
         Ma_bb_plus[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); 
        
     }       

  }

Теперь не понятно что делать со скоростью, будет ли достаточная скорость при тестировании

 
Mr_Goods:

явно обозначил размерность и "заработало" :

Теперь не понятно что делать со скоростью, будет ли достаточная скорость при тестировании


Это типа ты сделал ресайз. Его в ините надо было делать ну или указать размер что одно и тоже.
 

И особенно обращай вниамине на

пересчитывать количество баров не больше чем размер буферов. 

 

у меня такое ощущение, что все работает, но не правельно, не знаю как проверить. Как бы еще его заставить рисовать  прям из советника ?

возможно еще надо было ставить здесь false

ArraySetAsSeries( BB, true);
 
После последнего поста, я пас разбиратся дальше.
 

в смысле ? я наверное какую то глупость написал (

вроде все норм, только визуализировать встроенный индикатор было-бы здодрово

все равно благодарен за подсказку

 
Рисуй палочками. Чтобы при сбоях не пропадали, сохраняй в шаблон. образец выше. Или в фаил, а индикатор пусть считывает из файла. При перезапуске пересчитать последний посчитаный.
Причина обращения: