Проблема с индикатором. - страница 2

 

Помогите пожалуйста разобраться с индикатором. Некорректно присваиваются значения.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
//#property copyright "2009-2017, MetaQuotes Software Corp."
//#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots  2



#property indicator_label1 "H"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_width1 1 

#property indicator_label2 "L"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDodgerBlue
#property indicator_width2 1 


double HBuffer[];
double _H=0.0;
double LBuffer[];
double _L=0.0;


int ZigZag_handle;
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   ZigZag_handle=iCustom(_Symbol,_Period,"Examples\\ZigZag",12,5,3);
//--- если не удалось создать хэндл 
   if(ZigZag_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки 
      PrintFormat("Не удалось создать хэндл индикатора ZigZag для пары %s/%s, код ошибки %d",_Symbol,EnumToString(PERIOD_CURRENT),GetLastError());       //--- работа индикатора завершается досрочно 
      return(INIT_FAILED);
     };

   SetIndexBuffer(0,HBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,LBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ZigZag,INDICATOR_CALCULATIONS);

   PlotIndexSetInteger(0,PLOT_ARROW,139);
   PlotIndexSetInteger(1,PLOT_ARROW,139);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);


   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Detrended Price Oscillator                                       |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   int _limit=(rates_total-prev_calculated)-1;
   if(_limit<1){_limit=1;};
   if(!ZZ_FromBuffer(ZigZag,ZigZag_handle,_limit)) return(0);



   for(int i=_limit;(i>=0 && !IsStopped()); i--)
     {
      if(ZigZag[i]>0)
        {

         if(_H==0.0 && _L==0.0)
           {
            _H=ZigZag[i];
            _L=ZigZag[i];
           };
         if(_H>ZigZag[i] && _H!=_L)
           {
            _L=ZigZag[i];
            LBuffer[i]=ZigZag[i];
            HBuffer[i]=0.0;
           }
         else if(_L<ZigZag[i] && _H!=_L)
           {
            _H=ZigZag[i];
            HBuffer[i]=ZigZag[i];
            LBuffer[i]=0.0;
           };

        };
     };

//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ZZ_FromBuffer(double &ZZ_buffer[],int ind_handle,int _count)
  {
//--- сбросим код ошибки 
   ResetLastError();
//--- заполняем часть массива  значениями из индикаторного буфера под индексом 0 
   if(CopyBuffer(ind_handle,0,0,_count,ZZ_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки 
      PrintFormat("Не удалось скопировать данные из индикатора ZZ, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным 
      return(false);
     }
//--- все получилось 
   return(true);
  }
//+------------------------------------------------------------------+