Косяк с циклом, помогите чайнику.

 
Написал код. Все просто. В начале расчитывается и рисуется Болинжер, далее если стандартное отклонение на каком-то отрезке уменьшается до или менее определенной константы рисуются две линии мах. и min. цены за период. Так вот проблема в цикле while, где сравниваются значения. При вешании индикатора на график терминал подвисает на ~3 мин.10 сек.Без этого цикла все летает с ним нет. У меня CeleronD 2.66, память 512. Подскажите в чем может быть проблема?
//+------------------------------------------------------------------+
//|                                                         Flat.mq4 |
//|                                                            Talex |
//|                                                 tan@gazinter.net |
//+------------------------------------------------------------------+
#property copyright "Talex"
#property link      "tan@gazinter.net"
 
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Red
 
extern int    BBPeriod=20;
extern int    BBShift=0;
extern double BBDev=2.0;
extern int    Price=0;
extern int    Type_MA=0;
 
//---- buffers
double MABuffer[];
double UpBuffer[];
double DownBuffer[];
 
//---- массив
double StDev[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MABuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UpBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,DownBuffer);
//----
   SetIndexDrawBegin(0,BBPeriod+BBShift);
   SetIndexDrawBegin(1,BBPeriod+BBShift);
   SetIndexDrawBegin(2,BBPeriod+BBShift);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
  
  
//----
   DeleteObject();
//----
   return(0);
  }
  
  void DeleteObject(){
    for (int i=0; i<Bars; i++) {
    ObjectDelete("Highline"+i);
    ObjectDelete("Lowline"+i);
    }}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i,j,k,TypePrice1,cbars=IndicatorCounted();
   double TypePrice2,DevPer;
   double Sum,SqDiffer;
   
   if(cbars>0)j=Bars-cbars-1;
   else j=Bars-BBPeriod-1;
   for(i=j;i>=0;i--)
   {
    switch(Price) {
          case 0: TypePrice1=PRICE_CLOSE;break;
          case 1: TypePrice1=PRICE_OPEN;break;
          case 2: TypePrice1=PRICE_HIGH;break;
          case 3: TypePrice1=PRICE_LOW;break;
          case 4: TypePrice1=PRICE_MEDIAN;break;
          case 5: TypePrice1=PRICE_TYPICAL;break;
          case 6: TypePrice1=PRICE_WEIGHTED;break;
          default:TypePrice1=PRICE_CLOSE;break;
          }
    MABuffer[i]=iMA(NULL,0,BBPeriod,BBShift,Type_MA,TypePrice1,i);
   
    Sum=0;
     for(k=i;k<=i+BBPeriod-1;k++)
     {
     switch(Price) {
          case 0: TypePrice2=Close[k];break;
          case 1: TypePrice2=Open[k];break;
          case 2: TypePrice2=High[k];break;
          case 3: TypePrice2=Low[k];break;
          case 4: TypePrice2=(High[k]+Low[k])/2;break;
          case 5: TypePrice2=(High[k]+Low[k]+Close[k])/3;break;
          case 6: TypePrice2=(High[k]+Low[k]+Close[k]*2)/4;break;
          default:TypePrice2=Close[k];break;
          }
          
      SqDiffer=(TypePrice2-MABuffer[i])*(TypePrice2-MABuffer[i]);
      Sum+=SqDiffer;
      }
   
   ArrayResize(StDev,Bars-BBPeriod);
   ArraySetAsSeries(StDev,true);
   StDev[i]=BBDev*MathSqrt(Sum/BBPeriod);
   
   UpBuffer[i]=MABuffer[i]+StDev[i];
   DownBuffer[i]=MABuffer[i]-StDev[i];
  
   
   switch(Period()) {
          case 1: DevPer=0.000140;break;
          case 5: DevPer=0.000272;break;
          case 15: DevPer=0.000478;break;
          case 30: DevPer=0.000754;break;
          case 60: DevPer=0.001300;break;
          case 240: DevPer=0.003065;break;
          case 1440: DevPer=0.009023;break;
          case 10080: DevPer=0.018525;break;
          case 43200: DevPer=0.048446;break;
          }
     
      datetime t1, t2;
      double p1,p2,p3,p4;
      int n;
      
      NormalizeDouble(StDev[i+1],6);
       NormalizeDouble(StDev[i],6);
      if(StDev[i+1]<=DevPer && StDev[i]>DevPer) 
      {
       t2=iTime(NULL,0,i+1);
       n=i+1;
       NormalizeDouble(StDev[n],6);
       while(StDev[n]<=DevPer)
       {n++;}
      
       t1=iTime(NULL,0,n+BBPeriod-5);
       p1=High[Highest(NULL, 0, MODE_HIGH, (n+BBPeriod-5)-(i+1), i+1)];
       p2=p1+Point;
       p3=Low[Lowest(NULL, 0, MODE_LOW, (n+BBPeriod-5)-(i+1), i+1)];
       p4=p3-Point;
      
       ObjectCreate("Highline"+i,OBJ_RECTANGLE,0,t1,p1,t2,p2);
       ObjectSet("Highline"+i,OBJPROP_COLOR,Red);
       ObjectCreate("Lowline"+i,OBJ_RECTANGLE,0,t1,p3,t2,p4);
       ObjectSet("Lowline"+i,OBJPROP_COLOR,Blue);
       }
       }
      
 
      
    
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Вместо while сделай цикл for.

 
Talex писал (а):
Написал код. Все просто. В начале расчитывается и рисуется Болинжер, далее если стандартное отклонение на каком-то отрезке уменьшается до или менее определенной константы рисуются две линии мах. и min. цены за период. Так вот проблема в цикле while, где сравниваются значения. При вешании индикатора на график терминал подвисает на ~3 мин.10 сек.Без этого цикла все летает с ним нет. У меня CeleronD 2.66, память 512. Подскажите в чем может быть проблема?
       while(StDev[n]<=DevPer)
       {n++;}

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


while(StDev[n]<=DevPer && n<Bars-1)
       {n++;}
 
Спасибо за ответы.
while(StDev[n]<=DevPer && n<Bars-1)
       {n++;}
Действительно помогло и я понял в чем была ошибка.
Причина обращения: