Тонкости работы функции IndicatorCounted()

 

Прошу тех, кто часто работает со своими индикаторами, пояснить один момент относительно сабжа.

Вот реальная ситуация.

1. Есть индикатор, который имеет 6 буферов значений, то есть рисует 6 разных линий.

2. Но он может что-либо начать вычислять только при наличии на графике как минимум 1000 баров.

3. Прикрепляем индикатор к графику, на котором пока меньше. Например 900 баров.

4. В стартовой функции первым делом стоит проверка if (MinBars < 1000) return(0);.

5. Естественно, на первом тике ничего рассчитано не будет, и IndicatorCounted() выдаст 0.

Вопрос:

Какое значение выдаст функция на втором тике? Посчитает ли она, что на первом тике всё было рассчитано вплоть до предпоследнего бара? Или она выдаёт значение по реально занесённым в буферы числам? Тогда как она отреагирует, если было заполнено, скажем, только 3 буфера из 6-ти?

Заранее благодарен откликнувшимся!

PS Может не доходчиво объяснил. Спрашивайте, если что...

 
Проверить не сложно самому. По идее, на втором тике функция IndicatorCounted() вернет значение равное (Bars -1) согласно документации.
 

Вы неправилно понимаете назначение ф-ции IndicatorCounted(), она возвращает количество баров, не измененных после последнего вызова индикатора,

тоесть никакого отношения к буферам даных она не имеет. В 99.9% случаев эта ф-ция возвращает Bars-1. Исключения- это первый вызов индикатора и времья,

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

 

Большое спасибо ответившим!

Не очень часто пользуюсь этой функцией. Ключевые слова "возвращает количество баров, не измененных после последнего вызова". А на втором тике "не измененными" будут все, кроме последнего.

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

 
Sergo писал(а) >>

Большое спасибо ответившим!

Не очень часто пользуюсь этой функцией. Ключевые слова "возвращает количество баров, не измененных после последнего вызова". А на втором тике "не измененными" будут все, кроме последнего.

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

Зачем ждать? а если бары D1, вы будете ждать 3 года?

А взять из истории в вашем случае нельзя?

 
xeon писал(а) >>

Зачем ждать? а если бары D1, вы будете ждать 3 года?

А взять из истории в вашем случае нельзя?

Нет, ну это понятно, конечно... :)

Я имею ввиду, что контроль какой-никакой должен быть. Индюк не должен начинать вычисления (причём довольно трудоёмкие), если не хватает информации. Когда он это проверит, даже если ко второму тику вся история подгрузится, в функции IndicatorCounted() уже не будет никакого смысла.

А индюк я доделал. Кстати, вешается на график минуту-полторы при 10'000 баров истории. Слежение за подсчитанными барами сделал вручную. Дальше занимает долю секунды процессорного времени за несколько минут...

 

Бывают случаи, когда функция IndicatorCounted() неприменима. Тогда можно попробовать сделать так.

Допустим произвели расчет индикатора. Запоминаем значение Bars в переменной.

На следующем тике сравниваем значение Bars, хранящееся в переменной, с тем значением, которое в системе (в терминале) на новом тике.

Разница между этими значениями + 1 = количеству баров, которые необходимо пересчитать.

Если получается число большее 2, то лучше пересчитывать всю историю с предварительным обнулением индикаторных буферов - актуально для зигзагов и для тех индикаторов,

где буфера заполнены фрагментарно.

Так как могла произойти подкачка истории (при первичном включении терминала, например).

 
nen писал(а) >>

Бывают случаи, когда функция IndicatorCounted() неприменима...

Да, как раз такой случай.

У меня буфера заполнены полностью, без пропусков. Я делаю по другому. Запоминаю время последнего посчитанного бара. Затем на следующем тике нахожу его индекс функцией iBarShift() и пересчитываю с этого индекса. Гарантировано заново пересчитывается только один бар.

 
Sergo писал(а) >>

Да, как раз такой случай.

У меня буфера заполнены полностью, без пропусков. Я делаю по другому. Запоминаю время последнего посчитанного бара. Затем на следующем тике нахожу его индекс функцией iBarShift() и пересчитываю с этого индекса. Гарантировано заново пересчитывается только один бар.

Как раз может быть тот случай, что сказал NEN. при подкачке бывает такая особенность. Сперва подкачиваются ближайшие данные и iBarShift() вернет значения ближайшего бара. А потом подкачается немного более глубокая история. И все расчеты летят в трубу. Метод NENa мне больше нравится, хотя использую подобный твоему. И иногда требуется реиницилизация индкатора, хотя это и бывает довольно редко. Просто подкачка по разным инструментам идет не синхронно. И это надо обрабатывать програмно.

 
Vinin писал(а) >>

... Просто подкачка по разным инструментам идет не синхронно. И это надо обрабатывать програмно.

Да, абсолютно согласен.

Ничего сверхсложного. Просто надо очень внимательно продумать все ситуации, чтобы досчитывать только недостающую информацию. Но в то же время не пропустить ничего. У меня как раз с нескольких пар берётся инфа. Пересчитать весь массив с самого начала проблематично. Как я уже говорил, около минуты на двухъядерном процессоре. Если, допустим, периодически пропадает и появляется связь, то это будет большой гемор. Есть над чем с бумажкой посидеть. :))

Но, собственно, главный вопрос, который меня интересовал, это что для функции IndicatorCounted() является посчитанным баром. Ответ: бар, который не изменился с прошлого тика. Остальное - дело техники. Всем спасибо за участие!

 

в тестере стратегий массив постоянно подрезается,
растет от 1000 до 2-х затем снова 1000, многие нестандартные индюки не работают, (с обратным счетом например)

ломают линию
не всегда это вовремя замечаешь, и експерт выкидываешь)))

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