- Значения индикатора с D1 на меньшем таймфрейме
- Вопросы от начинающих MQL5 MT5 MetaTrader 5
- Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6.
Здравствуйте. Чтобы проверить текущее значение индикатора на предмет того, что оно является самым большим за 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 последних баров
{
// тут какойто код
}
}
//+------------------------------------------------------------------+
...
Набросал вот такой код по быстрому.
//| 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 последних баров
{
// тут какойто код
}
}
//+------------------------------------------------------------------+
...
Использую так:
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);
}
}
//+------------------------------------------------------------------+
Почему-то не работает. Ни одного алерта нет в журнале. Почему?
Использую так:
Почему-то не работает. Ни одного алерта нет в журнале. Почему?
Потому, что Вы ищете максимум и включаете в него значение на нулевом баре. То есть если нулевой бар самый высокий, то в переменной max у Вас окажется как раз значение с нулевого бара и условие сравнения будет нереализовано.
Вам нужно искать максимум не во всём массиве, а начиная с первого элемента:
Таким образом элемент "0" массива не будет участвовать в поиске максимума.
Потому, что Вы ищете максимум и включаете в него значение на нулевом баре. То есть если нулевой бар самый высокий, то в переменной max у Вас окажется как раз значение с нулевого бара и условие сравнения будет нереализовано.
Вам нужно искать максимум не во всём массиве, а начиная с первого элемента:
Таким образом элемент "0" массива не будет участвовать в поиске максимума.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования