Расчёт индикатора

 
Во многих пользовательских индикаторах цикл расчитываетсья от нулевого бара, как например OsMA (Metaquotes)

//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
   for(int i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd additional buffer
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
//---- main loop
   for(i=0; i<limit; i++)
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
//---- done
   return(0);
  }
Я думаю правильней производить расчёт от limit и до нулевого бара или я ошибаюсь ?

// for(i = limit; i >= 0; i--) вместо for(i=0; i<limit; i++)
 
for(int i = limit; i >= 0; i--)
     {   
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MACD_Mode,MACD_PRICE,i)-
                    iMA(NULL,0,SlowEMA,0,MACD_Mode,MACD_PRICE,i);
     }               
   for(i = limit; i >= 0; i--)
     {   
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,Signal_Mode,i);
     }
for(i = limit; i >= 0; i--)
     {   
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
     }
 
Ну так а в чём состоит принципиальная разница то?
При первом проходе просчитываются все бары, а затем только последний как ни переставляй направление пересчёта.
Только вам следовало бы написать for(int i = limit-1; i >= 0; i--), чтобы сохранить правильность границ пересчёта (нумерация баров в MQL4 начинается с 0).
Или у вас имеются какие-то более глубокие мысли на этот счёт?
 
Если индикатор использует свои предыдущие значения для расчета текущего значения, перебор от 0 до limit-а будет некорректен.
 

Это конечно же вполне логично, но только в приведённом случае такие расчёты отсутствуют. Или же я ошибаюсь?

 
solandr:

Это конечно же вполне логично, но только в приведённом случае такие расчёты отсутствуют. Или же я ошибаюсь?

Нет, тут их нет.
Только я все равно не вижу смысла писать код, который может быть ошибочным.
Часто люди пишут индикаторы, копируя куски кода из других (тем более стандартных!) индикаторов.
 
solandr:
Ну так а в чём состоит принципиальная разница то?
При первом проходе просчитываются все бары, а затем только последний как ни переставляй направление пересчёта.
Только вам следовало бы написать for(int i = limit-1; i >= 0; i--), чтобы сохранить правильность границ пересчёта (нумерация баров в MQL4 начинается с 0).
Или у вас имеются какие-то более глубокие мысли на этот счёт?

А зачем ? Последний то пересчитываетсья и предпоследний бар в этом индикаторе пересчитывать не нужно

int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = limit; i >= 0; i--)
     {   
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MACD_Mode,MACD_PRICE,i)-
                    iMA(NULL,0,SlowEMA,0,MACD_Mode,MACD_PRICE,i);
     }               
   for(i = limit; i >= 0; i--)
     {   
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,Signal_Mode,i);
     }
for(i = limit; i >= 0; i--)
     {   
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
     }
   return(0);
  }
Почему я задал этот вопрос, так как не видел логики такого расчёта
Ведь расчитовать логично со сторого бара к новому, хотя результаты те же самые в этом индикаторе
 

Вы видимо просто не разобрались с принципами расчётов индикаторов.
Обратите внимание вот на эти строчки кода:

int counted_bars = IndicatorCounted();
limit = Bars - counted_bars;

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

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

Когда прийдёт новый бар, то limit станет равным 1 и произойдёт один цикл пересчёта нового пришедшего бара. Остальные посчитанные бары пересчитываться при этом не будут! Поэтому для данного случая оба варианта записи цикла одинаковы.

 
solandr:
Ну так а в чём состоит принципиальная разница то?
При первом проходе просчитываются все бары, а затем только последний как ни переставляй направление пересчёта.
Только вам следовало бы написать for(int i = limit-1; i >= 0; i--), чтобы сохранить правильность границ пересчёта (нумерация баров в MQL4 начинается с 0).
Или у вас имеются какие-то более глубокие мысли на этот счёт?
Вы не обратили внимание на
 counted_bars--;
Причина обращения: