Оптимизация индикатора

 
Уважаемые, может подкажет кто, как этого зверя оптимизировать,
чтоб так жутко не тормозил при переходе на мелкие таймфрэймы???

//+------------------------------------------------------------------+
//|                                                Цена и полосы.mq4 
//|                                              created by Art 2006 
//|                                                shaddow@yandex.ru 
//+------------------------------------------------------------------+
 
 
#property copyright "created by Art 2006"
#property link      "shaddow@yandex.ru"
 
#property indicator_separate_window
#property indicator_minimum -200
#property indicator_maximum 200
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
 
 
#property indicator_level1 100
#property indicator_level2 -100
#property indicator_level3 0
 
// БУФЕРЫ ДЛЯ ПОЛОС
double ExtMapBufferUpper[];
double ExtMapBufferLower[];
 
extern   int PeriodB=20;
extern   int PeriodM=20;
extern   double Std=2;
//extern   int TotalBars=200;
 
 
 
      int i;
      int win_idx; //индекс окна индикатора
      int FHandle;
      
double LowerBB, UpperBB, MiddleBBCurr ;   // полосы Боллинджера
int col;
string myPeriod;
 
SetLevelStyle(STYLE_DOT,1,Gray);
 
double CalcBB(int col)
  {
   UpperBB=iBands(NULL,0,PeriodB,Std,0,PRICE_WEIGHTED,MODE_UPPER,col);
   MiddleBBCurr=iMA(NULL,0,PeriodM,0,MODE_SMA,PRICE_WEIGHTED,col);
   LowerBB=iBands(NULL,0,PeriodB,Std,0,PRICE_WEIGHTED,MODE_LOWER,col);
  }
 
 
 
 
 
int
Raschet(int From)
{
int i;
   for (i=From; i>=0; i--)
         {
        
        CalcBB(i);
        
        double myPriceH=iHigh(NULL,0,i);
        double myPriceL=iLow(NULL,0,i);
        
        int IndicatorLowZnach= NormalizeDouble(((MiddleBBCurr-myPriceL)*100)/((MiddleBBCurr-LowerBB)),0);
        int IndicatorUpZnach=  NormalizeDouble(((myPriceH-MiddleBBCurr)*100)/((UpperBB-MiddleBBCurr)),0);
        
        ExtMapBufferLower[i]=-1*IndicatorLowZnach;
        ExtMapBufferUpper[i]=IndicatorUpZnach;
         
        FileWrite(FHandle,i,TimeToStr(iTime(NULL,0,i)),-1*IndicatorLowZnach, IndicatorUpZnach);
         }
}
 
//********************************************************************
//*                И Н И Ц И А Л И З А Ц И Я                         *
//********************************************************************
 
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBufferUpper);
   SetIndexLabel(0,"Высшая цена от верхней полосы");
   
   SetIndexStyle(1,DRAW_LINE,0,1);
   SetIndexBuffer(1,ExtMapBufferLower);
   SetIndexLabel(1,"Нижняя цена от нижней полосы");
   
   IndicatorShortName("Цена и полосы");
 
    // предназначено только для отчёта в файл
      
    switch (Period())
    {
    case 1: myPeriod =  "1   минута";
            break;
    case 5: myPeriod =  "5   минут";
            break;
    case 15: myPeriod = "15 минут";
            break;
    case 30: myPeriod = "30 минут";
            break;
    case 60: myPeriod = "1  час";
            break;
    case 240: myPeriod= "4  часа";
            break;
    case 1440:myPeriod= "1  день";
            break;
    case 10080:myPeriod="1  неделя";
            break;
    case 43200:myPeriod="1  месяц";
            break;
    }
   return(0);
  }
 
int deinit()
  {
//----
   
//----
   return(0);
  }
  
//********************************************************************
//*                        С Т А Р Т У Е М !!                        *
//********************************************************************
int start()
  {
  int limit; 
  int  counted_bars=IndicatorCounted();
  
   if (counted_bars==0)  limit=Bars-1;              
   if (counted_bars>0)   limit=Bars-counted_bars-1; 
                                                    
  FHandle=FileOpen(Symbol()+"\\цена и полосы\\"+myPeriod+".csv",FILE_CSV|FILE_WRITE,';');
  if (FHandle<1)
      {
      int Desc=GetLastError();
      if (Desc==4103) string Mess="Ошибка!  Возможно юзается другим приложением";
      Print(Mess);
      return;
      }
  FileWrite(FHandle,Symbol(),myPeriod);
  FileWrite(FHandle,"No","t","Low","High");
 
   Raschet(limit-PeriodB);
   
   if(FHandle>0) FileClose(FHandle);
   return(0);
  }
//+------------------------------------------------------------------+
 
1. зачем писать на каждом тике все значения в файл? файловые операции на мелочных записях дорогие
2. зачем вместо High[i] использовать iHigh ?
3. что делает за пределами функций команда?
SetLevelStyle(STYLE_DOT,1,Gray);
4. содержимое функции CalcBB можно внести внутрь цикла
 
Спасибо, Renat. Всё исправил. Запись в файл вывел по значению в deinit(). SetLevelStyle - это случайная флуктуация... Стало читабельнее и веселее. Только для тёмного - а есть принципиальная разница High[i] и iHigh(.....)? (имеется ввиду в скорости расчётов)
 
shaddow писал (а):
Только для тёмного - а есть принципиальная разница High[i] и iHigh(. ....)? (имеется ввиду в скорости расчётов)

Есть.

High[X] - прямое обращение к данным
iHigh(NULL,0,X) - обращение к тем же данным через функцию. Лишний вызов функции - лишние накладные расходы
 
Понятненько! Сэнк ю вери дзякуй.
Причина обращения: