Use on TickData to calculate Hourly bars. The script will do all the calculations incl removing the outlyers on both sides and will plot the LSD and SLD as lines.
Have fun
inputs: n(20),
accuracy(70),
reward(.63);
variables: ii(0),
ii2(0),
minofmax(999999),
succestrades(0),
failuretrades(0),
mdrr(0),
remove_sd(0),
remove_ld(0),
trigger(0),
counter(0),
result(0),
sesscounter(0),
sessopen(0),
sesshigh(0),
sesslow(0),
ihigh(0),
ilow(0),
lsd(0),
sld(0);
array: raw[50,50](0),
sd[](0),
ld[](999999),
dummysd[](0),
dummyld[](999999);
if currentbar = 1 then begin
condition1 = array_setmaxindex(sd,n);
condition2 = array_setmaxindex(ld,n);
condition3 = array_setmaxindex(dummysd,n);
condition4 = array_setmaxindex(dummyld,n);
end;
if floor(time*.01) <> floor(time[1]*.01) then begin
sesscounter = sesscounter + 1;
raw[1,50] = maxlist( maxlist( ihigh-sessopen, sessopen-ilow ), ( minmove / pricescale ) );
value1 = sort2darray(raw,1,50,1);
sessopen = c;
sesshigh = c;
sesslow = c;
ihigh = c;
ilow = c;
if sesscounter > n+1 then begin
minofmax = 999999;
for ii = 1 to n begin
if raw[ii,1] < minofmax then minofmax = raw[ii,1];
end;
for ii = 1 to n begin
counter = 0;
repeat
counter = counter + 1;
ld[ii] = raw[ii,counter];
sd[ii] = raw[ii,counter+1];
until
sd[ii] < minofmax;
end;
for ii = 1 to n begin
dummysd[ii] = sd[ii];
dummyld[ii] = ld[ii];
end;
succestrades = iff( accuracy < 100, round( (n*accuracy)*.01, 0 ), n );
failuretrades = (n-succestrades);
value1 = sortarray(sd,n,1);
value2 = sortarray(ld,n,-1);
result = -999999;
if failuretrades >= 1 then begin
for ii = 0 to failuretrades begin
remove_sd = ii + 1;
remove_ld = failuretrades - remove_sd + 2;
if ld[remove_ld] - sd[remove_sd] > result then begin
result = ld[remove_ld] - sd[remove_sd];
lsd = sd[remove_sd];
sld = ld[remove_ld];
end;
end;
for ii = 1 to n begin
if dummysd[ii] > lsd or dummyld[ii] < sld then begin
dummysd[ii] = 0;
dummyld[ii] = 999999;
end;
end;
end;
lsd = highestarray(dummysd,n) + ( minmove / pricescale );
sld = lowestarray(dummyld,n);
mdrr = iff(sld-lsd > 0 and lsd <> 0, (sld-lsd)/lsd, 0);
end;
if sesscounter > 1 then
for ii = 50 downto 2 begin
for ii2 = 1 to 50 begin
raw[ii,ii2] = raw[ii-1,ii2];
end;
end;
for ii = 1 to 50 begin
raw[1,ii] = 0;
end;
end;
if c > sesshigh then sesshigh = c;
if c < sesslow then sesslow = c;
if c > ihigh then ihigh = c;
if c < ilow then ilow = c;
if c >= sessopen and c[1] < sessopen then begin
if sessopen-sesslow > raw[1,50] then begin
for ii = 1 to 50 begin
if raw[1,ii] = sessopen-sesslow then trigger = 1;
end;
if trigger = 0 then begin
raw[1,50] = sessopen-sesslow;
value1 = sort2darray(raw,1,50,1);
end;
end;
sesslow = sessopen;
trigger = 0;
end;
if c <= sessopen and c[1] > sessopen then begin
if sesshigh-sessopen > raw[1,50] then begin
for ii = 1 to 50 begin
if raw[1,ii] = sesshigh-sessopen then trigger = 1;
end;
if trigger = 0 then begin
raw[1,50] = sesshigh-sessopen;
value1 = sort2darray(raw,1,50,1);
end;
end;
sesshigh = sessopen;
trigger = 0;
end;
if sesscounter > n+1 then begin
plot1(lsd,"lsd");
plot2(sld,"sld");
end;