Я, наверное, туплю с IndicatorCounted(). Объясните пожалуйста...

 

По поводу функции:

int IndicatorCounted(   )

 Функция возвращает количество баров, не измененных после последнего вызова индикатора. Большинство подсчитанных баров не нуждается в пересчете. Функция используется для оптимизации вычислений.

Вот ход моих мыслей:

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

Домустим имеем 10 баров. На новом тике IndicatorCounted() должен выдать 9.

Значит:

limit = Bars -  IndicatorCounted() = 10-9= [1].  
Тоесть мы в любом случае мы перещитываем последний бар.

Даже, допустим, мы пропустили тики и появился следующий бар. Тогда

limit = Bars -  IndicatorCounted() = 11-10 = [1].  

Вопрос! Зачем тогда условие:

 if(counted_bars>0) counted_bars--; 

Или все же в документации правильно было бы написать, что "Функция возвращает количество баров, присутсвующих при последнем вызове индикатора." Тогда условие операцию counted_bars--; действительно имеет смысл делать.

Что скажете?

 
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
В смысле, что он и так будет пересчитан.... и без counted_bars--;
 
Напишите два условия и отпринтуйте результаты. Первый принт должен показать Вам что вобще возвращает функция IndicatorCounted(), какое число на каждом новом тике? Второй принт пусть вернёт Вам значение IndicatorCounted(), но только в том случае, если пришёл первый тик новой свечи.
 
Чтобы не вспоминать каждый раз, я для себя сделал небольшую шпаргалочку: -
        // индекс начала пересчета
        int counted_bars = IndicatorCounted();
        int indx = Bars - counted_bars - 1;
        
// в первый заход counted_bars = 0, indx = Bars - 1 (номер самого левого БАРа)
// на первом тике нулевого бара counted_bars = Bars - 2, indx = 1 (пересчитаем предпоследний БАР)
// на следующих тиках counted_bars = Bars - 1, indx = 0 (нулевой, он же текущий, БАР)
... и вставляю ее целиком в каждый индикатор.
 

Спасибо отозвавшимся за пример и совет также.

Да уж, действительно, пока сам не пощупаешь, не поймешь.

И вот, что у меня вышло:

А вот здесь я уже посмеялся!))) Но вначале я даже подумал, что нашел ошибку у прораба. Так, что можете в анналы)))

Все оказалось просто: я встроил функции печати в готовый индикатор под кодом:

   if(iCountedBars > 0) iCountedBars--;

Чего изучал, на том и запутался. Поэтому разница на IndicatorCounted() и была 3 и 2 вместо 2 и 1))

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