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