LinearRegressionCalc.efs

ICE Data Services -

LinearRegressionCalc.efs    

File Name: LinearRegressionCalc.efs

Description:
Example formula for demonstrating the Linear Regression calculations.

Formula Parameters:

  • nLength: 10

Notes:
The green circles highlight the price series the regression line is based on for visual reference.

Download File:
LinearRegressionCalc.efs


EFS Code:

/*****************************************************************
Provided By : eSignal. (c) Copyright 2004
*****************************************************************/

function preMain() {
    setPriceStudy(true);
    setStudyTitle("Linear Regression ");
    setShowCursorLabel(false);
    
}

var aY = null;
var c = null;

function main(nLength) {
    var nState = getBarState();
    var nIndex = getCurrentBarIndex();
    var i = 0;
    
    if (nLength == null) nLength = 10;
    if (aY == null) aY = new Array(nLength);
    
    if (nState == BARSTATE_NEWBAR && c != null) {
        aY.pop();
        aY.unshift(c);
    }
    
    c = close();
    aY[0] = c;

    
    if (nState == BARSTATE_NEWBAR) {
        if (aY[nLength-1] != null) {
            i = 1;
            for (i = 1; i < nLength; ++i) {
                drawShapeRelative(-i, aY[i], Shape.CIRCLE, null, Color.lime, null, "dot"+i);
            }
        }
    }
    if (aY[0] != null) {
        drawShapeRelative(0, aY[0], Shape.CIRCLE, null, Color.lime, null, "dot0");
    }
    
    // y = Ax + B;
    // A = SUM( (x-xAVG)*(y-yAVG) ) / SUM( (x-xAVG)^2 )
    // A = slope
    // B = yAVG - (A*xAVG);
    
    if (aY[nLength-1] != null) {
        var xSum = 0;
        var ySum = 0;
        i = 0;
        for (i = 0; i < nLength; ++i) {
            xSum += i;
            ySum += aY[i];
        }
        var xAvg = xSum/nLength;
        var yAvg = ySum/nLength;
        var aSum1 = 0;
        var aSum2 = 0;
        i = 0;
        for (i = 0; i < nLength; ++i) {
            aSum1 += (i-xAvg) * (aY[i]-yAvg); 
            aSum2 += (i-xAvg)*(i-xAvg);
        }
        var A = (aSum1 / aSum2);
        var B = yAvg - (A*xAvg);
        //debugPrintln(nIndex + "  Slope: " + -A.toFixed(4) + "  Y-intercept: " + B.toFixed(4));
        drawLineRelative(0, B, -(nLength-1), (A*(nLength-1)) + B, PS_SOLID, 2, Color.red, "reg");
    }
    
    return;
}