//+---------------------------------------------------------------------------------------------------------------------------------------+
//| HighestBarOfTheSequence.mq4 |
//| hoz |
//+---------------------------------------------------------------------------------------------------------------------------------------+
#property copyright "hoz"
#property version "1.00"
#property strict
#property indicator_chart_window // Индикатор выводится в окне графика
#property indicator_buffers 1 // Используется 2 буфера индикатора
input int countCamparedBars = 3; // Количество объёма определённого признака в последовательности
double highestValue[]; // Буфер максимальных значение объёма за N-баров
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| OnInit() |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
IndicatorBuffers(1);
// Связывание буфферов с индексами и определение стилей
SetIndexBuffer (0, highestValue);
SetIndexStyle (0, DRAW_ARROW, 0, 3, clrBlack);
SetIndexArrow (0, 241);
//---
return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Возвращаем флаг наличия возрастающей последовательности хаёв |
//+---------------------------------------------------------------------------------------------------------------------------------------+
bool ExistencePositiveSequence (int fi_Index, int fi_CountCamparedBars)
{
int cnt = 0;
for (int i = fi_Index; i < fi_Index + fi_CountCamparedBars; i++)
{
if (High[i] > High[i + 1])
cnt++;
}
if (cnt == fi_CountCamparedBars)
return (true);
return (false);
}
/*bool ExistencePositiveSequence (int fi_Index, int bars)
{
int cx = 0;
if (High[fi_Index] > High[fi_Index + 1])
{
cx++;
while (High[fi_Index + cx] > High[fi_Index + cx + 1]){
cx++;
if (cx >= bars) return true;
}
}
return (false);
}*/
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| OnCalculate() |
//+---------------------------------------------------------------------------------------------------------------------------------------+
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)
{
limit--;
}
for (int i = limit; i >= 0; i--)
{
if (ExistencePositiveSequence (i, countCamparedBars) == true)
{
highestValue[i] = High[i];
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}