Подскажите как исправить индюка?

 

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

Подскажите плиз что не так

//+------------------------------------------------------------------+
//|                                                  BarPriority.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "FiftyStars"
#property link      "vk.com/FiftyStars"

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 LightSkyBlue
#property indicator_color2 LightSkyBlue
#property indicator_color3 LightSkyBlue
#property indicator_color4 LightSkyBlue
#property indicator_color5 Salmon
#property indicator_color6 Salmon
#property indicator_color7 Salmon
#property indicator_color8 Salmon
#property indicator_level1 0
#property indicator_levelcolor Black

#property indicator_width1 4
#property indicator_width2 3
#property indicator_width3 2
#property indicator_width4 1
#property indicator_width5 4
#property indicator_width6 3
#property indicator_width7 2
#property indicator_width8 1

#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID

#property indicator_style5 STYLE_SOLID
#property indicator_style6 STYLE_SOLID
#property indicator_style7 STYLE_SOLID
#property indicator_style8 STYLE_SOLID
//--- input parameters


extern int       MA1=24;
extern int       MA2=50;
extern int       MA3=100;
extern int       MA4=200;
extern int       MAMA=50;
//--- buffers
double Bulls[];
double Bears[];

double BullsMA1[];
double BearsMA1[];
double BullsMA2[];
double BearsMA2[];
double BullsMA3[];
double BearsMA3[];
double BullsMA4[];
double BearsMA4[];

double BullsMAMA1[];
double BearsMAMA1[];
double BullsMAMA2[];
double BearsMAMA2[];
double BullsMAMA3[];
double BearsMAMA3[];
double BullsMAMA4[];
double BearsMAMA4[];

double MADif1[];
double MADif2[];
double MADif3[];
double MADif4[];

