проблема с iLowest и iHighest

 

Здравствуйте.

В mql4 я новичок. Пишу индикатор для своих нужд, отдаленно похожий на зигзаг.

В if-ах прописала условия нахождения вершин и низин.

В настоящий момент в буфер низин записывается лоу 2-го бара и соответственно в буфер вершин хай 2-го бара.

Вопрос: как правильно написать код, чтобы в низины записывался самый низкий лоу среди 3-ёх баров и соответсвенно в вершины записывался самый высокий хай среди 3-ёх баров.

Когда использую iLowest и iHighest, то индикатор зависает в воздухе и смещается (строки с ними сейчас закомментированы). Чую, что ошибка банальна и еще наверное напутано с итерациями, но я не понимаю)) Буду рада, если поможете, как переписать.

//+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link      "insta"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3

//--- plot myAZ
#property indicator_label1  "myAZ"
#property indicator_color1  Black
#property indicator_color2  Blue
#property indicator_color3    Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1


extern int barsToProcess=200; //количество последних баров в истории


//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(2,DRAW_ARROW);

//--- indicator buffers mapping
   SetIndexBuffer(0,myAZBuffer);
   SetIndexBuffer(1,ExtHighBuffer);
   SetIndexBuffer(2,ExtLowBuffer);
   IndicatorShortName("AZ");
//---
   return(0);
  }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }

//+------------------------------------------------------------------+
//|           start function                                                       |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(); //хранит количество посчитанных индикатором баров. Функция IndicatorCounted() возвращает количество неизмененных баров после прошлого вызова функции start().

   int i,j,n,limit;// Индекс бара
   int val_index;


   if(counted_bars>0)
      counted_bars--;

   limit=Bars-counted_bars; //количество последних баров, которые нужно пересчитать.

   if(limit>barsToProcess)
      limit=barsToProcess;



   for(n=0; n<=limit; n++)

     {


      if((Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2]) || (Close[n+1]>Open[n+1] && Close[n+2]>Open[n+2] && Open[n+3]>Close[n+3]))

        {

         // val_index=iLowest(NULL,0,MODE_LOW,3,n+1);

         myAZBuffer[n+2]=Low[n+2];
         ExtLowBuffer[n+2]=Low[n+2];


        }

      else
         if((Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2]) || (Close[n+1]<Open[n+1] && Open[n+2]>Close[n+2] && Close[n+3]>Open[n+3]))

           {

            // val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);

            myAZBuffer[n+2]=High[n+2];
            ExtHighBuffer[n+2]=High[n+2];

           }
     }



   return (0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+