Linear-Square Regression Channel

ICE Data Services -

LinearSquareRegrChannel.efs  
EFSLibrary - Discussion Board  

File Name: LinearSquareRegrChannel.efs

Description:
Linear-Square Regression Channel

Formula Parameters:

  • Degree : 1
  • kstd : 2
  • Bars : 48
  • Shift : 0
  • Line Color 1 : Green
  • Line Color 2 : Green
  • Line Color 3 : Red
  • Line Color 4 : Red

Notes:

Download File:
LinearSquareRegrChannel.efs




EFS Code:

/*********************************
Provided By:  
    eSignal (Copyright c eSignal), a division of Interactive Data 
    Corporation. 2009. All rights reserved. This sample eSignal 
    Formula Script (EFS) is for educational purposes only and may be 
    modified and saved under a new file name.  eSignal is not responsible
    for the functionality once modified.  eSignal reserves the right 
    to modify and overwrite this EFS file with each new release.

Description:        
    Linear-Square Regression Channel
    
Version:            1.0  06/23/2009
 
Formula Parameters:                     Default:
    Degree                              1
    kstd                                2
    Bars                                48
    Shift                               0
    Line Color 1                        Green
    Line Color 2                        Green
    Line Color 3                        Red
    Line Color 4                        Red
    
Notes:
    
**********************************/
var fpArray = new Array();
var bInit = false;
function preMain() {
    setPriceStudy(true);
    setShowCursorLabel(false);
    setShowTitleParameters(false);
    setStudyTitle("Linear-Square Regression Channel");
    var x = 0;
    fpArray[x] = new FunctionParameter("Degree", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(0);
        setUpperLimit(10);
        setDefault(1);
    }
    fpArray[x] = new FunctionParameter("kstd", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(2);
    }
    fpArray[x] = new FunctionParameter("Bars", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(48);
    }
    fpArray[x] = new FunctionParameter("Shift", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(0);
        setDefault(0);
    }
    fpArray[x] = new FunctionParameter("Line1", FunctionParameter.COLOR);
    with(fpArray[x++]) {
        setName("Line Color 1");
        setDefault(Color.green);
    }
    fpArray[x] = new FunctionParameter("Line2", FunctionParameter.COLOR);
    with(fpArray[x++]) {
        setName("Line Color 2");
        setDefault(Color.green);
    }
    fpArray[x] = new FunctionParameter("Line3", FunctionParameter.COLOR);
    with(fpArray[x++]) {
        setName("Line Color 3");
        setDefault(Color.red);
    }
    fpArray[x] = new FunctionParameter("Line4", FunctionParameter.COLOR);
    with(fpArray[x++]) {
        setName("Line Color 4");
        setDefault(Color.red);
    }
}
var fxl = new Array();
var fxh = new Array();
var sql = new Array();
var sqh = new Array();
var ai = new Array();
    ai[0] = new Array();
    ai[1] = new Array();
    ai[2] = new Array();
    ai[3] = new Array();
    ai[4] = new Array();
    ai[5] = new Array();
    ai[6] = new Array();
    ai[7] = new Array();
    ai[8] = new Array();
    ai[9] = new Array();
    ai[10] = new Array();
    ai[11] = new Array();
var b = new Array();
var c = new Array();
var x = new Array();
var y = new Array();
var sx = new Array();
var xHigh = null;
var xLow = null;

