Вычисление StdDev

[Удален]  

Не получается сделать вычисление StdDev, чтобы совпало с iStdDev. В коде что-то неправильно?

   ArraySetAsSeries(FilterBuffer,true);
//............... 
   if (UseMTBands) 
   { 
     UpperBuffer[i] = iBandsOnArray(FilterBuffer,0,BandsPeriod,BandsDeviations,0,MODE_UPPER,i); 
     LowerBuffer[i] = iBandsOnArray(FilterBuffer,0,BandsPeriod,BandsDeviations,0,MODE_LOWER,i); 
   } 
   else 
   { 
     if (UseMTSMA) 
       center = iMAOnArray(FilterBuffer,0,BandsPeriod,0,MODE_SMA,i); 
     else 
       center = MySMA(FilterBuffer,BandsPeriod,i); 
     if (UseMTStdDev) 
       StdDev = iStdDevOnArray(FilterBuffer,0,BandsPeriod,0,MODE_SMA,i); 
     else 
       StdDev = MyStdDev(FilterBuffer,BandsPeriod,i); 
     UpperBuffer[i] = center + BandsDeviations * StdDev; 
     LowerBuffer[i] = center - BandsDeviations * StdDev; 
   }
//................. 
// Calculation StdDev -----------------------------------------------| 
// StdDev = SQRT (SUM [(S(i) - SMA(i))^2, N] / N)                 | 
double MyStdDev(double &array[], int BandsPeriod, int Index) 
{ 
double ds, sum, center; 
    
  sum = 0; 
  for(int i = 0; i < BandsPeriod; i++) 
  { 
    if (UseMTSMA) 
      center = iMAOnArray(array,0,BandsPeriod,0,MODE_SMA,Index+i); 
    else 
      center = MySMA(array,BandsPeriod,Index+i); 
    ds = array[Index+i] - center; 
    sum += ds * ds; 
  } 
  sum = MathSqrt (sum / BandsPeriod); 
  return (sum); 
} 
// Calculation SMA --------------------------------------------------| 
// SMA = SUM (S(i), N) / N                                      | 
double MySMA(double &array[], int MAPeriod, int Index) 
{ 
  double SMA = 0; 
  for(int i = 0; i < MAPeriod; i++) 
    SMA += array[Index+i]; 
  SMA = SMA / MAPeriod; 
  return (SMA); 
}
 

Убедитесь, что расчёт идёт слева направо. Если массив имеет атрибут AsSeries, то возрастающая индексация обеспечивает обратный проход, то есть, справа налево.

Смотрите наш пользовательский индикатор стандартного отклонения 'Standard Deviation, StdDev'

[Удален]  

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

Исправленный код:

// Calculation StdDev -----------------------------------------------| 
// StdDev = SQRT (SUM [(S(i) - SMA(i))^2, N] / N)                    | 
double MyStdDev(double &array[], int BandsPeriod, int Index) 
{ 
double ds, sum, center; 
    
  sum = 0; 
  if (UseMTSMA) 
    center = iMAOnArray(array,0,BandsPeriod,0,MODE_SMA,Index); 
  else 
    center = MySMA(array,BandsPeriod,Index); 
  for(int i = 0; i < BandsPeriod; i++) 
  { 
    ds = array[Index+i] - center; 
    sum += ds * ds; 
  } 
  sum = MathSqrt (sum / BandsPeriod); 
  return (sum); 
}