/***************************************
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:
Alpha Cutoff                        1
***************************************/


function preMain() {
    setStudyTitle("Win/Loss Ratio ");
    setCursorLabelName("W/L", 0);
    setDefaultBarThickness(3, 0);
    setDefaultBarFgColor(Color.navy, 0);
    setPlotType(PLOTTYPE_HISTOGRAM, 0);
    
    var fp1 = new FunctionParameter("nCutoff", FunctionParameter.NUMBER);
        fp1.setName("Alpha Cutoff");
        fp1.setLowerLimit(0);
        fp1.setDefault(1);
}

var bVersion    = null;
var bInit       = false;
var xW          = null;
var xSigma      = null;
var xDeltaP     = null;
var xAlpha      = null;

function main(nCutoff) {    
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;    

    if (bInit == false) {
        xW = efsInternal("calcW");
        xSigma = efsInternal("calcStdev", xW, 7);
        xDeltaP = efsInternal("calcDeltaP", xW);
        xAlpha = efsInternal("calcAlpha", xDeltaP, xSigma);
        addBand(0, PS_SOLID, 2, Color.magenta, 0);
        bInit = true;
    }
    
    var nState = getBarState();
    var nWL = 0;
    
    if (xAlpha.getValue(-2) == null) return 0;
    
    // Trading $ accumulation
    if (nState == BARSTATE_NEWBAR) {
        if (xAlpha.getValue(-2) > nCutoff) {         // long signal
            nWL = (close(-1) - close(-2)) / close(-2);
        } else if (xAlpha.getValue(-2) < -nCutoff) {  // short signal
            nWL  = (close(-2) - close(-1)) / close(-2);
        }
    }
    
    return nWL;
}


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 calcDeltaP(xSrc) {
    return ((xSrc.getValue(0) + xSrc.getValue(-1)) + sma(3, 0)) - close(0);
}


function calcAlpha(xSrc1, xSrc2) {
    return xSrc1.getValue(0) / xSrc2.getValue(0);
}


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;
}