Построение по индикатору линии его экстремумов

 
Задача следующая: Есть индикатор в отдельном окне, в этом же окне нужно построить две линии показывающие его максимумы и минимумы за определённый период. Пытался воспользоваться функцией ArrayMaximum,ArrayMinimum ничего не получилось, в сети аналогов, пока, не нашёл. Кто владеет информацией, подскажите, как идею реализовать. Код приведённый ниже служит только примером.
//+------------------------------------------------------------------+
//| Close Open Divergence                                            |
 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Gray
#property indicator_color2 Red
#property indicator_color3 Blue
         //---- input parameters
extern int CODPeriod=5;
extern int iMAw0period=3;
extern int smoothing_0=3;
extern int smoothing_1=3;
         //--- переменые коэфициентов сглаживания
double k_0, k_1;
 
         //--- буфферы
double COD[], max[], min[], sm_0[100000], sm_1[100000];
         //--- функция инициализации
int init()
  {
   string short_name;
         //---задаем аттрибуты отображения индикатора
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,COD);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,max);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,min);
   
         //---- задаем название индикатора
   short_name="COD("+CODPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
 
         //--- подсчитываем индексы K для экспоненциального сглаживания
         //--- 1 - 1
         //--- 3 - 0.5
         //--- 7 - 0.25
         //--- 9 - 0.2
         
   k_0 = 2.0 / (smoothing_0 + 1);
   k_1 = 2.0 / (smoothing_1 + 1);
         //--- обнуляем начальные значения массива сглаженых данных
   sm_0[Bars]=0;
   sm_1[Bars]=0;
   
         //--- обнуляем основной массив
   ArrayInitialize(COD, 0.0);
 
   return(0);
  }
         //--- основная функция
int start()
  {
         //--- определяем сколько баров надопросчитать (уже просчитаные бары не считаем)
   int    counted_bars=IndicatorCounted();
   int    limit=Bars-counted_bars-1, pos;
   pos=limit;
   if(counted_bars>0) pos++;        // предпоследний бар пересчитываем
         //--- задаем переменные в которые ложим значения мувингов и само значение индикатора
   double CODnotsmoothing, iMAclose, iMAopen;
         //--- основной цикл
   while(pos>=0)
      {
         //--- в переменные ложим значения индикаторов
      iMAclose = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_CLOSE,pos);
      iMAopen = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_OPEN,pos);
         //--- просчитываем значение индикатора
      CODnotsmoothing=iMAclous - iMAopen;
         //--- просчитываем сглаживание в 2х каскадах
         //--- sm_0[pos+1] == CODnotsmoothing(i-1)
         //--- CODnotsmoothing == текущее значение
      sm_0[pos]=sm_0[pos+1] + k_0*(CODnotsmoothing - sm_0[pos+1]);
      sm_1[pos]=sm_1[pos+1] + k_1*(sm_0[pos] - sm_1[pos+1]);
               //--- кладём сглаженое значение в основной буффер для отображения индикатора COD
      COD[pos]=sm_1[pos];
      max[pos]=ArrayMaximum(sm_1,30,pos);
      min[pos]=ArrayMinimum(sm_1,30,pos);
     pos--;
     }
   return(0);
  }
 
ArrayMaximum и ArrayMinimum возвращают не значение элемента массива а индекс элемента.

нужно так:

max[pos]=sm_1[ArrayMaximum(sm_1,30,pos)];
 
БЛАГОДАРСТВУЮ !!!