Как советнику дождаться момента появления нового бара? +некоторые тонкости

 

Оговорюсь сразу, что поиск по форуму уже использовал. Но в похожих темах даже уровень опыта авторов темы превосходит мой в разы - я попросту не понимаю, о чем там идет речь, посему решил спросить так.

Как отследить момент появления нового бара? Функция start() запускается чуть ли не каждую секунду, какое условие надо наложить, чтобы она завершалась на очередном тике, если в этом тике новый бар не появился?

И обещанные тонкости:

- между соседними барами количество тиков всегда разное?

- что происходит, если произошел новый тик, а функция start() не успела завершиться? Она завершается принудительно или запускается еще раз, как бы в другом, параллельном потоке?

 
farewell:

Оговорюсь сразу, что поиск по форуму уже использовал. Но в похожих темах даже уровень опыта авторов темы превосходит мой в разы - я попросту не понимаю, о чем там идет речь, посему решил спросить так.

Как отследить момент появления нового бара? Функция start() запускается чуть ли не каждую секунду, какое условие надо наложить, чтобы она завершалась на очередном тике, если в этом тике новый бар не появился?

И обещанные тонкости:

- между соседними барами количество тиков всегда разное?

- что происходит, если произошел новый тик, а функция start() не успела завершиться? Она завершается принудительно или запускается еще раз, как бы в другом, параллельном потоке?

1. Между соседними барами тиков нет.

2. Если пришел новый тик, а start() обрабатывает предыдущий, то информация о поступившем тике теряется.

 

Тонкости:

1. Всегда, если не случится чудо

2. Она продолжает работу, а по завершении - ждет нового тика.

В учебнике Ковалева толково описана функция NewBar

 

"Между соседними барами тиков нет."

Это в корне рушит все моё пока хрупкое представление об устройстве mql. :)

Как нет? Появление бара - это событие, которое можно отметить на временной оси. Тик - это тоже событие, происходящее в какое-то время. Естественно, что тики происходят чаще, чем появление баров, значит, между появлением сначала одного, а потом второго бара происходит n тиков. Так вот, n - не константа?

"информация о поступившем тике теряется."

Понятно.

И, всё-таки, как же отследить появление нового бара? Вообще для решения моей задачи вполне сойдет обычный отсчет времени, ибо я рассматриваю h1, и довольно легко можно рассчитать время появления бара. Но более универсального решения что, нет?..

 

"В учебнике Ковалева толково описана функция NewBar"

Сейчас посмотрю, спасибо. Кстати, по-моему, что-то такое я видел - функцию NewBar, только она была для mql5, а в mql4 из-за фатальных несовместимостей не запускалась.. если это не так, то буду рад.

 

Бар - всего-лишь форма аппроксимации.

 
farewell:

"Между соседними барами тиков нет."

Это в корне рушит все моё пока хрупкое представление об устройстве mql. :)

Как нет? Появление бара - это событие, которое можно отметить на временной оси. Тик - это тоже событие, происходящее в какое-то время. Естественно, что тики происходят чаще, чем появление баров, значит, между появлением сначала одного, а потом второго бара происходит n тиков. Так вот, n - не константа?

"информация о поступившем тике теряется."

Понятно.

И, всё-таки, как же отследить появление нового бара? Вообще для решения моей задачи вполне сойдет обычный отсчет времени, ибо я рассматриваю h1, и довольно легко можно рассчитать время появления бара. Но более универсального решения что, нет?..

"Между соседними барами тиков нет." - все тики внутри баров. Количество тиков внутри бара может быть разное.
 
farewell:

"Между соседними барами тиков нет."

Это в корне рушит все моё пока хрупкое представление об устройстве mql. :) ....

Да уж, тонкости... А между барами - это где?

Функция определения нового бара

int expertBars;

//=xooox=================================================================+
//==xox=| возвращает true если появился новый бар, иначе false |
//===x===================================================================+
bool isNewBar()
{
bool res=false;
if(expertBars!=iBars(Symbol(),0))
{
expertBars=iBars( Symbol (),0);
res=true;
}
return(res);
}

 

Да, тоже такое же решение хотел предложить:

int start()

{

if (NewBar() == true)

{

// код для обработки

}

return(0);

}

//+------------------------------------------------------------------+

// Определение появления нового бара!

//+------------------------------------------------------------------+

bool NewBar()

{

static datetime lastbar = 0;

datetime curbar = Time[0];

if(lastbar!=curbar)

{

lastbar=curbar;

return (true);

}

else return(false);

}

//+------------------------------------------------------------------+

 

Ого! Спасибо, ребята. Все оказалось более чем очевидно, только вот этот кусок неясен:

static datetime lastbar = 0;

datetime curbar = Time[0];

curbar - это переменная, в которую пишется.. что пишется? Время, в которое появился новый бар?

 
farewell:

datetime curbar = Time[0];

curbar - это переменная, в которую пишется.. что пишется? Время, в которое появился новый бар?


а у вас сложности с левой (datetime curbar) или правой (Time[0]) часть этой операции?

Причина обращения: