Linear Regression Envelope
Works on TS and Multicharts
Quite useful for spotting channels automatically without the need to draw the lines manually.
Code attached:
inputs:
Length( 100),
EndDate_YYMMDD( 0), { 0 or YYMMDD, constant; if EndDate_YYMMDD = 0,
EndTime_HHMM ignored and last bar on chart used }
EndTime_HHMM( 0), { 0 or HHMM, constant; EndTime_HHMM ignored if 0 }
ExtRight(true) ,
Linewidth(0),
Linestyle(3),
NumDevs(2);
variables:
EndDate( iff( EndDate_YYMMDD < 500000, EndDate_YYMMDD + 1000000,
EndDate_YYMMDD ) ),
LRV( 0 ),
LRVAgo( 0 ),
TLLRV( 0 ),
TLLRVHI(0),
TLLRVLO(0),
StdErrEnv(0),
CumStdErr(0),
AvgStdErr(0),
EnvWidth(0),
Flag( 0 ) ;
StdErrEnv=NumDevs*StdError(C,Length);
CumStdErr=CumStdErr + StdErrEnv;
AvgStdErr=CumStdErr/Barnumber;
if Flag = 0 then
{ Insert a lin reg line for the first time and set it's color and extents }
begin
if EndDate = 1000000 and LastBarOnChart then
begin
LRV = LinearRegValue( C, Length, 0 ) ;
LRVAgo = LinearRegValue( C, Length, Length - 1 ) ;
TLLRV = TL_New( Date[ Length - 1 ], Time[ Length - 1 ], LRVAgo, Date, Time, LRV ) ;
TLLRVHI = TL_New(Date[Length - 1], Time[Length-1],LRVAgo+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr),Date,Time,LRV+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr));
TLLRVLO = TL_New(Date[Length - 1], Time[Length-1],LRVAgo-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr),Date,Time,LRV-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr));
Flag = 1 ;
end
else if Date = EndDate and ( Time = EndTime_HHMM or EndTime_HHMM = 0 ) then
begin
LRV = LinearRegValue( C, Length, 0 ) ;
LRVAgo = LinearRegValue( C, Length, Length - 1 ) ;
TLLRV = TL_New( Date[ Length - 1 ], Time[ Length - 1 ], LRVAgo, Date, Time, LRV ) ;
TLLRVHI = TL_New(Date[Length - 1], Time[Length-1],LRVAgo+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr),Date,Time,LRV+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr));
TLLRVLO = TL_New(Date[Length - 1], Time[Length-1],LRVAgo-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr),Date,Time,LRV-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr));
Flag = 2 ;
end ;
if Flag = 1 or Flag = 2 then
begin
if Length <= 50 then TL_SetColor( TLLRV, Red ) ;
if Length > 50 and Length <=100 then TL_SetColor( TLLRV, Green);
if Length > 100 and Length <=200 then TL_SetColor(TLLRV, Cyan);
if Length > 200 and Length <=400 then TL_SetColor(TLLRV, BLUE);
if Length > 400 and Length <=800 then TL_SetColor(TLLRV, Yellow);
if Length > 800 then TL_SetColor(TLLRV, White);
TL_SetColor( TLLRVHI, Green );
TL_SetColor( TLLRVLO, Red );
TL_SetSize(TLLRV, Linewidth);
TL_SetSize(TLLRVHI, Linewidth);
TL_SetSize(TLLRVLO, Linewidth);
TL_SetStyle(TLLRVHI, Linestyle);
TL_SetStyle(TLLRVLO, Linestyle);
TL_SetExtLeft( TLLRV, false ) ;
TL_SetExtLeft( TLLRVHI, false );
TL_SetExtLeft( TLLRVLO, false );
if ExtRight then
begin
TL_SetExtRight( TLLRV, true );
TL_SetExtRight( TLLRVHI, true );
TL_SetExtRight( TLLRVLO, true );
end
else begin
TL_SetExtRight( TLLRV, false ) ;
TL_SetExtRight( TLLRVHI, false ) ;
TL_SetExtRight( TLLRVLO, false ) ;
end;
end;
end
else if Flag = 1 then
{ Reset the end-points of the flag-1 LRLine at each new bar after it has been drawn
for the first time; this effectively results in a new LRLine each time. }
begin
LRV = LinearRegValue( C, Length, 0 ) ;
LRVAgo = LinearRegValue( C, Length, Length - 1 ) ;
TL_SetBegin( TLLRV, Date[ Length - 1 ], Time[ Length - 1 ], LRVAgo ) ;
TL_SetBegin( TLLRVHI, Date[ Length - 1 ], Time[ Length - 1 ], LRVAgo+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr) ) ;
TL_SetBegin( TLLRVLO, Date[ Length - 1 ], Time[ Length - 1 ], LRVAgo-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr) ) ;
TL_SetEnd( TLLRV, Date, Time, LRV ) ;
TL_SetEnd( TLLRVHI, Date, Time, LRV+IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr) ) ;
TL_SetEnd( TLLRVLO, Date, Time, LRV-IFF(StdErrEnv<AvgStdErr,StdErrEnv,AvgStdErr) ) ;
end ;
Screenshot of the ulitity attached
Anek