Как определить наступление нового бара

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Как определить наступление нового бара

Сообщение Haos » 30 янв 2016, 13:33

Часто в коде советника необходимо определить наступление нового бара, чтобы запустить на выполнение определенные команды, которые нужно запускать один раз при появлении нового бара, а не на каждом тике. Решений этого вопроса есть несколько. Рассмотрю для начала самый простой и понятный для освоения.
В коде советника в месте объявления глобальных переменных модуля введем переменную,
Код: выделить все
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);
}

//***********************************************************************************************


В завершении следует отметить, что данных подход имеет один недостаток: факт появления нового бара не наступает пока не приходит первый тик нового бара. Т.е. на вялом рынке может быть ситуация, когда фактически время нового бара наступило, но тик не пришел и значит функции обработки событий не запустятся. Тем не менее, это требование в подавляющем большинстве случаев является чрезмерным и не влияет на общий ход торговли.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как определить наступление нового бара

Сообщение Haos » 13 июн 2017, 06:01

Наступление нового бара также можно определить и другим способом. Используем пользовательскую функцию:
Код: выделить все
bool f_IsNewBar()
{
// Функция определяет факт наступления нового бара
   static datetime dtm_LastTime = 0;
   if(Time[0] == dtm_LastTime)
   {
      return (false);
   }
   dtm_LastTime = Time[0];

return(true);
}


Она вызывается из тела функции OnTick():
Код: выделить все
void OnTick()
{
   // если появился новый бар:
   if(f_IsNewBar())
   {
   // здесь располагается код, выполняемый при наступлении нового бара
   }
}

При этом в самой функции OnTick() можно одновременно программировать действия, выполняемые как при наступлении нового бара так и наступлении нового тика.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения