Значение индикатора на n барах

 
Здравствуйте. Чтобы проверить текущее значение индикатора на предмет того, что оно является самым большим за n баров нужно организовать перебор всех значений(и их сравнение с текущим) индикатора на каждом баре при помощи цикла for()? 
 
Не обязательно. Можно использовать CopyBuffer, а потом ArrayMaximum, чтобы узнать, которое именно значение самое большое.
 
Igor Knyazkov:
Здравствуйте. Чтобы проверить текущее значение индикатора на предмет того, что оно является самым большим за n баров нужно организовать перебор всех значений(и их сравнение с текущим) индикатора на каждом баре при помощи цикла for()? 

Набросал вот такой код по быстрому.

//+------------------------------------------------------------------+
//|                                                       test03.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"

input int n=10; // Количество баров для анализа.
int handle=INVALID_HANDLE;
double buffer[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle=iRSI(_Symbol,PERIOD_CURRENT,14,PRICE_CLOSE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CopyBuffer(handle,0,0,n,buffer)<n)return;// Скоприруем данные индикатора в массив, если данные не скопировались выйдем из функции.
   ArraySetAsSeries(buffer,true);// перевернем массив как тайм серию.
   double max=buffer[ArrayMaximum(buffer)];// найдем максимальное значение индикатора за n последних баров
   if(max<buffer[0]) // если текущее значение индикатора больше максимального за n последних баров
     {
      // тут какойто код
     }

  }
//+------------------------------------------------------------------+

 ...

 
Sergey Gritsay:

Набросал вот такой код по быстрому.

//+------------------------------------------------------------------+
//|                                                       test03.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"

input int n=10; // Количество баров для анализа.
int handle=INVALID_HANDLE;
double buffer[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle=iRSI(_Symbol,PERIOD_CURRENT,14,PRICE_CLOSE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CopyBuffer(handle,0,0,n,buffer)<n)return;// Скоприруем данные индикатора в массив, если данные не скопировались выйдем из функции.
   ArraySetAsSeries(buffer,true);// перевернем массив как тайм серию.
   double max=buffer[ArrayMaximum(buffer)];// найдем максимальное значение индикатора за n последних баров
   if(max<buffer[0]) // если текущее значение индикатора больше максимального за n последних баров
     {
      // тут какойто код
     }

  }
//+------------------------------------------------------------------+

 ...

Использую так:

input int n=10; // Количество баров для анализа.
int handle=INVALID_HANDLE;
double buffer[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle=iRSI(_Symbol,PERIOD_CURRENT,14,PRICE_CLOSE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CopyBuffer(handle,0,0,n,buffer)<n)return;// Скоприруем данные индикатора в массив, если данные не скопировались выйдем из функции.
   ArraySetAsSeries(buffer,true);// перевернем массив как тайм серию.
   double max=buffer[ArrayMaximum(buffer)];// найдем максимальное значение индикатора за n последних баров
   if(max<buffer[0]) // если текущее значение индикатора больше максимального за n последних баров
     {
      Alert(123);
     }

  }
//+------------------------------------------------------------------+

Почему-то не работает. Ни одного алерта нет в журнале. Почему? 
 

 
Igor Knyazkov:

Использую так:


Почему-то не работает. Ни одного алерта нет в журнале. Почему? 
 

Потому, что Вы ищете максимум и включаете в него значение на нулевом баре. То есть если нулевой бар самый высокий, то в переменной max у Вас окажется как раз значение с нулевого бара и условие сравнения будет нереализовано.

Вам нужно искать максимум не во всём массиве, а начиная с первого элемента:

   double max=buffer[ArrayMaximum(buffer,1)]; // найдем максимальное значение индикатора за n последних баров

Таким образом элемент "0" массива не будет участвовать в поиске максимума.

 
Vladimir Karputov:

Потому, что Вы ищете максимум и включаете в него значение на нулевом баре. То есть если нулевой бар самый высокий, то в переменной max у Вас окажется как раз значение с нулевого бара и условие сравнения будет нереализовано.

Вам нужно искать максимум не во всём массиве, а начиная с первого элемента:

   double max=buffer[ArrayMaximum(buffer,1)]; // найдем максимальное значение индикатора за n последних баров

Таким образом элемент "0" массива не будет участвовать в поиске максимума.

Все заработало. Спасибо.
Причина обращения: