Доработка индикатора

 

ПОМОГИТЕ пожалуйста в доработке,все вроде сделал ,компилятор пишет что ошибок нет а он не считает,в смысле не совсем не считает,а только считает и выводит на график в момент запуска или в момент переключения таймфрейма,а после закрытия свечки стопорится.В чем может быть причина?Перечитал кучу литературы но ответа так и не нашел.Заранее благодарен. 

Файлы:
AVR-4.txt  6 kb
 
aedu:

ПОМОГИТЕ пожалуйста в доработке,все вроде сделал ,компилятор пишет что ошибок нет а он не считает,в смысле не совсем не считает,а только считает и выводит на график в момент запуска или в момент переключения таймфрейма,а после закрытия свечки стопорится.В чем может быть причина?Перечитал кучу литературы но ответа так и не нашел.Заранее благодарен. 

добавьте перед циклом

if (limit<=0) limit=1;

if (limit>3) limit=Bars-1;

 
добавил .........та же фишка,стоит зараза ,как пуговица на смерть
 
//+------------------------------------------------------------------+
//|                                                        AVR-4.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property version   "1.00"
#property strict
#property indicator_separate_window  // отображение индикатора в отдельном окне
#property indicator_buffers 2        // количество буферов индикатора
#property indicator_color1 clrBlue   // цвет отрисовки первого значения индикатора
#property indicator_color2 clrRed    // цвет отрисовки второго значения индикатора
#property indicator_level1  15       // задаем уровни в окне отображения
#property indicator_level2  50
#property indicator_level3  85
//--- input parameters               // вводимые значения вручную
input int       barsToProcess=200;   // количество свечей для счета
double   BayBuffer[],SellBuffer[]; // наименование массивов получаемых значений  с плавающей точкой
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         | //  инициализация
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(2);                   // количество знаков после запятой в получаемых значениях индикатора     
   IndicatorBuffers(2);                  // количество буферов индикатора

   SetIndexBuffer(1, BayBuffer);         // присваивание индекса "1" массиву со значением BAY
   SetIndexEmptyValue(1, -1);            // присваивание массиву пустого значения
   SetIndexStyle(1, DRAW_HISTOGRAM);     // присваивание массиву стиля рисования, в данном случае гистограмма
   SetIndexLabel(1,"bay" );              // присваивание массиву текста при наведении мышкой 
   SetIndexBuffer(0, SellBuffer);        // присваивание индекса "0" массиву со значением SELL
   SetIndexEmptyValue(0, -1);            // присваивание массиву пустого значения
   SetIndexStyle(0, DRAW_HISTOGRAM);     // присваивание массиву стиля рисования
   SetIndexLabel(0,"sell" );             // присваивание массиву текста при наведении мышкой
   return(0);                           // конец инициализации
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              | //считалка
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                 )
  {
   double  K,Z,W,N,T,path,buyers,sellers;    // обявление получаемых переменных с плавающей точкой
   int limit=rates_total-prev_calculated;

//---- main loop
   for(int i=0; i<limit; i++) //задание цикла для подсчета значений на открытой свече открытого таймфрейма
     {
      Z=high[i]-low[i];                      //  размер свечи в пунктах 
      if(Z==0)
         Z=0.0001;
      path  = MathAbs( close[i] - open[i]);  //  размер тела  свечи в пунктах(MathAbs - всегда положительное)
      K=path/Z;                              //  коэфициент "полезной работы" покупателей или продавцов
      if(close[i]>open[i])
        {                                    //  расчет для растущей свечки 
         W = high[i]- K*(high[i]-close[i]);           //  точка равновесия с учетом "полезной работы" на верхней тени свечи
         N = open[i] - K* (open[i] -low[i]);          //  точка равновесия с учетом "полезной работы" на нижней тени свечи
         T = close[i] - K* (close[i] - open[i]);      //  точка равновесия с учетом "полезной работы" на теле растущей свечи    
         buyers =  (high[i] -W) + (close[i] - T) +  (open[i] - N);   //  покупатели в пунктах
         sellers = Z - buyers;                                       //  продавцы в пунктах    
           } else {                                                  //  расчет для падающей свечки                                                             
         W = high[i]- K*(high[i] - open[i]);                      //  точка равновесия с учетом "полезной работы" на верхней тени свечи
         N = close[i] - K* (close[i] - low[i]);                   //  точка равновесия с учетом "полезной работы" на нижней тени свечи
         T = open[i] - K* (open[i] - close[i]);                   //  точка равновесия с учетом "полезной работы" на теле падающей свечи 
         sellers =  (W -open[i]) + (T - close[i]) + (N - low[i]); //  продавцы в пунктах
         buyers = Z - sellers;                                    //  покупатели в пунктах
        }
      double BAY =100*buyers/(buyers+sellers);        //  покупатели в процентах 
      BayBuffer[i] = BAY;                             //  сохранение полученного значения в массиве
      double  SELL = 100*sellers/(buyers+sellers);    //  продавцы в процентах
      SellBuffer[i] = SELL;                           //  сохранение полученного значения в массиве


      if(BayBuffer[i]>SellBuffer[i]){ BayBuffer[i]=BAY;SellBuffer[i]=0;  }  // если покупателей больше, чем продавцов ,то отрисовываются только покупатели
      else
        {
         if(BayBuffer[i]<SellBuffer[i]){ SellBuffer[i]=SELL;BayBuffer[i]=0;}  // если продавцов больше, чем покупателей ,то отрисовываются только продавцы

        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
 
большое спасибо
 
aedu:
большое спасибо
Всегда пожалуйста.