iMACDOnArray() - ?

 
Кто-нибудь пытался такое сделать? Понятно, что существует тривиальный способ: сначала делаем медленный iMAOnArray() (первый цикл), потом быстрый (второй цикл), вычитаем со сдвигом (третий цикл) и затем сглаживаем (четвертый цикл). Может, есть возможность сделать как-то еще? Только, пожалуйста, не задавайте вопросы, зачем мне это нужно...
 
Другого способа нет. Теоретически можно формулу раздолбать и получить в один проход. Но формула будет сложной. пусть компьютер думает, он железный.
 
Спасибо, Rosh. Формулы на самом деле не должны быть очень сложными, если воспользоваться матричным представлением мувингов.

Тогда у меня еще вопросик в тему. Ни разу еще не пользовался функциями iXXXOnArray(), а вот теперь потребовалось. В помощи к ним идет стандартная фраза:

The indicator is calculated from left to right. To access to the array elements as to a series array (i.e., from right to left), one has to use the ArraySetAsSeries function.

Что это реально означает? Допустим, я не использовал функцию ArraySetAsSeries() и вычисляю EMA. Тогда каким весам будут соответствовать элементы массива с большими индексами - большим или меньшим?

Пример: вычисляю злосчастный iMACDOnArray(). Перед этим сформировал массив синтетической истории _s[] (графический буфер), индексирование которого аналогично историческим массивам. Теперь вычисляю разницу мувингов:

void makeMAdiffArray( double& MAdiff[] )
{
   ArrayResize( MAdiff, Bars );
   for( int i = 0; i < Bars; i++ )
      MAdiff[ i ] = iMAOnArray( _s, Bars, _fastEMA, 0, MODE_EMA, i ) - 
                    iMAOnArray( _s, Bars, _slowEMA, 0, MODE_EMA, i );
   return;
}
Дальше надо сгладить полученный массив и записать его в графический буфер _signal[]:

void MACDArrayOnArray()
{
   double MAdiff[];
   makeMAdiffArray( MAdiff );
   for( int i = 0; i < Bars; i++ )   
      _signal[ i ] = iMAOnArray( MAdiff, Bars, _signalSMA, 0, MODE_SMA, i );
   return;   
}
Так правильно или нет?

P.S. В принципе этот код легко проверяется - если в массив _s[] записать реальные котировки и сравнить _signal[] со стандартным MACD.

P.P.S. Да, все же в первую функцию надо вставить строку

ArraySetAsSeries( MAdiff, true );