Ïûòàþñü ðåàëèçîâàòü ôóíêöèþ ïîëó÷åíèÿ ìàêñèìàëüíîé äåëüòû çà 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 - áàðîâ.
Ïðîñüá ïîäåëèòñÿ îïûòîì â ýòîì ïëàíå, à òî óæå çàìó÷àëñÿ. Èíäþêè êóïèë è ïðîäëåâàþ ðåãóëÿðíî, à âîïðîñ íå ðåøàåò óæå íåäåëþ.
Ìíå íå ïðèíöèïèàëüíî ðåàëèçàöèÿ êàê ó ìåíÿ, ãëàâíîå êîððåêòíîå ðåøåíèå. Õîòÿ èíäþê òî íå áîëüøîé. Òîò êòî ïîíèìàåò, ñìîæåò è ó ìåíÿ íàéòè îøèáêó.