double MAMADif1[];
double MAMADif2[];
double MAMADif3[];
double MAMADif4[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   ArraySetAsSeries(Bulls,true);
   ArraySetAsSeries(Bears,true);

   ArraySetAsSeries(BullsMA1,true);
   ArraySetAsSeries(BearsMA1,true);
   ArraySetAsSeries(BullsMA2,true);
   ArraySetAsSeries(BearsMA2,true);
   ArraySetAsSeries(BullsMA3,true);
   ArraySetAsSeries(BearsMA3,true);
   ArraySetAsSeries(BullsMA4,true);
   ArraySetAsSeries(BearsMA4,true);
   
   ArraySetAsSeries(BullsMAMA1,true);
   ArraySetAsSeries(BearsMAMA1,true);
   ArraySetAsSeries(BullsMAMA2,true);
   ArraySetAsSeries(BearsMAMA2,true);
   ArraySetAsSeries(BullsMAMA3,true);
   ArraySetAsSeries(BearsMAMA3,true);
   ArraySetAsSeries(BullsMAMA4,true);
   ArraySetAsSeries(BearsMAMA4,true);
   
   SetIndexDrawBegin(0,MA1);
   SetIndexDrawBegin(1,MA2);
   SetIndexDrawBegin(2,MA3);
   SetIndexDrawBegin(3,MA4);
   SetIndexDrawBegin(4,MAMA);
   SetIndexDrawBegin(5,MAMA);
   SetIndexDrawBegin(6,MAMA);
   SetIndexDrawBegin(7,MAMA);
   
   
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexStyle(7,DRAW_LINE);
   
   SetIndexBuffer(0,MADif1);
   SetIndexBuffer(1,MADif2);
   SetIndexBuffer(2,MADif3);
   SetIndexBuffer(3,MADif4);
   SetIndexBuffer(4,MAMADif1);
   SetIndexBuffer(5,MAMADif2);
   SetIndexBuffer(6,MAMADif3);
   SetIndexBuffer(7,MAMADif4);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   ArrayResize(Bulls,ArraySize(MADif1));
   ArrayResize(Bears,ArraySize(MADif1));
   
   ArrayResize(BullsMA1,ArraySize(MADif1));
   ArrayResize(BearsMA1,ArraySize(MADif1));
   ArrayResize(BullsMA2,ArraySize(MADif1));
   ArrayResize(BearsMA2,ArraySize(MADif1));
   ArrayResize(BullsMA3,ArraySize(MADif1));
   ArrayResize(BearsMA3,ArraySize(MADif1));
   ArrayResize(BullsMA4,ArraySize(MADif1));
   ArrayResize(BearsMA4,ArraySize(MADif1));
   
   ArrayResize(BullsMAMA1,ArraySize(MADif1));
   ArrayResize(BearsMAMA1,ArraySize(MADif1));
   ArrayResize(BullsMAMA2,ArraySize(MADif1));
   ArrayResize(BearsMAMA2,ArraySize(MADif1));
   ArrayResize(BullsMAMA3,ArraySize(MADif1));
   ArrayResize(BearsMAMA3,ArraySize(MADif1));
   ArrayResize(BullsMAMA4,ArraySize(MADif1));
   ArrayResize(BearsMAMA4,ArraySize(MADif1));
   
     int counted_bars=IndicatorCounted();
  //---- check for possible errors
     if(counted_bars<0) return(-1);
  //---- the last counted bar will be recounted
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
   
  //---- main loop
     for(int i=0; i<limit; i++)
       {
          Bulls[i]=(iHigh(Symbol(),Period(),i)-iOpen(Symbol(),Period(),i));
          Bears[i]=(iOpen(Symbol(),Period(),i)-iLow(Symbol(),Period(),i))*(-1);
       }
       
     for(i=0; i<limit; i++)
     {
     BullsMA1[i]=iMAOnArray(Bulls,Bars,MA1,0,MODE_LWMA,i);
     BullsMA1[i]*=BullsMA1[i]*10000;
     BearsMA1[i]=iMAOnArray(Bears,Bars,MA1,0,MODE_LWMA,i);
     BearsMA1[i]*=BearsMA1[i]*10000*(1);
     
     BullsMA2[i]=iMAOnArray(Bulls,Bars,MA2,1,MODE_LWMA,i);
     BullsMA2[i]*=BullsMA2[i]*10000;
     BearsMA2[i]=iMAOnArray(Bears,Bars,MA2,1,MODE_LWMA,i);
     BearsMA2[i]*=BearsMA2[i]*10000*(1);
     
     BullsMA3[i]=iMAOnArray(Bulls,Bars,MA3,2,MODE_LWMA,i);
     BullsMA3[i]*=BullsMA3[i]*10000;
     BearsMA3[i]=iMAOnArray(Bears,Bars,MA3,2,MODE_LWMA,i);
     BearsMA3[i]*=BearsMA3[i]*10000*(1);
     
     BullsMA4[i]=iMAOnArray(Bulls,Bars,MA4,4,MODE_LWMA,i);
     BullsMA4[i]*=BullsMA4[i]*10000;
     BearsMA4[i]=iMAOnArray(Bears,Bars,MA4,4,MODE_LWMA,i);
     BearsMA4[i]*=BearsMA4[i]*10000*(1);
     }
  //---- done
     for(i=0; i<limit; i++)
     {
     BullsMAMA1[i]=iMAOnArray(BullsMA1,Bars,MAMA,0,MODE_SMA,i);
     BearsMAMA1[i]=iMAOnArray(BearsMA1,Bars,MAMA,0,MODE_SMA,i);
     
     BullsMAMA2[i]=iMAOnArray(BullsMA2,Bars,MAMA,0,MODE_SMA,i);
     BearsMAMA2[i]=iMAOnArray(BearsMA2,Bars,MAMA,0,MODE_SMA,i);
     
     BullsMAMA3[i]=iMAOnArray(BullsMA3,Bars,MAMA,0,MODE_SMA,i);
     BearsMAMA3[i]=iMAOnArray(BearsMA3,Bars,MAMA,0,MODE_SMA,i);
     
     BullsMAMA4[i]=iMAOnArray(BullsMA4,Bars,MAMA,0,MODE_SMA,i);
     BearsMAMA4[i]=iMAOnArray(BearsMA4,Bars,MAMA,0,MODE_SMA,i);
     }
     for(i=0; i<limit; i++)
     {
     MADif1[i]=(MathAbs(BullsMA1[i])-MathAbs(BearsMA1[i]))/3;
     MADif2[i]=(MathAbs(BullsMA2[i])-MathAbs(BearsMA2[i]))/3;
     MADif3[i]=(MathAbs(BullsMA3[i])-MathAbs(BearsMA3[i]))/3;
     MADif4[i]=(MathAbs(BullsMA4[i])-MathAbs(BearsMA4[i]))/3;
     }
     for(i=0; i<limit; i++)
     {
     MAMADif1[i]=(BullsMAMA1[i]-BearsMAMA1[i]);
     MAMADif2[i]=(BullsMAMA2[i]-BearsMAMA2[i]);
     MAMADif3[i]=(BullsMAMA3[i]-BearsMAMA3[i]);
     MAMADif4[i]=(BullsMAMA4[i]-BearsMAMA4[i]);
     }
      
//----
   return(0);
  }
//+------------------------------------------------------------------+
Файлы:
 
вобщем фишка походу с ресайзом, но в чем там именно проблема все еще понять не могу...
 
FiftyStars:
вобщем фишка походу с ресайзом, но в чем там именно проблема все еще понять не могу...

Начните с того, что Вы не проверяете код возврата функции ArrayResize()
 
ArraySize(MADif1) можно вычислить однократно и присвоить переменной, а потом ресайзить остальное. Зачем 16 раз обращаться к этой функции, если достаточно одного?
 
PapaYozh:

Начните с того, что Вы не проверяете код возврата функции ArrayResize()


