[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

regression channels



PureBytes Links

Trading Reference Links

The following works great in TS4 (the author is no longer at
the address listed)... but does not work in TS2000. Anybody
have a clue as to what modifications are needed?

TIA... GH


{Function pnt2line :}

input: x1(numericsimple), y1(numericsimple),
          x2(numericsimple), y2(numericsimple),
          x(numericsimple),   y(numericsimple);

{ returns the distance from (x,y) to the line formed by (x1,y1) (x2, y2) }

var: qq(0), m1(0), m2(0);

if x-x2 <> 0 then begin
	m1 = (y1-y2) / (x1-x2);
	m2 = (y-y2) / (x-x2);
	qq = SquareRoot(Square(y-y2)+Square(x-x2));
	value1 = qq * sine( arctangent( (m2-m1) / (1 + m1*m2)));
end else
	value1 = 0;

pnt2line = value1;
======================================================================
{indicator- Linear Regression}

input:  price(c), labTL("R"), colorTL(tool_yellow), thickTL(0);

{ ======================================
This is my implementation of Linear Regression Channels. You are welcome to 
use this code freely.  You may redistribute it provided you include this 
comment block, plus a description of any changes you make.

If you extend it, or adapt it to other uses, I'd appreciate a look at what 
you've done.  Thanks.

     Gregory Wood
     SwissFranc@xxxxxxxxxxxxxxxx

01/26/97 v1.0 - Initial distribution
========================================}

{
USAGE

Use the text tool to indicate the beginning and end of the channel(s) you 
want.  The default uses "R"s (upper case, no quotes). Then to show the 
channel(s), go to Format Analysis Techniques, select this indicator, and 
press the "Status" button two times (this is not a double-click, really 
press it two times).

The channel is based on Price, which defaults to Close, but you can change 
it to High or Low.

You can set the color and thickness of the channels.

You can show a series of channels by putting more "R"s on the chart.  Each 
pair of "R"s will get its own channel.

If you want separate channels or different colors, you can add the indicator 
multiple times. Be sure to give each one a different labTL value.

}

array: dd[20](0),tt[20](0),vv[20](0),bb[20](0);
var: iMax(20), ix(0), hh(0), ll(0), hhbb(0), llbb(0);
var: pvv1(0), pbb1(0), pvv2(0), pbb2(0), x1(0), x2(0), y1(0), y2(0);
var: ii(0), jj(0), kk(0), hval(0), lval(0);
var: handl(0);

if currentbar = 1 then begin { examine all the text strings and save some 
info about the ones we recognize }
   handl = text_getfirst(2);
   while handl > 0 begin
      if text_getstring(handl) = labTL then begin { save the item's date, 
time, value and handle }
            if ix < iMax - 1 then begin
                tt[ix] = text_gettime(handl);
                dd[ix] = text_getdate(handl);
                vv[ix] = text_getvalue(handl);
                ix = ix + 1;
           end;
      end;
      handl = text_getnext(handl,2); { IMPORTANT -- infinite loop if this is 
missing!  }
   end;
end;

for ii = 0 to ix - 1 begin { check each point }
   if time = tt[ii] and date = dd[ii] then begin { we've found a selected 
point }
      bb[ii] = currentbar; { remember where we found it }
      plot1(price,""); { show the user which point we used for the 
calculations }
      if ii > 0 then begin { need at least 1 point }
         { The regression line passes through (x1,y1) and (x2,y2) }
         x1 = bb[ii];
         x2 = bb[ii-1];
         y1 = LinearRegValue(price, x1-x2 ,0);
         y2 = LinearRegValue(price, x1-x2, x1-x2);

         { Draw the regression line }
         handl = TL_New(date[currentbar-x2],time[currentbar-x2],y2, 
date[currentbar-x1],time[currentbar-x1],y1 );
         TL_SetExtRight(handl, true);
         TL_SetExtLeft(handl, false);
         TL_SetSize(handl, thickTL);
         TL_SetColor(handl, colorTL);

         { find the max excursion on each side of the line }
         hval = 0;
         lval = 0;
         for kk = x2 to x1 begin
             value1 = pnt2line(x1,y1,x2,y2, barnumber[currentbar-kk], 
high[currentbar-kk]);
             if value1 > 0 and hval < value1 then begin
                hval = value1;
                hh = h[currentbar-kk];
                hhbb = kk;
             end;
             value2 = pnt2line(x1,y1,x2,y2, barnumber[currentbar-kk], 
low[currentbar-kk]);
             if value2 < 0 and lval > value2 then begin
                lval = value2;
                ll = l[currentbar-kk];
                llbb = kk;
             end;
         end;

         { Now draw the channel lines }
         plot2[currentbar-hhbb](hh,"");
         pvv1 = TLValue(ll,llbb, ll-(y2-y1), llbb-(x2-x1), x1);
         pvv2 = TLValue(ll,llbb, ll-(y2-y1), llbb-(x2-x1), x2);
         handl = TL_New(date[currentbar-x2],time[currentbar-x2],pvv2, 
date[currentbar-x1], time[currentbar-x1],pvv1);
         TL_SetExtRight(handl, true);
         TL_SetExtLeft(handl, false);
         TL_SetSize(handl, thickTL);
         TL_SetColor(handl, colorTL);

         plot3[currentbar-llbb](ll,"");
         pvv1 = TLValue(hh,hhbb, hh-(y2-y1), hhbb-(x2-x1), x1);
         pvv2 = TLValue(hh,hhbb, hh-(y2-y1), hhbb-(x2-x1), x2);
         handl = TL_New(date[currentbar-x2],time[currentbar-x2],pvv2, 
date[currentbar-x1], time[currentbar-x1],pvv1);
         TL_SetExtRight(handl, true);
         TL_SetExtLeft(handl, false);
         TL_SetSize(handl, thickTL);
         TL_SetColor(handl, colorTL);

      end;
   end;
end;