/***************************************
Provided By : eSignal (c) Copyright 2006
Description:  Harnessing The (Mis)Behavior Of Markets
              by Rick Martinelli

Version 1.0  04/06/2006

Notes:
* June 2006 Issue of Stocks and Commodities Magazine
* Study requires version 7.9.1 or higher.


Formula Parameters:                 Defaults:
Standard Deviation Periods          7
Mean Periods                        21
***************************************/


function preMain() {
    setStudyTitle("Brownian Motion ");
    setCursorLabelName("Normalized W", 0);
    setCursorLabelName("White Noise", 1);
    setDefaultBarThickness(4, 0);
    setDefaultBarThickness(2, 1);
    setDefaultBarFgColor(Color.navy, 0);
    setDefaultBarFgColor(Color.red, 1);
    setPlotType(PLOTTYPE_HISTOGRAM, 0);
    setPlotType(PLOTTYPE_HISTOGRAM, 1);
    
    addBand(8, PS_SOLID, 2, Color.maroon, 8);
    addBand(6, PS_SOLID, 2, Color.maroon, 6);
    addBand(4, PS_SOLID, 2, Color.maroon, 4);
    addBand(2, PS_SOLID, 2, Color.maroon, 2);
    addBand(0, PS_SOLID, 2, Color.maroon, 0);
    addBand(-2, PS_SOLID, 2, Color.maroon, -2);
    addBand(-4, PS_SOLID, 2, Color.maroon, -4);
    addBand(-6, PS_SOLID, 2, Color.maroon, -6);
    addBand(-8, PS_SOLID, 2, Color.maroon, -8);

    var fp1 = new FunctionParameter("nStdev", FunctionParameter.NUMBER);
        fp1.setName("Standard Deviation Periods");
        fp1.setLowerLimit(1);
        fp1.setDefault(7);

    var fp2 = new FunctionParameter("nMean", FunctionParameter.NUMBER);
        fp2.setName("Mean Periods");
        fp2.setLowerLimit(1);
        fp2.setDefault(21);
}

var bVersion = null;
var bInit = false;
var xW = null;
var xW_mean  = null;
var xW_stdev = null;

function main(nStdev, nMean) {    
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;    

    if (getCurrentBarCount() <= Math.max(nStdev, nMean)) return null;
    
    if (bInit == false) {
        xW = efsInternal("calcW");
        xW_mean = sma(nMean, xW);
        xW_stdev = efsInternal("calcStdev", xW, nStdev);
        bInit = true;
    }
    
    var nNormP = xW.getValue(0);
    var nWhiteNoise = (xW.getValue(0) - xW_mean.getValue(0)) / xW_stdev.getValue(0);
    
    return new Array(nNormP, nWhiteNoise);
}


function calcW() {
    return (close(0) - close(-1));
}


function calcStdev(xSrc, n) {
    var sumX = 0;
    var sumX2 = 0;

    if (xSrc.getValue(-n) == null) return;
    
    for (i = 0; i < n; ++i) {
        sumX += xSrc.getValue(-i);
        sumX2 += (xSrc.getValue(-i) * xSrc.getValue(-i))
    }
    var meanX = (sumX/n);
    var stdev = Math.sqrt((sumX2/n) - (meanX*meanX));

    return stdev;
}


function verify() {
    var b = false;
    if (getBuildNumber() < 730) {
        drawTextAbsolute(5, 35, "This study requires version 7.9.1 or later.", 
            Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
            null, 13, "error");
        drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp", 
            Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
            null, 13, "upgrade");
        return b;
    } else {
        b = true;
    }
    
    return b;
}