Пытаюсь реализовать функцию получения максимальной дельты за N-баров. Кто-нить подобное писал?
На данный момент, написан такой индикатор:

PHP код:
#property strict

#property indicator_chart_window            // Индикатор выводится в окне графика
#property indicator_buffers 2               // Используется 2 буфера индикатора
//#property indicator_color1 clrBlack         // Цвет отображения данных 1-го буфера
//#property indicator_width1 1                // Толщина линий 1-го буфера
//#property indicator_color2 clrRed           // Цвет отображения данных 2-го буфера
//#property indicator_width2 1                // Толщина линий 2-го буфера

input int countCamparedBars 3;            // Количество объёма определённого признака в последовательности
double   MaxPositiveDelta[];                // Буфер максимальных значений положительной дельты за N-баров
double   MaxNegativeDelta[];                // Буфер максимальных значений отрицательной дельты за N-баров

// ========================================================  Файлы включения  ===========================================================+
#include    <HOZ_Code\Classes\GetIndicatorsData\ClusterDelta.mqh>
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                             Custom indicator initialization function                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   
IndicatorBuffers(2);
   
   
// Связывание 1-го буффера с соответствующим массивом и определение его свойств
   
SetIndexBuffer (0MaxPositiveDelta);
   
SetIndexStyle (0,  DRAW_ARROW03clrBlack);
   
SetIndexArrow (0241);
   
   
// Связывание 2-го буффера с соответствующим массивом и определение его свойств
   
SetIndexBuffer (1MaxNegativeDelta);
   
SetIndexStyle (1DRAW_ARROW03clrRed);
   
SetIndexArrow (1242);

//---
   
return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                      Перечисление типов возможных дельт                                               |
//+---------------------------------------------------------------------------------------------------------------------------------------+
enum ENUM_DELTATYPE
{
   
MAX_POSITIVE_SEQUENCE,
   
MAX_NEGATIVE_SEQUENCE,
   
NONE
};
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                     Определение значение положительной дельты ClusterDelta_Delta                                      |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int ExistencePositiveSequence (int fi_Indexint fi_CountCamparedBars)
{
   
int cx 0;
   
   if (
ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index 1))
   {
      
cx++;
      
      while (
ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index cx 1))
      {
         
cx++;
         if (
cx >= fi_CountCamparedBars) return (MAX_POSITIVE_SEQUENCE);
      }
   }
   else if (
ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index 1))
   {
      
cx++;
      
      while (
ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index cx 1))
      {
         
cx++;
         if (
cx >= fi_CountCamparedBars) return (MAX_NEGATIVE_SEQUENCE);
      }
   }
   return (
NONE);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                               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[])
{
//---
   
int limit rates_total prev_calculated;
   
   while ( (
rates_total limit ) < countCamparedBars 1)
   {
      
limit--;
   }
   
   for (
int i limit>= 0i--)
   {
      if (
ExistencePositiveSequence (icountCamparedBars) == MAX_POSITIVE_SEQUENCE)
      {
         
MaxPositiveDelta[i] = High[i];
      }
      else if (
ExistencePositiveSequence (icountCamparedBars) == MAX_NEGATIVE_SEQUENCE)
      {
         
MaxNegativeDelta[i] = Low[i];
      }
   }
   
//--- return value of prev_calculated for next call
   
return (rates_total);

Функции ClusterDelta::PositiveDelta (fi_Index) и ClusterDelta::NegativeDelta (fi_Index) получаются из класса верно (проверил на реале).
Этот индюк не корректно показывает данные (рисует стрелки в местах, где должен быть самый большая дельта за countCamparedBars - баров.
Просьб поделится опытом в этом плане, а то уже замучался. Индюки купил и продлеваю регулярно, а вопрос не решает уже неделю.
Мне не принципиально реализация как у меня, главное корректное решение. Хотя индюк то не большой. Тот кто понимает, сможет и у меня найти ошибку.