ну, ресайз он делает и размер буфера и массива становятся одинаковыми. что там может пойти не так?

я хз может и не в ресайзе дело - попробуйте посмотрите файл я выложил

 
Mathemat:
ArraySize(MADif1) можно вычислить однократно и присвоить переменной, а потом ресайзить остальное. Зачем 16 раз обращаться к этой функции, если достаточно одного?

это уже будет на этапе оптимизации кода, сейчас пока что алгоритмы разные пробую
 
FiftyStars:


ну, ресайз он делает и размер буфера и массива становятся одинаковыми. что там может пойти не так?

я хз может и не в ресайзе дело - попробуйте посмотрите файл я выложил


Если Вы "всё знаете", то зачем спрашиваете?

PS. У Вас может банально памяти не хватать, ресайз ничего перераспределять не будет (код возврата = -1), и будет выход за пределы выделенной под массивы памяти.

 
PapaYozh:


Если Вы "всё знаете", то зачем спрашиваете?

PS. У Вас может банально памяти не хватать, ресайз ничего перераспределять не будет (код возврата = -1), и будет выход за пределы выделенной под массивы памяти.

ресайз проходит говорю ж))

отслеживал размер массива я)

 
FiftyStars:

ресайз проходит говорю ж))

отслеживал размер массива я)


Чем отслеживали? У Вас нет проверки.

 
PapaYozh:


Чем отслеживали? У Вас нет проверки.


одна строчка которой ЗДЕСЬ нет=)

если бы здесь был весь тот код что я использовал для проверки состояния того или другого объекта прога была бы в 2 раза длиннее уже))

 

FiftyStars, приветствую!
Индикатор, без указанных Вами недостатков во вложении.
В обмен расскажите о том как интерпретировать результаты данного инструмента. :) Ниже вставка с моими изменениями.

     // Если появился новый бар, увеличиваем размерность массива и сдвигаем значения на единицу
     if (isNewBar()) 
       {
   int Size = ArraySize(MADif1);   
   ArrayResize(Bulls,Size);
   ArrayResize(Bears,Size);
   
   ArrayResize(BullsMA1,Size);
   ArrayResize(BearsMA1,Size);
   ArrayResize(BullsMA2,Size);
   ArrayResize(BearsMA2,Size);
   ArrayResize(BullsMA3,Size);
   ArrayResize(BearsMA3,Size);
   ArrayResize(BullsMA4,Size);
   ArrayResize(BearsMA4,Size);
   
   ArrayResize(BullsMAMA1,Size);
   ArrayResize(BearsMAMA1,Size);
   ArrayResize(BullsMAMA2,Size);
   ArrayResize(BearsMAMA2,Size);
   ArrayResize(BullsMAMA3,Size);
   ArrayResize(BearsMAMA3,Size);
   ArrayResize(BullsMAMA4,Size);
   ArrayResize(BearsMAMA4,Size);
       
       for(i=Bars-1;i>0;i--)
         {
         Bulls[i]=Bulls[i-1];
         Bears[i]=Bears[i-1];
         BullsMA1[i]=BullsMA1[i-1];
         BearsMA1[i]=BearsMA1[i-1];
         BullsMA2[i]=BullsMA2[i-1];
         BearsMA2[i]=BearsMA2[i-1];
         BullsMA3[i]=BullsMA3[i-1];
         BearsMA3[i]=BearsMA3[i-1];
         BullsMA4[i]=BullsMA4[i-1];
         BearsMA4[i]=BearsMA4[i-1];
         BullsMAMA1[i]=BullsMAMA1[i-1];
         BearsMAMA1[i]=BearsMAMA1[i-1];
         BullsMAMA2[i]=BullsMAMA2[i-1];
         BearsMAMA2[i]=BearsMAMA2[i-1];
         BullsMAMA3[i]=BullsMAMA3[i-1];
         BearsMAMA3[i]=BearsMAMA3[i-1];
         BullsMAMA4[i]=BullsMAMA4[i-1];
         BearsMAMA4[i]=BearsMAMA4[i-1];
         }
       Bulls[0]=0.;
       Bears[0]=0.;
       BullsMA1[0]=0.;
       BearsMA1[0]=0.;
       BullsMA2[0]=0.;
       BearsMA2[0]=0.;
       BullsMA3[0]=0.;
       BearsMA3[0]=0.;
       BullsMA4[0]=0.;
       BearsMA4[0]=0.;
       BullsMAMA1[0]=0.;
       BearsMAMA1[0]=0.;
       BullsMAMA2[0]=0.;
       BearsMAMA2[0]=0.;
       BullsMAMA3[0]=0.;
       BearsMAMA3[0]=0.;
       BullsMAMA4[0]=0.;
       BearsMAMA4[0]=0.;
       }



.......................

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (indBars!=Bars) 
      {
      indBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
Файлы:
Причина обращения: