/***************************************
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("Trading System ");
    setCursorLabelName("Fortune", 0);
    setDefaultBarThickness(2, 0);
    setDefaultBarFgColor(Color.navy, 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;
var xA_factor   = null;
var nSum        = 0;

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

    if (bInit == false) {
        xW = efsInternal("calcW");
        xDeltaP = efsInternal("calcDeltaP", xW);
        xSigma = efsInternal("calcStdev", xW, 7);
        xAlpha = efsInternal("calcAlpha", xDeltaP, xSigma);
        xA_factor = efsInternal("calcA_factor", xAlpha, nCutoff);
        addBand(0, PS_SOLID, 2, Color.magenta, 0);
        bInit = true;
    }
    
    var nState = getBarState();
    var nP_1  = close(-1);
    var nFortune = 0;
    var nA_factor_1 = xA_factor.getValue(-1);
    var nA_factor_2 = xA_factor.getValue(-2);
    if (nP_1 == null || nA_factor_2 == null ||
        xSigma.getValue(0) == null || xAlpha.getValue(0) == null) return 0;
    
    if (nState == BARSTATE_NEWBAR) {
        nSum += (nA_factor_2 * xW.getValue(-1));
    }
    
    if (nSum != 0) {
        nFortune = ((nSum + (nA_factor_1 * xW.getValue(0))) / nP_1);  
    }
    
    return nFortune;
}


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 calcA_factor(xSrc, C) {
    var nA = 0;
    
    if (xSrc.getValue(0) > C) nA = 1;
    else if (xSrc.getValue(0) < -C) nA = -1;
    
    return nA;
}


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