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

Re: market Profile



PureBytes Links

Trading Reference Links

= = = Original message = = =

From: PM <pablomejia@xxxxxxxxx>
Subject: market Profile Hey gang, Does anyone have an good mp indicator they would care to share or
perhaps know of one that is for sale? thanks, Pablo
Greetings Pablo (and all),

I would be pleased to accept a PayPal donation, should you (or anyone) be so inclined. I don't know the author:

{----- start EasyLanguage Indicator -----}

input:compress(5),len(30),letter1(1),txtcolr(7),opncol(3),closcol(6),lastcol(6),VAprcnt(.618),Valcol(5),Valsize(4),Stime(Sess1StartTime);

vars:lett("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),t1(0),vsize(0),cpt(0),dl(0),lcount(1),fp(0),daynum(0),d0(0),mid(0),dlo(0),pc(0),pc2(0),skp(0),labl(0),vala(0),vap(0),cp(0),t0(0),nuflag(0),hh(0),ll(0),x(0),et(0), clet(""),curtxt(""),th(0),tl(0),tpstr("00"),tot(0),va(0),d2p(0),oldclet(""),barhi(0),barlo(0),mintick(0),xpts(0),price(0),up(0),dn(0),oldup(0),olddn(0),flag(0),flag2(0) ;

array:pri[1000](0),tpo[1000](0),pristr[1000]("");

nuflag=0;
{See if we have started a new session}
{t = time = closing price of current bar}
{d = date = date of closing bar referenced}
if t0 <= Sess1EndTime and t > Sess1EndTime and Sess2StartTime <> 0 then nuflag=1;
if d <> d0 and Sess2StartTime = Sess2EndTime then nuflag=1;
if t0 = sess1endtime then nuflag = 1;

{process a new session or 1st bar on chart}
if currentbar=1 or nuflag=1 then begin
{1st bar on chart processing}
if currentbar=1 then begin
{check value are percentage, it is percentage area under normal curve}
{set }
if VAprcnt < 0 or VAprcnt >= 1 then vap=0 else vap=VAprcnt;
vsize=mod(valsize+7,7);
if vsize < 2 then value88=5 else value88=vsize;
{minmove = minmove for symbol, point = increment of price scale}
{for sp - minmove = 10.0, 1 pt = 0.01}
mintick = 1 point * minmove * compress; {for sp - mintick = .5}
xpts=500*mintick; {for sp - xpts = 250}
end; {currentbar = 1}

lcount=letter1; {Set letter to "A"}
{reset TPO letter if out of range, safety check for invalid letter1 parm}
if lcount < 0 or lcount > 52 then lcount=1;

{process after 1st bar, new session}
if currentbar > 1 then begin
if valcol <> 0 and flag2=0 then begin
mid=0;
value23=0;
cpt = tl;
cp = tl + (th-tl)/2; {center of dist.}
{print("tl=",tl,"th=",th);}

for x = tl to th begin
if pristr[x] <> "" then begin
{nutpstr - updates the tpo count string, and updates the text object on the screen}
pristr[x]=nutpstr(tpo[x],pristr[x],pri[x]);
{accumulate total tpo count}
value23=value23 + tpo[x];



{mid = tpo count at control point}
{cpt = index of control point in tpo array}
if tpo[x]=mid and x <= cp then cpt=x;
if tpo[x]=mid and x>cp and(x-cp) < AbsValue(cp-cpt) then cpt=x;
if tpo[x] > mid then begin
cpt=x;
mid = tpo[x];
end;
end;
end; {end for}

{compute up and down tpo count}
var:tpoUp(0),tpoDn(0),i(0);
tpoup=0;tpodn=0;
for i = tl to th begin
if i >= cpt and tpo[i]>1 then tpoUp = tpoUp + tpo[i] else tpoDn = tpoDn + tpo[i];
end;


{print("value23=",value23," vap=",vap," value23 * vap=",value23 * vap);}

{compute the #tpo's we need to get a VA base on our percentage of normal curve}
{mind over markets uses .70, we like .618,
so if we have 103 tpos then 63.65 tpos are how many will be in our VA}
va=value23 * vap;

{create text object to display our current TPO count total}
{place it below our current VA Bar}
labl= text_new(d2p,t1,dl-mintick,NumToStr(value23,0)+" TPO's"+" Up:"+numtostr(tpoDn,0)+" Dn:"+numtostr(tpoUp,0));
TEXT_SETSTYLE(labl,0,2);
TEXT_SETCOLOR(labl,valcol);



{compute and draw VA bar}
if va > 0 then begin
value61=value19;
value19=cpt; {control pt count}
x=mid; {control pt tpo count}


{set initial tpo array bounds on either side of the control pt index}
up=value19+1;dn=value19-1;
{compute VA using the TPO Method. See pg 333 of Mind Over Markets}
{Start by finding the indices in tpo array for top and bottom va}
while x < va begin

if tpo[up] = tpo[dn] then begin
x=x+tpo[up];
up=up+1;
if x < va then begin
x=x+tpo[dn];
dn=dn-1;
end;
end else begin
if tpo[up] > tpo[dn] then begin
x=x+tpo[up];
up=up+1;
end else begin
x=x+tpo[dn];
dn=dn-1;
end;
end;
end; {end while}

{ Array is scaled by price so compute actual price values for VA}
up= fp+((up-1-500)*mintick);
dn=fp+((dn+1-500)*mintick);

{Draw VA for last completed session .i.e. not todays session}
vala=TL_New(D2p,t1,up,D2p,t1,dn); {vala = value area last}
TL_SetColor(vala,valcol);
TL_SetSize(vala,vsize);
value62=fp+((value19-500)*mintick);
value60=TL_New(D2p,t1,value62+mintick/15,D2p,t1,value62-mintick/15);
TL_SetColor(value60,valcol);
TL_SetSize(value60,value88);
end;
end; {after 1st bar, new session}

pc2=0;
for value4 = tl to th begin
price = fp + ((value4-500)*mintick) ;
if price <= pc then pc2 = value4;
end; {end for}

if pc2=0 then pc2=barlo;
curtxt=pristr[pc2];
if RightStr(curtxt,1) <> "<" then begin
text_setstring(pri[pc2],curtxt+" <");
Text_SetColor(pri[pc2],closcol);
end;
end; {end new session processing}

t1=t; {current bar time}
d2p=d;{current bar datd}

labl=0;vala=0;

{clear print strings and tpo count arrays}
for value1=tl to th begin
pristr[value1]="";
tpo[value1]=0;
end; {end for}

{current letter (text) to match the time, letter match brackets on 24 clock}
{code matchings the CBOT time periods A-X,a-x,skipping Y,Z)}
{time,length of bracket,letter1 is starting letter, normally = 1 "A"}
clet=curletstr(stime,len,letter1);

oldclet=clet;
dlo=l; {low}
fp=o; {open}

{set up tpo array}
tpo[500]=1; {starting tpo index in tpo array}
th=500;tl=500;

flag=0;

pri[500]= text_new(d,t1,o," >"+clet); {save ID# for opening TPO text object}

{Opening tpo string}
pristr[500]=" >"+clet;
TEXT_SETSTYLE(pri[500],0,2);
TEXT_SETCOLOR(pri[500],opncol);

{set initial high,low,bar# etc.}
hh=o;ll=o;mid=1;tot=1;value22=currentbar; dl=l;
{set flag showing date last bar is last date calculated}
if d= JulianToDate(LastCalcJDate) then flag2=1;

end; {1st bar on chart or new session }

{This should always be true, except in a bizarre circumstance}
if t <> t0 then clet=curletstr(stime,len,letter1) ;{this does not work - always is true}

{save current bar date,time & close}
t0=t;d0=d;pc=c;

{fp=first price. Open of 1st session bar}

{compute current bars index high and low (tpo array index scheme is price based)}
barhi=intportion((xpts+h-fp+(mintick/10))/mintick);
barlo=ceiling((xpts+l-fp-(mintick/10))/mintick);

{adjust tpo array high and low bounds if current bar's price moves tpo outside
current tpo array bounds}
if barhi > th then th=barhi;
if barlo < tl then tl=barlo;

if l < dl then dl=l; {test & save if this bar makes new daily low}

{data compression 0=tickbar, 1=intraday, 2=daily, 3=weekly, 4= monthly}

{Set variables dependent on chart compression}
IF datacompression=0 and currentbar > value22 then begin
{tick bar charts us new letter for each bar, rather than for each time bracket}
{this code resets on a new tick bar}
lcount=lcount+1;
if lcount=53 then lcount=1;
clet=midstr(lett,lcount,1) ;
hh=o;ll=o;flag=flag+1;
end;
value22=currentbar; {save bar # this tick bar}

{intraday time based bars}
IF datacompression = 1 and oldclet <> clet then begin
hh=o;ll=o;flag=flag+1;
end;
{code came with this commented out en 11/22/2001 ===== start cut}
{skp=0;
if h > hh or l < ll then begin
skp=1;
}
{en 11/22/2001 ===== end cut}

{pass thru the tpo/printstring array, using price (assoc with index value)
to draw the tpo strings. Remember array "bounds" reflect price offset from first price, fp}
for value4=barlo to barhi begin
price=fp+((value4-500)*mintick); {calc price from index}
curtxt=pristr[value4]; {pull current print string}
if curtxt = "" then begin
{empty string so build a new one}
tpo[value4]=1; {at least one! since index is here!}
pri[value4]= text_new(d2p,t1,price," "+clet); {create & save ID# of new tpo string}
pristr[value4]=" "+clet; {add our current letter to the print string}
{color and style}
TEXT_SETSTYLE(pri[value4],0,2);
TEXT_SETCOLOR(pri[value4],txtcolr);
end else begin
{this tpo already here, check and see if this letter here
already (price here before) , if not here add it}
if RightStr(curtxt,1) <> clet then begin
text_setstring(pri[value4],curtxt+clet); {rebuild current text object with new string}
pristr[value4]=curtxt+clet; {save copy new string}
tpo[value4]=tpo[value4]+1; {update tpo count}
end;
end;
end; {end for}

{check and see if we made a higher high or lower low this bar}
if h>hh then hh=h;
if l < ll then ll = l;
{end;} {this commented out in orignal code EN}

{valcol = value area color}
{colors are from 1 to 16}

{if valcol <> 0 {and skp =1} and {d= JulianToDate(LastCalcJDate)} lastbaronchart then begin this was original}

{last bar on chart and color is not 0 then draw the tpo count label and value area bar}
if valcol <> 0 and lastbaronchart then begin
mid=0;value16=0;value23=0;
cpt=tl;cp=tl + (th-tl)/2; {center of dist.}

{loop thru tpo array to calc value area}
for x = tl to th begin
if pristr[x] <> "" then begin
pristr[x]=nutpstr(tpo[x],pristr[x],pri[x]);
value23=value23 + tpo[x]; {total tpo count}
if tpo[x]=mid and x <= cp then cpt=x;
if tpo[x]=mid and x>cp and(x-cp) < AbsValue(cp-cpt) then cpt=x;
if tpo[x] > mid then begin
cpt=x;
mid = tpo[x];
end;
end;
end; {end for}
va = value23 * vap;

{compute up and down tpo count}

tpoup=0;tpodn=0;
for i = tl to th begin
if i >= cpt and tpo[i]>1 then tpoUp = tpoUp + tpo[i] else tpoDn = tpoDn + tpo[i];
end;

if l < dlo then begin
dlo=l;
price=fp+((tl-501)*mintick);
if labl <> 0 then Text_SetLocation(labl,d2p,t1,price);
end;

if labl =0 then begin
price=fp+((tl-501)*mintick);
labl= text_new(d2p,t1,price,"-");
TEXT_SETSTYLE(labl,0,2);
TEXT_SETCOLOR(labl,valcol);
end;

{update TPO count string}
Text_SetString(labl,NumToStr(value23,0)+" TPO's"+" Up:"+numtostr(tpoDn,0)+" Dn:"+numtostr(tpoUp,0));

{compute and draw the VA bar}
if va <> 0 then begin
value61=value19; {save last control pt value?}
value19=cpt;
x=mid;up=value19+1;dn=value19-1;

{match the TPOs to get the value area}
while x < va begin
if tpo[up] = tpo[dn] then begin
x=x+tpo[up];
up=up+1;
if x < va then begin
x=x+tpo[dn];
dn=dn-1;
end;
end else begin
if tpo[up] > tpo[dn] then begin
x=x+tpo[up];
up=up+1;
end else begin
x=x+tpo[dn];
dn=dn-1;
end;
end;
end; {end while}

oldup=up;
olddn=dn;
up= fp+((up-1-500)*mintick);
dn=fp+((dn+1-500)*mintick);

if flag = 1 then value63=t;
if up > dn and flag > 1 then begin
if vala = 0 then begin
vala=TL_New(D2p,t1,up,D2p,t1,dn);

TL_SetColor(vala,valcol);
TL_SetSize(vala,vsize);
value62=fp+((value19-500)*mintick);
value60=TL_New(D2p,t1,value62+mintick/15,D2p,t1,value62-mintick/15);
TL_SetColor(value60,valcol);
TL_SetSize(value60,value88);
end else begin
if barstatus(1)=2 and oldup <> up then TL_SetBegin(vala,D2p,t1,up);
if barstatus(1)=2 and olddn <> dn then TL_SetEnd(vala,D2p,t1,dn);
end;

end; {last bar on chart}

if value61 <> value19 and flag > 1 then begin
{last control pt has changed?}
value62=fp+((value19-500)*mintick);
if barstatus(1)=2 then TL_SetBegin(value60,D2p,t1,value62+mintick/15);
if barstatus(1)=2 then TL_SetEnd(value60,D2p,t1,value62-mintick/15);
end;

end;
end;

{draw the last price line on the chart}
{if the last price color is not valid then dont draw the line}
if lastcol > 0 and lastcol < 17 then begin
{looks like value10 has the ID# for the line object}
if value10 = 0 and currentbar=3 then begin
value10=tl_new(value50,value51,c,d,t,c);
tl_setcolor(value10,lastcol);
tl_setsize(value10,0);
TL_SetExtLeft(value10,true);
end else
if currentbar > 3 and LastBarOnChart then begin
{tl_setbegin(value10,value52,value53,c);}
if barstatus(1)=2 then tl_setend(value10,d,t,c);
if barstatus(1)=2 then tl_setbegin(value10,value52,value53,c);
end;
value52=value50;value53=value51;
value50=d;value51=t;
end;

noplot(l);

{----- end EasyLanguage Indicator -----}