function main(Degree, kstd, Bars, Shift, Line1, Line2, Line3, Line4) {
var nBarState = getBarState();
var i0 = 0;
var sum, suml, sumh;
var ip, p, n, f;
var qq, mm, tt;
var ii, jj, kk, ll, nn;
var mi = 0;
    if (nBarState == BARSTATE_ALLBARS) {
        if (Degree == null) Degree = 1;
        if (kstd == null) kstd = 2;
        if (Bars == null) Bars = 48;
        if (Shift == null) Shift = 0;
        if (Line1 == null) Line1 = Color.green;
        if (Line2 == null) Line2 = Color.green;
        if (Line3 == null) Line3 = Color.red;
        if (Line4 == null) Line4 = Color.red;
    }
    if (bInit == false) {
        xHigh = high();
        xLow = low();
        bInit = true;
    }
    if (Degree > 10) return;
    var ip = Bars;
    var p = ip;
    sx[1] = p + 1;
    nn = Degree + 1;
    for (mi = 1; mi <= nn * 2 - 2; mi++) {
        sum = 0;
        for (n = i0; n <= i0 + p; n++) {
            sum += Math.pow(n, mi);
        }
        sx[mi + 1] = sum;
    }
    for (mi = 1; mi <= nn; mi++) {
        suml = 0.00000;
        sumh = 0.00000;
        for (n = i0; n <= i0 + p; n++) {
            if (mi == 1) {
                suml += xLow.getValue( - n);
                sumh += xHigh.getValue( - n);
            } else {
                suml += xLow.getValue( - n) * Math.pow(n, mi - 1);
                sumh += xHigh.getValue( - n) * Math.pow(n, mi - 1);
            }
        }
        b[mi] = suml;
        c[mi] = sumh;
    }
    for (jj = 1; jj <= nn; jj++) {
        for (ii = 1; ii <= nn; ii++) {
            kk = ii + jj - 1;
            ai[ii][jj] = sx[kk];
        }
    }
    for (kk = 1; kk <= nn - 1; kk++) {
        ll = 0;
        mm = 0;
        for (ii = kk; ii <= nn; ii++) {
            if (Math.abs(ai[ii][kk]) > mm) {
                mm = Math.abs(ai[ii][kk]);
                ll = ii;
            }
        }
        if (ll == 0) return (0);
        if (ll != kk) {
            for (jj = 1; jj <= nn; jj++) {
                tt = ai[kk][jj];
                ai[kk][jj] = ai[ll][jj];
                ai[ll][jj] = tt;
            }
            tt = b[kk];
            b[kk] = b[ll];
            b[ll] = tt;
            tt = c[kk];
            c[kk] = c[ll];
            c[ll] = tt;
        }
        for (ii = kk + 1; ii <= nn; ii++) {
            qq = ai[ii][kk] / ai[kk][kk];
            for (jj = 1; jj <= nn; jj++) {
                if (jj == kk) {
                    ai[ii][jj] = 0;
                } else {
                    ai[ii][jj] = ai[ii][jj] - qq * ai[kk][jj];
                }
            }
            b[ii] = b[ii] - qq * b[kk];
            c[ii] = c[ii] - qq * c[kk];
        }
    }
    x[nn] = b[nn] / ai[nn][nn];
    y[nn] = c[nn] / ai[nn][nn];
    for (ii = nn - 1; ii >= 1; ii--) {
        mm = 0;
        tt = 0;
        for (jj = 1; jj <= nn - ii; jj++) {
            mm = mm + ai[ii][ii + jj] * x[ii + jj];
            x[ii] = (1 / ai[ii][ii]) * (b[ii] - mm);
            tt = tt + ai[ii][ii + jj] * y[ii + jj];
            y[ii] = (1 / ai[ii][ii]) * (c[ii] - tt);
        }
    }
    for (n = i0; n <= i0 + p; n++) {
        suml = 0;
        sumh = 0;
        for (kk = 1; kk <= Degree; kk++) {
            suml += x[kk + 1] * Math.pow(n, kk);
            sumh += y[kk + 1] * Math.pow(n, kk);
        }
        fxl[n] = x[1] + suml;
        fxh[n] = y[1] + sumh;
    }
    suml = 0;
    sumh = 0;
    for (n = i0; n <= i0 + p; n++) {
        suml += Math.pow(xLow.getValue( - n) - fxl[n], 2);
        sumh += Math.pow(xHigh.getValue( - n) - fxh[n], 2);
    }
    suml = Math.sqrt(suml / (p + 1)) * kstd;
    sumh = Math.sqrt(sumh / (p + 1)) * kstd;
    for (n = i0; n <= i0 + p; n++) {
        sqh[n] = fxh[n] + sumh;
        sql[n] = fxl[n] - suml;
        if (n > 0) {
            drawLineRelative( - n + Shift, sqh[n], -n + Shift + 1, sqh[n - 1], PS_SOLID, 2, Line1, "Line1" + n);
            drawLineRelative( - n + Shift, sql[n], -n + Shift + 1, sql[n - 1], PS_SOLID, 2, Line2, "Line2" + n);
            drawLineRelative( - n + Shift, fxh[n], -n + Shift + 1, fxh[n - 1], PS_SOLID, 2, Line3, "Line3" + n);
            drawLineRelative( - n + Shift, fxl[n], -n + Shift + 1, fxl[n - 1], PS_SOLID, 2, Line4, "Line4" + n);
        }
    }
    return;
}