Herman,

A nice explanation of the calculation can be found here (see Method 2
and use the Population variant):

http://www.easycalculation.com/statistics/learn-standard-deviation.php
<http://www.easycalculation.com/statistics/learn-standard-deviation.php>

On my machine, the following implementation ran in about 80% less time
(based on Code Check & Profile) than your original. Plotting both
implementations shows an occasional rounding error at the 5th decimal
place. No need to cap the periods at 25, performance was still
reasonable using periods = DayOfWeek() * 10.


Mike

function xStDev( priceArray, periods ) {
    local deviation;
    local firstBar;
    local lastBar;

    deviation = 0;
    firstBar = Status("firstvisiblebar");
    lastBar = Status("lastvisiblebar");

    periods = max(2, periods);

    for (i = firstBar; i <= lastBar; i++) {
       if (periods[i] <= (i + 1)) {
          sumX = 0;
          sumXSq = 0;

          for (j = periods[i]; j > 0; j--) {
             price = priceArray[(i + 1) - j];
             sumX += price;
             sumXSq += price^2;
          }

          deviation[i] = sqrt((sumXSq - (sumX * sumX / periods[i])) /
periods[i]);
       } else {
          deviation[i] = 0;
       }
    }

    return deviation;
}

periods = DayOfWeek();
Plot(xStDev(Close, periods), "xStDev", colorBlue);



Reply via email to