Ситуация.
Перед этим кодом нет ничего такого, что могло бы затормозить выполнение программы на длительное время (т. е. до следующего тика).
В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего.
А после этого кода никакого беспокойства?
В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего.
И?
и начнется обработка следующего
правда не всегда это так
В mql4 события стоят в очереди, поэтому обработка нового тика не начнется, пока не закончится обработка предыдущего.
Все верно!
1 тик
... некое время
2 тик
... некое время
3 тик ( допустим тут вы зашли в обработку и минут 15 не выходили ) , по окончании Вы не получите т на 4-й тик и следующие за ним - следующйи вход в обработку тика вас кинет на N-й тик )
...
4 тик
..
N тик
и начнется обработка следующего
правда не всегда это так
Грандиозно! )))
Только никак не возьму в толк, каким образом эта информация проливает свет на поднятую проблему?
Я так понимаю: есть тик - должен быть хотя бы один бар. Другое дело, когда нет тиков, тогда и баров может не быть. Но почему срабатывает OnTick? Эмуляторы тиков в описанном случае не используются.
Грандиозно! )))
Только никак не возьму в толк, каким образом эта информация проливает свет на поднятую проблему?
Я так понимаю: есть тик - должен быть хотя бы один бар. Другое дело, когда нет тиков, тогда и баров может не быть. Но почему срабатывает 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);
у Вас это происходит регулярно ?
На двух брокерах повторилось - на других все ОК. Началось вчера, после обновления на 765-ый билд.
не пробовали ловить бар иным способом ?
Что значит "ловить бар"? Есть обработчик OnTick. Он вызывается, т. к. пришел тик. В коде есть безобидное обращение - Time[0]. И тут оказывается что "array out of range", потому как Bars равен 0. Только вот куда же делся тогда этот тик? Записался в бар с индексом -1? ))))
трудно понять что происходит у Вас без логирования...
Тут, к сожалению, логировать нечего: Bars равен нулю.
за много лет ни разу не получал никаких ошибок

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ситуация.
Онлайн запущен советник, торгует несколько часов подряд. Все нормально. В какой-то момент советник прекращает работу с ошибкой, указывающей на следующую строку:
В самой строке ошибка приходится на Time[0]. То есть нужно понимать так, что на графике нет даже нулевого бара.
Такая ситуация могла бы быть понятна, если бы дело касалось зацикленного скрипта или советника. В крайнем случае - если бы код находился в обработчике OnChartEvent или OnTimer. Но указанный код находится в OnTick. Перед этим кодом нет ничего такого, что могло бы затормозить выполнение программы на длительное время (т. е. до следующего тика).
Пока вышел из положения путем дополнительной проверки:
Далее в коде везде используется именно bars, а не Bars.
Собственно вопрос: нормальна ли ситуация, при которой приходит тик (должен же тогда быть хотя бы один бар), но на графике нет ни одного бара?
Билд 765, демо-сервер от Exness.