Отсутствует нулевой бар

 

Ситуация.

Онлайн запущен советник, торгует несколько часов подряд. Все нормально. В какой-то момент советник прекращает работу с ошибкой, указывающей на следующую строку:

   datetime rightBarTime = (barIndex >= 0 && barIndex < bars) ? Time[barIndex] : Time[0];

 В самой строке ошибка приходится на Time[0]. То есть нужно понимать так, что на графике нет даже нулевого бара. 

Такая ситуация могла бы быть понятна, если бы дело касалось зацикленного скрипта или советника. В крайнем случае - если бы код находился в обработчике OnChartEvent или OnTimer. Но указанный код находится в OnTick. Перед этим кодом нет ничего такого, что могло бы затормозить выполнение программы на длительное время (т. е. до следующего тика).

Пока вышел из положения путем дополнительной проверки:

int bars = Bars;
if (bars <= 0)
   return;

Далее в коде везде используется именно bars, а не Bars.


Собственно вопрос: нормальна ли ситуация, при которой приходит тик (должен же тогда быть хотя бы один бар), но на графике нет ни одного бара?

Билд 765, демо-сервер от Exness.

 
Scriptong:

Ситуация.

Перед этим кодом нет ничего такого, что могло бы затормозить выполнение программы на длительное время (т. е. до следующего тика).


А после этого кода никакого беспокойства? 
 

В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего. 

 
tara:
А после этого кода никакого беспокойства? 
Советник достаточно "легкий" - никаких особо долгих вычислений нет. Наибольшая часть кода посвящена обработке ордеров, коих не больше 10.
 
tara:

В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего. 

И?
 
Scriptong:
И?

и начнется обработка следующего

правда не всегда это так

 
tara:

В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего. 

Все верно!


1 тик

... некое время

2 тик

... некое время

3 тик ( допустим тут вы зашли в обработку и минут 15 не выходили  ) , по окончании Вы  не получите т на 4-й тик  и следующие за ним -  следующйи вход в обработку тика вас кинет на N-й тик  )

...

4 тик


..

N тик

 
YuraZ:

и начнется обработка следующего

правда не всегда это так

Грандиозно! )))

Только никак не возьму в толк, каким образом эта информация проливает свет на поднятую проблему?

Я так понимаю: есть тик - должен быть хотя бы один бар. Другое дело, когда нет тиков, тогда и баров может не быть. Но почему срабатывает OnTick? Эмуляторы тиков в описанном случае не используются.

 
Scriptong:

Грандиозно! )))

Только никак не возьму в толк, каким образом эта информация проливает свет на поднятую проблему?

Я так понимаю: есть тик - должен быть хотя бы один бар. Другое дело, когда нет тиков, тогда и баров может не быть. Но почему срабатывает OnTick? Эмуляторы тиков в описанном случае не используются.

ага , я сам в шоке от грандиозности

...

если  ОТКИНУТЬ шутки -  то вопрос конечно открыт

у Вас это происходит регулярно ?  не пробовали ловить   бар иным способом ?    трудно понять что происходит у Вас без логирования... 

1 ) попробуйте залогировать

2) попробуйте поменять механизм 

static  datetime tTimeSave=0;

...

void OnTick()
{

   if ( iTime( Symbol(), PERIOD_CURRENT , 0) !=  tTimeSave ) // Новый бар
   {
         tTimeSave = iTime( Symbol(), PERIOD_CURRENT , 0);  // имеем новый бар
   }
}


за много лет ни разу не получал никаких ошибок


datetime timeRightBar =  iTime( Symbol(), PERIOD_CURRENT , 0);

может без особых изысков , просто и сразу  получать  время - "самого правого бара" 

или
 
iCurBar ... чему то равно

if ( iCurBar > iBars( Symbol(), PERIOD_CURRENT )  )
 
   iCurBar =  iBars( Symbol(), PERIOD_CURRENT );

 datetime timeThisBar =  iTime( Symbol(), PERIOD_CURRENT , iCurBar);
 
Я тоже это замечал. Причем визуально. График как будто теряет все цены и показывает надпись "Обновление данных". Если вовремя такого обновления придет тик, то получаем ошибки деления на ноль. и пр. Чтоб советник не слетал. Пришлось при каждом делении на ноль сравнивать делитель  с нулем.
 
YuraZ:


у Вас это происходит регулярно ? 

На двух брокерах повторилось - на других все ОК. Началось вчера, после обновления на 765-ый билд.

не пробовали ловить   бар иным способом ?   

Что значит "ловить бар"? Есть обработчик OnTick. Он вызывается, т. к. пришел тик. В коде есть безобидное обращение - Time[0]. И тут оказывается что "array out of range", потому как Bars равен 0. Только вот куда же делся тогда этот тик? Записался в бар с индексом -1? ))))

 трудно понять что происходит у Вас без логирования...  

Тут, к сожалению, логировать нечего: Bars равен нулю. 

 за много лет ни разу не получал никаких ошибок 

Аналогично))
Причина обращения: