Предлагаю изменить код примера для IndicatorCounted() в справке...

 

Предлагаю изменить код примера приведенного в справке для функции IndicatorCounted():

int start()
    {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
       {
        //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
        ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
       }
  //----
     return(0);
    }

поменять на:

int start()
    {
     int limit;
     int counted_bars=IndicatorCounted();
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<=limit; i++)
       {
        //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
        ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
       }
  //----
     return(0);
    }

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

Спасибо

 
i не должно быть равно Bars
 

Ну да, конечно, для первого запуска индикатора IndicatorCounted() = 0.

Но тогда просто ставим знак меньше:

int start()
    {
     int limit;
     int counted_bars=IndicatorCounted();
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
       {
        //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
        ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
       }
  //----
     return(0);
    }

Ведь функция IndicatorCounted() возвращает реально посчитанное количество баров минус один. Т.е. если пришел первый тик нового бара, то при Bars=100, IndicatorCounted() должен выдать 98 !

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

Зачем тогда строка уменьшения значения counted_bars в примере из справки?

Или же, все-таки, я не верно понимаю фразу - "...функция IndicatorCounted() возвращает реально посчитанное количество баров минус один..." в справке по этой функции?

Спасибо.

 

Проверил работу IndicatorCounted(), вроде все правильно работает.

Никак не пойму зачем его значение в примере уменьшать на единицу, если оно и так уже уменьшено на единицу.

Строки кода из примера:

//---- последний подсчитанный бар должен быть пересчитан
   if(counted_bars > 0) counted_bars--;

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

Какие-то подводные камни есть ?

 
autoforex:

Проверил работу IndicatorCounted(), вроде все правильно работает.

Никак не пойму зачем его значение в примере уменьшать на единицу, если оно и так уже уменьшено на единицу.

Какие-то подводные камни есть ?


Я деталей не помню, но кажется возникал какой-то нюанс в момент открытия нового бара. Как средство борьбы (не помню с чем :) задаётся постоянный пересчёт значения индикатора на предпоследнем баре.
 
lna01:
autoforex:

Проверил работу IndicatorCounted(), вроде все правильно работает.

Никак не пойму зачем его значение в примере уменьшать на единицу, если оно и так уже уменьшено на единицу.

Какие-то подводные камни есть ?


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


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

Еще раз, пожалуйста перечитайте мое предыдущее сообщение.

Спасибо.

 
autoforex:


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

Еще раз, пожалуйста перечитайте мое предыдущее сообщение.

Спасибо.


Сам то я практически отказался от использования IndicatorCounted() :). Возможно действительно с тех пор функция была модифицирована, а хелп изменить позабыли. Надо спросить Print, он должен знать :)
 
lna01:
autoforex:


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

Еще раз, пожалуйста перечитайте мое предыдущее сообщение.

Спасибо.


Сам то я практически отказался от использования IndicatorCounted() :). Возможно действительно с тех пор функция была модифицирована, а хелп изменить позабыли. Надо спросить Print, он должен знать :)

Print я спрашивал, он говорит, что описание в справке верно, а вот код примера, нет.
 

Ну все, разобрался. Проще разбираться, когда есть поток котировок, а не как в выходные дни.

Вобщем IndicatorCounted() выдает число неизмененных баров. Оно равно Bars-1, если новый тик продолжает изменять нулевой бар.

Если с приходом нового тика появляется новый бар, то значение IndicatorCounted() дополнительно уменьшается на единицу и равно Bars-2, тем самым заставляя пересчитать нулевой и первый бары, чтобы избежать проблему пропуска тика, описанную в справке.

Во всех других случаях IndicatorCounted() равно 0, заставляя пересчитывать весь индикатор.

Поэтому уменьшать дополнительно значение возвращаемое данной функцией не нужно!

Так что изменить код примера все-таки нужно, да и описание самой функции надо бы подкорректировать, чтобы оно стало более понятным.

Спасибо.

С Уважением

Павел.

 
autoforex:

Ну да, конечно, для первого запуска индикатора IndicatorCounted() = 0.


Совершенно неверно. На первом запуске IndicatorCounted() == Bars
 
Itso:
autoforex:

Ну да, конечно, для первого запуска индикатора IndicatorCounted() = 0.


Совершенно неверно. На первом запуске IndicatorCounted() == Bars


Вы уверены? :)

IndicatorCounted() никогда не равняется Bars.

А при первом запуске и при докачке истории и в других случаях IndicatorCounted() = 0

При появлении нового бара (на первом тике) IndicatorCounted() = Bars-2

С приходом нового тика, но неизменном количестве баров IndicatorCounted() = Bars - 1;

Других значений я не видел.

Спасибо.

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