Помгите с кодом...

 
Да простят меня всевидящие и всёзнающие!

Есть задача - обозначить кружком цвета магенты фрактал, у кото есть общие бары с другим фракталом и красным, у которого нет. Приведённый ниже код работает. И даже всё правильно считает. До поры до времяни, а потом кружочки появляются как салют рандомом. Помогите найти ошибку. Т.е. мне кажется я даже вижу где она ( while(i>=0) ), но как исправить не знаю.

#property  indicator_chart_window      // an indicator is drawn in the main chart window
#property indicator_buffers 2
#property indicator_color1  Red
#property indicator_color2  Magenta

#define SZ  5

double Arseny0[];
double Arseny1[];
double Fractal_bufer[SZ];
extern int CurPos = 0;

int init()
  {
// 129 - единица в кружочке
// 130 - двойка в кружочке

   IndicatorDigits(Digits);

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
                           
   SetIndexArrow(0,129);
   SetIndexArrow(1,130);
   
   SetIndexBuffer(0,Arseny0);
   SetIndexBuffer(1,Arseny1);

   ArrayInitialize(Fractal_bufer , 0.0000) ;

   return(0);
  }
int start()
  {
   int i, k=0;
   double frac_a, frac_b;
   bool bool_a, bool_b;
   i=Bars-0;
   while(i>=0)
     {
     if(CurPos >4)CurPos=0;
      frac_a = iFractals(NULL,0,MODE_UPPER,i);
      frac_b = iFractals(NULL,0,MODE_LOWER,i);

      bool_a = frac_a != 0.00;
      bool_b = frac_b != 0.00;

      if(bool_a == 0.0 && bool_b != 0.00)
         Fractal_bufer[CurPos % SZ] = Low[i]-0.0005;
      else
      if(bool_a != 0.0 && bool_b == 0.00)
         Fractal_bufer[CurPos % SZ] = High[i]+0.0005;
      else
      if(bool_a != 0.0 && bool_b != 0.00)
         Fractal_bufer[CurPos % SZ] = High[i]+0.0005;
      else
         Fractal_bufer[CurPos % SZ] = 0.00;

      if(
         Fractal_bufer[(CurPos + 3) % SZ] != 0.0 &&
         Fractal_bufer[(CurPos + 4) % SZ] == 0.0 &&
         Fractal_bufer[(CurPos + 0) % SZ] == 0.0 &&
         Fractal_bufer[(CurPos + 1) % SZ] == 0.0 &&
         Fractal_bufer[(CurPos + 2) % SZ] == 0.0
      )
      {
         Arseny0[i+2] = Fractal_bufer[(CurPos + 3) % SZ];
      }
      if(
         Fractal_bufer[(CurPos + 3) % SZ] != 0.0 &&
         Fractal_bufer[(CurPos + 4) % SZ] != 0.0 ||
         Fractal_bufer[(CurPos + 0) % SZ] != 0.0 ||
         Fractal_bufer[(CurPos + 1) % SZ] != 0.0 ||
         Fractal_bufer[(CurPos + 2) % SZ] != 0.0
      )
      {
         Arseny1[i+2] = Fractal_bufer[(CurPos + 3) % SZ];
      }
      
      CurPos++;
     i--;
     }  
   return(0);
  }


с уважением, Сеня.

 
я что, не в тот форум обратился?
 
"Джентельменов до хрена, местов нет" (с) Анекдот один.
 
времени нет....
то, что видно сразу - замени

i=Bars-0;
while ( i >= 0 )
{
....
i --;
}


на это:

	int counted_bars=IndicatorCounted();
	if ( counted_bars < 0 ) { Print( "counted_bars < 0 !" ); return(-1); }
	if ( Bars < 100 ) { Print( "Bars < 100 !" ); return(-1); }

	if ( counted_bars > 0 ) { counted_bars -- ; }

	int limit = Bars - counted_bars;
	for ( int i = limit; i >= 0; i -- )
	{
...
	}
Причина обращения: