В коде советника в месте объявления глобальных переменных модуля введем переменную,
- Код: выделить все
int intBars;
которая будет являться счетчиком баров и понадобиться нам для сравнения количества уже существующих баров и появлением нового бара.
Ниже функции OnTick() добавим код двух функций. Функция f_IsNewBar() определяет факт наступления нового бара:
- Код: выделить все
bool f_IsNewBar()
{
if(intBars != Bars)
{
intBars = Bars;
return(true);
}
return(false);
}
Функция f_EveryBar() выполняет необходимые нам при наступлении нового бара. Разработчик заполняет её своим кодом.
- Код: выделить все
void f_EveryBar()
{
// выполняется в начале каждого нового бара
}
Далее остается в функции OnTick() прописать код запуска проверки условия наступления нового бара и заготовка советника готова к использованию.
- Код: выделить все
void OnTick()
{
// если появился новый бар:
if(f_IsNewBar()) f_EveryBar();
}
Для демонстрации факта наступления нового бара можно добавить строку кода для вывода комментария в функцию f_EveryBar() и она тогда приобретет вид:
- Код: выделить все
void f_EveryBar()
{
// выполняется в начале каждого нового бара
Comment("\n", "Новый бар наступил!");
}
Весь код советника выглядит так:
- Код: выделить все
//+------------------------------------------------------------------+
//| EA-Example-04.mq4 |
//| Haos |
//| http://www.investforum.ru/forum/ |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link "http://www.investforum.ru/forum/"
#property version "1.00"
#property strict
int intBars;
//***********************************************************************************************
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//***********************************************************************************************
void OnDeinit(const int reason)
{
//---
}
//***********************************************************************************************
void OnTick()
{
// если появился новый бар:
if(f_IsNewBar()) f_EveryBar();
}
//***********************************************************************************************
void f_EveryBar()
{
// выполняется в начале каждого нового бара
Comment("\n", "Новый бар наступил!");
}
//***********************************************************************************************
bool f_IsNewBar()
{
if(intBars != Bars)
{
intBars = Bars;
return(true);
}
return(false);
}
//***********************************************************************************************
В завершении следует отметить, что данных подход имеет один недостаток: факт появления нового бара не наступает пока не приходит первый тик нового бара. Т.е. на вялом рынке может быть ситуация, когда фактически время нового бара наступило, но тик не пришел и значит функции обработки событий не запустятся. Тем не менее, это требование в подавляющем большинстве случаев является чрезмерным и не влияет на общий ход торговли.