1-2-3 ROSS HIGH AND LOW – code in MT4
Forums › ProRealTime English forum › ProBuilder support › 1-2-3 ROSS HIGH AND LOW – code in MT4
- This topic has 9 replies, 8 voices, and was last updated 4 years ago by Nicolas.
-
-
04/24/2017 at 5:39 PM #33223
Dear All,
here below a code in MT4 a out 1-2-3 high and low; Is anyone able and or interested to translate it in Prorealtime language?
Thanks,
Fabrizio
*******************************
#property indicator_chart_window
extern color downcolor= Red;
extern color upcolor = Green;
extern color faildncolor = DarkSalmon;
extern color failupcolor = DarkSeaGreen;
extern color bbreakcolor = DodgerBlue;
extern int maxbars=300;
extern int aggression=1;
extern int behaviourswitches=259;//1+2+256;
//allow 1&2on same
//allow 2&3 on same
// remove 123s where 2 is a RHextern int rejectifheightlessthan=15;
extern int targetpercent123=100;
extern int targetstart123=2;
extern bool showrosshooks=true;
extern string fontname=”Arial Black”;
extern int fontsize=8;
extern int PipTextHeight=0;extern bool showbandbreaks=false;
extern bool onlyshow1stbreak=true;
extern int bandperiod=20;
extern double banddev=2.0;
datetime upmarkers[][4],downmarkers[][4],uprh[],dnrh[],bbreakup[],bbreakdn[];
int totdnmarkers,totupmarkers,totuprh,totdnrh,totbbup,totbbdn;double estpiptexth=0.0;
//+——————————————————————+
//| Custom indicator initialization function |
//+——————————————————————+
int init()
{
// reset marker counts
totdnmarkers =0;
totupmarkers =0;
totuprh=0;
totdnrh=0;
totbbdn=0;
totbbup=0;
estpiptexth=0.0;// make sure sensible values are set
if ((targetstart123 <0) || (targetstart123 >3)) targetstart123=2;
if (targetpercent123 <0) targetpercent123 = 0;
if ((aggression <1) || (aggression >3)) aggression = 1;
if (rejectifheightlessthan <0) rejectifheightlessthan=0;
if (bandperiod <2) bandperiod =20;
if (banddev < 0.1) banddev =2.0;// if user allows 1&2 on same bar then definately dont allow
// new 1 on prev 2 or a new 2 on prev 2
if ((behaviourswitches & 1)== 1)
{
if ((behaviourswitches & 4)== 4) behaviourswitches -=4;
if ((behaviourswitches & 16)== 16) behaviourswitches -=16;
}
//if user allow 2&3 on same bar then def dont allow
// 2 on prev 3 or a 3 on prev 2
if ((behaviourswitches & 2)==2)
{
if ((behaviourswitches & 32)== 32) behaviourswitches -=32;
if ((behaviourswitches & 64)== 64) behaviourswitches -=64;
}
return(0);
}
void moveallmarkers()
{
int pos;
datetime tdt;// get oldest date of all markers
if (totupmarkers >0) tdt = upmarkers[0][0];
if ((totdnmarkers >0) && (downmarkers[0][0] < tdt)) tdt = downmarkers[0][0];
if ((totuprh >0) && (uprh[0] < tdt)) tdt = uprh[0];
if ((totdnrh >0) && (dnrh[0] < tdt)) tdt = dnrh[0];
if ((totbbup >0) && (bbreakup[0] < tdt)) tdt = bbreakup[0];
if ((totbbdn >0) && (bbreakdn[0] < tdt)) tdt = bbreakdn[0];//get barnum for date
pos = iBarShift(NULL,0,tdt,true);// iterate all bars and force marker moves on hi & lo of every bar
while (pos >=0)
{
movemarkers(“123Up1,”+DoubleToStr(Time[pos],0));
movemarkers(“123Dp1,”+DoubleToStr(Time[pos],0));
pos–;
}}
// recalc & set marker positions on a bars high or low that corresponds to the
// type of marker supplied in obname
void movemarkers(string obname)
{
double yp=0;
int obindx=0;
string tstr;
int pos;pos = iBarShift(NULL,0,StrToDouble(StringSubstr(obname,7,StringLen(obname)-7)),true);
if (obinset(obname,”B”))
{
/// move markers in bottom pos
yp = Low[pos];
tstr =”123Dp2,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}tstr =”123Up1,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}tstr =”123Up3,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}tstr = “123Drh,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}tstr = “123Dbb,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}}
else
{
//move markers in top pos
yp = High[pos]+estpiptexth;
tstr =”123Up2,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}tstr =”123Dp1,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}tstr =”123Dp3,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}tstr = “123Urh,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}tstr = “123Ubb,”+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}}
}// delete old markers of the type specified in mtype
// from pos specifies the
void deleteoldmarkers(string mtype,int frompos)
{
// delete old 123 text markers
// if frompos = -1 then delete all markers
// else delete markers younger than the date suppliedif (mtype == “D”)
{
while (totdnmarkers > frompos)
{
ObjectDelete(“123Dp1,”+DoubleToStr(downmarkers[totdnmarkers-1][0],0));
movemarkers(“123Dp1,”+DoubleToStr(downmarkers[totdnmarkers-1][0],0));
ObjectDelete(“123Dp2,”+DoubleToStr(downmarkers[totdnmarkers-1][1],0));
movemarkers(“123Dp2,”+DoubleToStr(downmarkers[totdnmarkers-1][1],0));
ObjectDelete(“123Dp3,”+DoubleToStr(downmarkers[totdnmarkers-1][2],0));
movemarkers(“123Dp3,”+DoubleToStr(downmarkers[totdnmarkers-1][2],0));
totdnmarkers–;
ArrayResize(downmarkers,totdnmarkers);
}
}
else if (mtype == “U”)
{
while (totupmarkers > frompos)
{
ObjectDelete(“123Up1,”+DoubleToStr(upmarkers[totupmarkers-1][0],0));
movemarkers(“123Up1,”+DoubleToStr(upmarkers[totupmarkers-1][0],0));
ObjectDelete(“123Up2,”+DoubleToStr(upmarkers[totupmarkers-1][1],0));
movemarkers(“123Up2,”+DoubleToStr(upmarkers[totupmarkers-1][1],0));
ObjectDelete(“123Up3,”+DoubleToStr(upmarkers[totupmarkers-1][2],0));
movemarkers(“123Up3,”+DoubleToStr(upmarkers[totupmarkers-1][2],0));
totupmarkers–;
ArrayResize(upmarkers,totupmarkers);
}
}
else if (mtype == “URH”)
{
while (totuprh >frompos)
{
ObjectDelete(“123Urh,”+DoubleToStr(uprh[totuprh-1],0));
movemarkers(“123Urh,”+DoubleToStr(uprh[totuprh-1],0));
totuprh–;
ArrayResize(uprh,totuprh);
}
}
else if (mtype == “DRH”)
{
while (totdnrh >frompos)
{
ObjectDelete(“123Drh,”+DoubleToStr(dnrh[totdnrh-1],0));
movemarkers(“123Drh,”+DoubleToStr(dnrh[totdnrh-1],0));
totdnrh–;
ArrayResize(dnrh,totdnrh);
}
}
else if (mtype == “DBB”)
{
while (totbbdn >frompos)
{
ObjectDelete(“123Dbb,”+DoubleToStr(bbreakdn[totbbdn-1],0));
movemarkers(“123Dbb,”+DoubleToStr(bbreakdn[totbbdn-1],0));
totbbdn–;
ArrayResize(bbreakdn,totbbdn);
}
}
else if (mtype == “UBB”)
{
while (totbbup >frompos)
{
ObjectDelete(“123Ubb,”+DoubleToStr(bbreakup[totbbup-1],0));
movemarkers(“123Ubb,”+DoubleToStr(bbreakup[totbbup-1],0));
totbbup–;
ArrayResize(bbreakup,totbbup);
}
}}
// close the indicator … delete all old markers
int deinit()
{deleteoldmarkers(“D”,0); // remove down 123s
deleteoldmarkers(“U”,0); // remove up 123s
deleteoldmarkers(“DRH”,0); // remove down ross hooks
deleteoldmarkers(“URH”,0); // remove up ross hooks
deleteoldmarkers(“DBB”,0); // remove down bol band breaks
deleteoldmarkers(“UBB”,0); // remove up bol band breaks
return(0);
}
// determine if an object is of the set type requested
// basically determines if object is on the high or low of a bar
bool obinset(string obname,string typeset)
{if (typeset==”T”)
{
// check if we have one 1 on top of price bar
if ((StringSubstr(obname,0,6) ==”123Dp1″) ||
(StringSubstr(obname,0,6) ==”123Dp3″) ||
(StringSubstr(obname,0,6) ==”123Up2″) ||
(StringSubstr(obname,0,6) ==”123Ubb”) ||
(StringSubstr(obname,0,6) ==”123Urh”)) return(true);
}
else
if (typeset==”B”)
{
// check if we have one 1 on bottom of price bar
if ((StringSubstr(obname,0,6) ==”123Up1″) ||
(StringSubstr(obname,0,6) ==”123Up3″) ||
(StringSubstr(obname,0,6) ==”123Dp2″) ||
(StringSubstr(obname,0,6) ==”123Dbb”) ||
(StringSubstr(obname,0,6) ==”123Drh”)) return(true);
}
return(false);
}
// returns the number of objects of the requested type at the requested position
int findobatpos(int barnum,string pointtype,string typeset)
{
int inx=0;
int res=0;
string tstr;
string fstr;// count markers at datetime supplied in barnum
/// if point type = “” then count any 123 marker type
/// else only count markers of type detailed in pointtype
/// return number of markers at Point
inx = ObjectsTotal();
while ((inx >=0)&& (res==0))
{
tstr = ObjectName(inx);
fstr = “123”+pointtype;
if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset ==””)) ||
((typeset!= “”) && (obinset(tstr,typeset)) ))
{
if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
{
res++;
inx–;
if (pointtype ==””)
{
while (inx >=0)
{
tstr = ObjectName(inx);
fstr = “123”+pointtype;
if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset==””)) ||
((typeset!= “”) && (obinset(tstr,typeset)) ))
{
if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
res++;
}
inx–;
}
}}
}
inx–;
}return(res);
}
/// cacluate & return the estimated text height in pips
double getestpiptexth()
{
double range=0;
int st=0;
double result;
int texth=0;
// get the barnumber of the first bar on right edge of chart
st=FirstVisibleBar()-BarsPerWindow();
if (st <0) st=0;// calculate the pip range on screen
//range =High[Highest(NULL,0,MODE_HIGH,BarsPerWindow(),st)]- Low[Lowest(NULL,0,MODE_LOW,BarsPerWindow(),st)];
range =High[Highest(NULL,0,MODE_HIGH,FirstVisibleBar()-st,st)]- Low[Lowest(NULL,0,MODE_LOW,FirstVisibleBar()-st,st)];// add 8% of range to estimate window height in pips
range = range+((range*0.08)*Point);// scale the fontsize use result var cos we need a double not int
result = fontsize;
texth= MathRound((result /8)*4);
result = (Point*texth)*(range/(range/(range/(Point*100))));if (result < Point ) result = Point;
return(result);
}
void CheckUps()
{
int pos=0;
int up1pos =-1;
int up2pos=-1;
int up3pos=-1;
int up123lock=0;
double yadj=0,tv1;
//check for Up 123s
if (totupmarkers >0)
{
//use aggression setting to determine where to start from
pos = iBarShift(NULL,0,upmarkers[totupmarkers-1][aggression-1],true)-1;
}
else pos = maxbars;while ((pos >0) &&(!IsStopped()))
{/// find potential 1 ie where this bars low is lower than the previous & next
// or where we have an inside bar
while ((pos >0) && (up1pos ==-1))
{
if ( ((Low[pos]<= Low[pos+1]) && (Low[pos] <= Low[pos-1])) ||
((Low[pos] >= Low[pos+1]) && (High[pos] < High[pos+1]) && (Low[pos]<Low[pos-1])) )
{
up1pos =pos;
}
else pos–;
}// if we havent found a 1 marker quit to while
if (up1pos ==-1) continue;// if we havent got a 2 point & we dont allow 1&2 on same bar then move to next bar
if ((up1pos == pos) && ((behaviourswitches & 1) !=1) ) pos–;
else
if ((pos==up1pos) && (Open[pos]<= Close[pos])) up2pos=pos;/// find potential 2
while ((pos >0) && (up2pos==-1))
{
tv1 = High[Highest(NULL,0,MODE_HIGH,up1pos-pos,pos)];
// if 1 point broken then quit trying
if ((pos !=up1pos) && (Low[Lowest(NULL,0,MODE_LOW,up1pos-pos,pos)] < Low[up1pos])) break;
else
//if we have broken the top of the 1 bar && we have the highest high since breaking the top of the 1
if ((tv1 >= High[up1pos]) &&
(High[pos] == tv1)) up2pos =pos;
else pos–;
}///if we havent got a 2 marker then quit to while
if (up2pos ==-1)
{
pos = up1pos-1; // restart at next bar after previous 1 pos
up1pos =-1;
continue;
}// if pos1&2 on same bar then must move to next
if ((up1pos == up2pos) && (pos == up1pos)) pos–;
else
// if were not allowing 2&3 on same bar must move to next
if (((behaviourswitches & 2) !=2) && (pos == up2pos)) pos–;
else
if ((pos==up2pos) && (Open[pos] > Close[pos])) up3pos=pos;// find potential 3 marker
while ((pos>=0) && (up3pos==-1))
{
tv1 = Low[Lowest(NULL,0,MODE_LOW,up2pos-pos,pos)];
// if we break the 1 pos then quit trying
if (Low[pos] < Low[up1pos]) break;
else
// if 1&2 on same bar && this is the lowest low since 1&2 && there is a lower high than the 2 pos
if ((up1pos==up2pos) && (Low[pos] == Low[Lowest(NULL,0,MODE_LOW,up1pos-pos,pos)]) &&
(High[Lowest(NULL,0,MODE_HIGH,up1pos-pos,pos)] < High[up2pos]))
up3pos=pos;
else
if ((up1pos!=up2pos)&&(pos!=up2pos)&&(tv1== Low[pos]) &&
(tv1<= Low[up2pos]))
up3pos=pos;
else
if (High[pos] > High[up2pos]) break;
else pos–;}
//if no 3 marker then contiune from while
if (up3pos==-1)
{
// 1 pos broken so pattern dead start again
if (Low[pos] < Low[up1pos])
{
pos = up1pos-1;
up1pos=-1;
up2pos=-1;
}
else
// else cant find 3 for this 12 so move 2 to next pos
{
pos=up2pos-1;
up2pos=-1;
}
continue;
}
// we now have a 123 so lets see if
// we can break the 3 (then we search for another 3 with same 1&2
// or trigger the 2
// or break the 1 then kill the patternwhile (pos >=0)
{
// 1 pos broken so pattern dead … kill it
if (Low[pos] < Low[up1pos])
{
pos = up1pos-1;
up1pos=-1;
up2pos=-1;
up3pos=-1;
break;
}
else
//if we find a lower 3 point then kill the 3 point & resume main while
if (Low[pos] < Low[up3pos])
{
up3pos=-1;
break;
}
else
if ((pos == up3pos) && (High[pos] > High[up2pos]) && (Open[pos] > Close[pos]))
{
pos=up2pos-1;
up2pos=-1;
up3pos=-1;
break;
}
else
if ((up2pos==up3pos) && (pos!=up2pos)&& (Low[Lowest(NULL,0,MODE_LOW,up3pos-pos,pos)] > Low[up3pos])&&
(High[Lowest(NULL,0,MODE_HIGH,up2pos-pos,pos)] <= High[up2pos]) && (High[pos]> High[up2pos]))
{
up123lock=1;
break;
}
else
// if no lower high after 2&3 on same bar then
// keep 1 & kill 3
if ((up2pos==up3pos) && (pos !=up2pos) && ((Low[Lowest(NULL,0,MODE_LOW,up3pos-pos,pos)] < Low[up3pos])||(High[pos] >High[up2pos]) ))
{
//up2pos=-1;
up3pos=-1;
up123lock=0;
break;
}
else
// 2 pos triggered
if ((up2pos != up3pos) && (High[pos] > High[up2pos]))// && (Low[pos] >= Low[up3pos])) ||
//((High[pos] > High[up2pos]) && (up1pos==up2pos)) )
{
up123lock =1; // lock it as triggered
break;
}
else pos–;
}// if we have invalidated the 3 point then continue from while
if (up3pos ==-1) continue;// dismiss it if height is less than reject height
if ((High[up2pos] – Low[up1pos]) < rejectifheightlessthan *Point)
{
pos=up2pos-1;
up2pos=-1;
up3pos=-1;
up123lock=0;
continue;
}// dont print 123 if 1&2 are on bar 1 & 3 on bar 0 or if 2&3 are on bar 0
if (((up1pos==up2pos) && (up1pos==1)&& (up3pos==0)) ||
((up2pos==up3pos)&&(pos==0)) ) continue;//if we have found a 123 that falls within a previous 123 &
// its trigger point is below the previous trigger pointwhile (totupmarkers >0)
{
if ((Time[up3pos] < upmarkers[totupmarkers-1][2]) &&
(High[up2pos] < High[iBarShift(NULL,0,upmarkers[totupmarkers-1][1],true)] ) )remove123(totupmarkers-1,”U”);
else
break;
}
// if user doesnt want any following combo then restart at the appropriate pos
if ( ((findobatpos(Time[up1pos],”Up2″,””) > 0) && ((behaviourswitches & 4) != 4)) ||
((findobatpos(Time[up1pos],”Up3″,””) > 0) && ((behaviourswitches & 8) != 8)) ){
pos=up1pos-1;
up1pos =-1;
up2pos=-1;
up3pos=-1;
up123lock=0;
}
else
if ( ((findobatpos(Time[up2pos],”Up2″,””) > 0) && ((behaviourswitches & 16) != 16)) ||
((findobatpos(Time[up2pos],”Up3″,””) > 0) && ((behaviourswitches & 32) != 32)) ||
((findobatpos(Time[up2pos],”Urh”,””) > 0) && ((behaviourswitches & 256) == 256)) )
{
pos=up2pos-1;
up2pos=-1;
up3pos=-1;
up123lock=0;
}
else
if ( ((findobatpos(Time[up3pos],”Up2″,””) > 0) && ((behaviourswitches & 64) != 64)) ||
((findobatpos(Time[up3pos],”Up3″,””) > 0) && ((behaviourswitches & 128) != 128)) )
{
pos=up3pos-1;
up3pos=-1;
up123lock=0;
}
else
{
// create 123 markers & save positions//get number of markers at this bars low * estpiptextheight
yadj= (findobatpos(Time[up1pos],””,”B”))*estpiptexth;
// create marker
ObjectCreate(“123Up1,”+DoubleToStr(Time[up1pos],0),OBJ_TEXT,0,Time[up1pos],Low[up1pos]-yadj);
ObjectSetText(“123Up1,”+DoubleToStr(Time[up1pos],0),”1″,fontsize,fontname,upcolor);yadj = (findobatpos(Time[up2pos],””,”T”)+1)*estpiptexth;
ObjectCreate(“123Up2,”+DoubleToStr(Time[up2pos],0),OBJ_TEXT,0,Time[up2pos],High[up2pos]+yadj);
ObjectSetText(“123Up2,”+DoubleToStr(Time[up2pos],0),”2″,fontsize,fontname,upcolor);yadj= (findobatpos(Time[up3pos],””,”B”))*estpiptexth;
ObjectCreate(“123Up3,”+DoubleToStr(Time[up3pos],0),OBJ_TEXT,0,Time[up3pos],Low[up3pos]-yadj);
ObjectSetText(“123Up3,”+DoubleToStr(Time[up3pos],0),”3″,fontsize,fontname,upcolor);
// resize array & store times of markers & its locked status
totupmarkers++;
ArrayResize(upmarkers,totupmarkers);
upmarkers[totupmarkers-1][0] = Time[up1pos];
upmarkers[totupmarkers-1][1] = Time[up2pos];
upmarkers[totupmarkers-1][2] = Time[up3pos];
upmarkers[totupmarkers-1][3] = up123lock;// restart checking at 1 bar after either this 123s 1 pos or 2 pos
if (aggression ==1) pos = up1pos-1;
else if (aggression==2) pos=up2pos-1;
else pos = up3pos-1;// reset temp vars for next run
up1pos =-1;
up2pos=-1;
up3pos=-1;
up123lock=0;
}}//while
}//func
void CheckDowns()
{
int pos=0;
int dn1pos =-1;
int dn2pos=-1;
int dn3pos=-1;
int dn123lock=0;
double yadj=0,tv1;
//check for Down 123s
if (totdnmarkers >0)
{
//use aggression setting to determine where to start from
pos = iBarShift(NULL,0,downmarkers[totdnmarkers-1][aggression-1],true)-1;
}
else pos = maxbars;while ((pos >0) &&(!IsStopped()))
{/// find potential 1 ie where this bars low is lower than the previous & next
// or where we have an inside bar
while ((pos >0) && (dn1pos ==-1))
{
if ( ((High[pos]>= High[pos+1]) && (High[pos] >= High[pos-1]))
|| ((High[pos] <= High[pos+1]) && (Low[pos] > Low[pos+1])&& (High[pos] > High[pos-1])) )
{
dn1pos =pos;
}
else pos–;
}// if we havent found a 1 marker quit to while
if (dn1pos ==-1) continue;// if we havent got a 2 point & we dont allow 1&2 on same bar then move to next bar
if ((dn1pos == pos) && ((behaviourswitches & 1) !=1) ) pos–;
else
if ((pos==dn1pos) && (Open[pos]>= Close[pos])) dn2pos=pos;/// find potential 2
while ((pos >0) && (dn2pos==-1))
{
tv1 =Low[Lowest(NULL,0,MODE_LOW,dn1pos-pos,pos)];
// if 1 point broken then quit trying
//if ((pos !=dn1pos) && (High[Highest(NULL,0,MODE_HIGH,dn1pos-pos,pos)] > High[dn1pos])) break;
if ((High[pos]>High[dn1pos])) break;
else
//if we have broken the top of the 1 bar && we have the highest high since breaking the top of the 1
if ((tv1 <= Low[dn1pos]) &&
(Low[pos] == tv1)) dn2pos =pos;
else pos–;
}///if we havent got a 2 marker then quit to while
if (dn2pos ==-1)
{
pos = dn1pos-1; // restart at next bar after previous 1 pos
dn1pos =-1;
continue;
}// if pos1&2 on same bar then must move to next
if ((dn1pos == dn2pos) && (pos == dn1pos)) pos–;
else
// if were not allowing 2&3 on same bar must move to next
if (((behaviourswitches & 2) !=2) && (pos == dn2pos)) pos–;
else
if ((pos==dn2pos) && (Open[pos] < Close[pos])) dn3pos=pos;
// find potential 3 marker
while ((pos>=0) && (dn3pos==-1))
{
tv1= High[Highest(NULL,0,MODE_HIGH,dn2pos-pos,pos)];
// if we break the 1 pos then quit trying
if (High[pos] > High[dn1pos]) break;
else
// if 1&2 on same bar && this is the lowest low since 1&2 && there is a lower high than the 2 pos
if ((dn1pos==dn2pos) && (High[pos] == High[Highest(NULL,0,MODE_HIGH,dn1pos-pos,pos)]) &&
(Low[Highest(NULL,0,MODE_LOW,dn1pos-pos,pos)] > Low[dn2pos]))
dn3pos=pos;
else
if ((dn1pos!=dn2pos)&&(pos!=dn2pos)&&(tv1== High[pos]) &&
(tv1>= High[dn2pos]))
dn3pos=pos;
else
if (Low[pos] < Low[dn2pos]) break;
else pos–;}
//if no 3 marker then contiune from while
if (dn3pos==-1)
{
// 1 pos broken so pattern dead start again
if (High[pos] > High[dn1pos])
{
pos = dn1pos-1;
dn1pos=-1;
dn2pos=-1;
}
else
// else cant find 3 for this 12 so move 2 to next pos
{
pos=dn2pos-1;
dn2pos=-1;
}
continue;
}
// we now have a 123 so lets see if
// we can break the 3 (then we search for another 3 with same 1&2
// or trigger the 2
// or break the 1 then kill the patternwhile (pos >=0)
{
// 1 pos broken so pattern dead … kill it
if (High[pos] > High[dn1pos])
{
pos = dn1pos-1;
dn1pos=-1;
dn2pos=-1;
dn3pos=-1;
break;
}
else
//if we find a lower 3 point then kill the 3 point & resume main while
if (High[pos] > High[dn3pos])
{
dn3pos=-1;
break;
}
else
if ((pos == dn3pos) && (Low[pos] < Low[dn2pos]) && (Open[pos] < Close[pos]))
{
pos=dn2pos-1;
dn2pos=-1;
dn3pos=-1;
break;
}
else
if ((dn2pos==dn3pos) && (pos!=dn2pos)&& (High[Highest(NULL,0,MODE_HIGH,dn3pos-pos,pos)] < Low[dn3pos])&&
(Low[Highest(NULL,0,MODE_LOW,dn2pos-pos,pos)] >= Low[dn2pos]) && (Low[pos]< Low[dn2pos]))
{
dn123lock=1;
break;
}
else
// if no lower high after 2&3 on same bar then
// keep 1 & kill 3
if ((dn2pos==dn3pos) && (pos !=dn2pos) && ((High[Highest(NULL,0,MODE_HIGH,dn3pos-pos,pos)] > High[dn3pos])||(Low[pos] <Low[dn2pos]) ))
{
//up2pos=-1;
dn3pos=-1;
dn123lock=0;
break;
}
else
// 2 pos triggered
if ((dn2pos != dn3pos) && (Low[pos] < Low[dn2pos]))// && (Low[pos] >= Low[up3pos])) ||
//((High[pos] > High[up2pos]) && (up1pos==up2pos)) )
{
dn123lock =1; // lock it as triggered
break;
}
else pos–;
}// if we have invalidated the 3 point then continue from while
if (dn3pos ==-1) continue;// dismiss it if height is less than reject height
if ((High[dn1pos] – Low[dn2pos]) < rejectifheightlessthan *Point)
{
pos=dn2pos-1;
dn2pos=-1;
dn3pos=-1;
dn123lock=0;
continue;
}// dont print 123 if 1&2 are on bar 1 & 3 on bar 0 or if 2&3 are on bar 0
if (((dn1pos==dn2pos) && (dn1pos==1)&& (dn3pos==0)) ||
((dn2pos==dn3pos)&&(pos==0)) ) continue;//if we have found a 123 that falls within a previous 123 &
// its trigger point is below the previous trigger point
while (totdnmarkers >0)
{
if ((Time[dn3pos] < downmarkers[totdnmarkers-1][2]) &&
(Low[dn2pos] > Low[iBarShift(NULL,0,downmarkers[totdnmarkers-1][1],true)] ) )remove123(totdnmarkers-1,”D”);
else
break;
}// if user doesnt want any following combo then kill 123
if ( ((findobatpos(Time[dn1pos],”Dp2″,””) > 0) && ((behaviourswitches & 4) != 4)) ||
((findobatpos(Time[dn1pos],”Dp3″,””) > 0) && ((behaviourswitches & 8) != 8)) )
{
pos=dn1pos-1;
dn1pos =-1;
dn2pos=-1;
dn3pos=-1;
dn123lock=0;
}
else
if ( ((findobatpos(Time[dn2pos],”Dp2″,””) > 0) && ((behaviourswitches & 16) != 16)) ||
((findobatpos(Time[dn2pos],”Dp3″,””) > 0) && ((behaviourswitches & 32) != 32)) ||
((findobatpos(Time[dn2pos],”Drh”,””) > 0) && ((behaviourswitches & 256) == 256)) )
{
pos=dn2pos-1;
dn2pos=-1;
dn3pos=-1;
dn123lock=0;
}
else
if ( ((findobatpos(Time[dn3pos],”Dp2″,””) > 0) && ((behaviourswitches & 64) != 64)) ||
((findobatpos(Time[dn3pos],”Dp3″,””) > 0) && ((behaviourswitches & 128) != 128)) )
{
pos=dn3pos-1;
dn3pos=-1;
dn123lock=0;
}
else
{
// create 123 markers & save positions//get number of markers at this bars low * estpiptextheight
yadj= (findobatpos(Time[dn1pos],””,”T”)+1)*estpiptexth;
// create marker
ObjectCreate(“123Dp1,”+DoubleToStr(Time[dn1pos],0),OBJ_TEXT,0,Time[dn1pos],High[dn1pos]+yadj);
ObjectSetText(“123Dp1,”+DoubleToStr(Time[dn1pos],0),”1″,fontsize,fontname,downcolor);yadj = (findobatpos(Time[dn2pos],””,”B”))*estpiptexth;
ObjectCreate(“123Dp2,”+DoubleToStr(Time[dn2pos],0),OBJ_TEXT,0,Time[dn2pos],Low[dn2pos]-yadj);
ObjectSetText(“123Dp2,”+DoubleToStr(Time[dn2pos],0),”2″,fontsize,fontname,downcolor);yadj= (findobatpos(Time[dn3pos],””,”T”)+1)*estpiptexth;
ObjectCreate(“123Dp3,”+DoubleToStr(Time[dn3pos],0),OBJ_TEXT,0,Time[dn3pos],High[dn3pos]+yadj);
ObjectSetText(“123Dp3,”+DoubleToStr(Time[dn3pos],0),”3”,fontsize,fontname,downcolor);
// resize array & store times of markers & its locked status
totdnmarkers++;
ArrayResize(downmarkers,totdnmarkers);
downmarkers[totdnmarkers-1][0] = Time[dn1pos];
downmarkers[totdnmarkers-1][1] = Time[dn2pos];
downmarkers[totdnmarkers-1][2] = Time[dn3pos];
downmarkers[totdnmarkers-1][3] = dn123lock;// restart checking at 1 bar after either this 123s 1 pos or 2 pos
if (aggression ==1) pos = dn1pos-1;
else if (aggression==2) pos=dn2pos-1;
else pos = dn3pos-1;// reset temp vars for next run
dn1pos =-1;
dn2pos=-1;
dn3pos=-1;
dn123lock=0;
}}//while
}//func
int start()
{
double tmpeh;
if (maxbars >= Bars) maxbars = Bars-1;if (PipTextHeight == 0)
{
// see if markers need to be moved
// I.E. auto rescale has occured
tmpeh =getestpiptexth();
if (tmpeh != estpiptexth)
{
estpiptexth = tmpeh;
moveallmarkers();
}}
else
estpiptexth = (PipTextHeight *Point);// remove the most recent up & down 123s if we have any
// and if they havent triggered
if (totupmarkers >0)
if (upmarkers[totupmarkers-1][3] ==0) deleteoldmarkers(“U”,totupmarkers-1);
if (totdnmarkers >0)
if (downmarkers[totdnmarkers-1][3]==0) deleteoldmarkers(“D”,totdnmarkers-1);//*** remove all rh younger than the last 123 3 pos
if (totuprh >0) removerhpost123(“U”);
if (totdnrh >0) removerhpost123(“D”);// check for 123s
CheckDowns();
CheckUps();// check if 123s have triggered / failed / or failed/hit target
check123locksntargets();
// check for ross hooks
if (showrosshooks) checkrosshooks();// remove most recent bol break markers if we have any
if (totbbdn >0) deleteoldmarkers(“DBB”,totbbdn-1);
if (totbbup >0) deleteoldmarkers(“UBB”,totbbup-1);//check for bollinger band breaks
if (showbandbreaks) checkbandbreaks();
return(0);
}
void removerhpost123(string mtype)
{
if (mtype == “U”)
{
while (totuprh >0)
{
if (uprh[totuprh-1] > upmarkers[totupmarkers-1][2])
{
ObjectDelete(“123Urh,”+DoubleToStr(uprh[totuprh-1],0));
movemarkers(“123Urh,”+DoubleToStr(uprh[totuprh-1],0));
totuprh–;
ArrayResize(uprh,totuprh);
}
else break;
}
}
else
{
while (totdnrh >0)
{
if (dnrh[totdnrh-1] > downmarkers[totdnmarkers-1][2])
{
ObjectDelete(“123Drh,”+DoubleToStr(dnrh[totdnrh-1],0));
movemarkers(“123Drh,”+DoubleToStr(dnrh[totdnrh-1],0));
totdnrh–;
ArrayResize(dnrh,totdnrh);
}
else break;
}
}
}int getnearest123(int barpos,string mtype)
{
int res;if (mtype == “U”)
{
// while time of 3 pos > this bar keep moving down 123 array
res = totupmarkers-1;
while ((upmarkers[res][2] > Time[barpos]) && (res >0)) res–;
}
else
{
res = totdnmarkers-1;
while ((downmarkers[res][2] > Time[barpos]) && (res >0)) res–;
}
return(res);
}void checkrosshooks()
{
int barpos;
int indx123;
int mpos2,mpos1;
int mrhpos,tx;
bool bmarkrh;
double yadj;
string tstr;
// check Up rosshooks// if we dont have any 123 ups then cant have rosshooks
if (totupmarkers >0)
{
// start at last known up ross hook or at 3 point of 1st 123
// which ever is youngest
barpos = iBarShift(NULL,0,upmarkers[0][2],true)-1;
tx = barpos;
if (totuprh >0)
tx = iBarShift(NULL,0,uprh[totuprh-1],true)-1;
if (tx < barpos) barpos=tx;while (barpos >0)
{
// get index of nearest previous 123
indx123 = getnearest123(barpos,”U”);
// get bar posits of previous 123s 1& 2 pos
mpos2 = iBarShift(NULL,0,upmarkers[indx123][1],true);
mpos1 = iBarShift(NULL,0,upmarkers[indx123][0],true);// get bar posit of previous rh that is younger than 3 point of the previous 123
mrhpos = -1;
if (totuprh >0)
{
if (uprh[totuprh-1] >= upmarkers[indx123][2])
mrhpos = iBarShift(NULL,0,uprh[totuprh-1],true);
}bmarkrh=false;
// if we fail to make a new high
if ( (High[barpos] > High[mpos2]) && (High[barpos-1] <= High[barpos])&&
(Low[mpos1] <= Low[Lowest(NULL,0,MODE_LOW,mpos1-(barpos+1),barpos+1)]) )
{
bmarkrh = true;// if we have a rosshook younger than the nearest 123
// & price failed above Rh then mark as rh
// if we are above the 123 2 pos && we havent broken the 1 pos of 123 in the meantime
if (mrhpos >-1)
{
if (High[barpos] <= High[mrhpos]) bmarkrh = false;
}
}if ((bmarkrh) && (barpos >1))
{
tstr = “Rh”;
// if there is a 123 with 2 point at rh point then kill the 123
// if the user wants us to
if ((behaviourswitches & 256) == 256)
{
if (findobatpos(Time[barpos],”Up2″,””) >0)
{
tx = totupmarkers-1;
while (upmarkers[tx][1] != Time[barpos]) tx–;
remove123(tx,”U”);
}
}yadj= (findobatpos(Time[barpos],””,”T”)+1)*estpiptexth;
// create marker
ObjectCreate(“123Urh,”+DoubleToStr(Time[barpos],0),OBJ_TEXT,0,Time[barpos],High[barpos]+yadj);
ObjectSetText(“123Urh,”+DoubleToStr(Time[barpos],0),tstr,fontsize,fontname,upcolor);
totuprh++;
ArrayResize(uprh,totuprh);
uprh[totuprh-1] = Time[barpos];}
barpos–;
}
}// check down ross hooks
// if we dont have any 123 downs then cant have rosshooks
if (totdnmarkers >0)
{
// start at last known up ross hook or at 3 point of 1st 123
// which ever is youngest
barpos = iBarShift(NULL,0,downmarkers[0][2],true)-1;
tx = barpos;
if (totdnrh >0)
tx = iBarShift(NULL,0,dnrh[totdnrh-1],true)-1;
if (tx < barpos) barpos=tx;while (barpos >0)
{
// get index of nearest previous 123
indx123 = getnearest123(barpos,”D”);
// get bar posits of previous 123s 1& 2 pos
mpos2 = iBarShift(NULL,0,downmarkers[indx123][1],true);
mpos1 = iBarShift(NULL,0,downmarkers[indx123][0],true);
// get bar posit of previous rh that is younger than 3 point of the previous 123
mrhpos = -1;
if (totdnrh >0)
{
if (dnrh[totdnrh-1] >= downmarkers[indx123][2])
mrhpos = iBarShift(NULL,0,dnrh[totdnrh-1],true);
}bmarkrh =false;
// if we fail to make a new Low
if ( (Low[barpos] < Low[mpos2]) && (Low[barpos-1] >= Low[barpos]) &&
(High[mpos1] >= High[Highest(NULL,0,MODE_HIGH,mpos1-(barpos+1),barpos+1)]) )
{
bmarkrh = true;// if we have a rosshook younger than the nearest 123
// & price failed above Rh then mark as rh
// if we are above the 123 2 pos && we havent broken the 1 pos of 123 in the meantime
if (mrhpos >-1)
{
if (Low[barpos] >= Low[mrhpos]) bmarkrh = false;
}
}if ((bmarkrh) && (barpos >1)) {
tstr = “Rh”;
// if there is a 123 with 2 point at rh point then kill the 123
// if the user wants us to
if ((behaviourswitches & 256) == 256)
{
if (findobatpos(Time[barpos],”Dp2″,””) >0)
{
tx = totdnmarkers-1;
while (downmarkers[tx][1] != Time[barpos]) tx–;
remove123(tx,”D”);
}
}yadj= (findobatpos(Time[barpos],””,”B”))*estpiptexth;
// create marker
ObjectCreate(“123Drh,”+DoubleToStr(Time[barpos],0),OBJ_TEXT,0,Time[barpos],Low[barpos]-yadj);
ObjectSetText(“123Drh,”+DoubleToStr(Time[barpos],0),tstr,fontsize,fontname,downcolor);
totdnrh++;
ArrayResize(dnrh,totdnrh);
dnrh[totdnrh-1] = Time[barpos];}
barpos–;
}
}
}
void check123locksntargets()
{
int pos,mpos1,mpos2,mpos3;
int barpos;
double tgtval;
//check all non triggerd UP 123s … delete non triggered&failed or lock triggered
pos=0;
// iterate all up 123s
while (pos < totupmarkers)
{// if 123 is not locked
if (upmarkers[pos][3] ==0)
{
mpos1=iBarShift(NULL,0,upmarkers[pos][0],true);
mpos2=iBarShift(NULL,0,upmarkers[pos][1],true);
mpos3=iBarShift(NULL,0,upmarkers[pos][2],true);
barpos = mpos3-1;
while (barpos >0)
{
// if 2 pos is triggered && didnt break 1 pos on same bar
// then lock as triggerd
if ((High[barpos] > High[mpos2]) && (Low[barpos] >= Low[mpos1]))
{
upmarkers[pos][3] =1;
break;
}
else
// if 1 pos broken then mark it as failed
if (Low[barpos] < Low[mpos1])
{
upmarkers[pos][3]=-1;
break;
}
barpos–;
}
}
// if lock = -1 then delete as its a non triggered & failed
if (upmarkers[pos][3]==-1)
{
remove123(pos,”U”);
}
else
pos++;
}// test triggered up 123 for targets
// Set as failed if target not met before 1 pos broken
if (targetstart123 >0)
{
pos =0;
while (pos < totupmarkers)
{
//if triggered but not hit target then check it
if (upmarkers[pos][3] == 1)
{
mpos1=iBarShift(NULL,0,upmarkers[pos][0],true);
mpos2=iBarShift(NULL,0,upmarkers[pos][1],true);
mpos3=iBarShift(NULL,0,upmarkers[pos][2],true);tgtval = ((High[mpos2] -Low[mpos1]) * targetpercent123)/100;
if (targetstart123 ==1) tgtval = tgtval + Low[mpos1];
else
if (targetstart123 ==2) tgtval = tgtval + High[mpos2];
else
if (targetstart123 ==3) tgtval = tgtval + Low[mpos3];barpos = mpos3-1;
while (barpos >0)
{
// hit target so mark as 3 (triggered & target hit)
if (High[barpos] >= tgtval)
{
upmarkers[pos][3] =3;
break;
}
else
// if 1 pos broken then mark it as failed
if (Low[barpos] < Low[mpos1])
{
upmarkers[pos][3]=2;
break;
}
barpos–;
}// recolor markers if its failed target
if (upmarkers[pos][3] ==2)
{
ObjectSet(“123Up1,”+DoubleToStr(upmarkers[pos][0],0),OBJPROP_COLOR,failupcolor);
ObjectSet(“123Up2,”+DoubleToStr(upmarkers[pos][1],0),OBJPROP_COLOR,failupcolor);
ObjectSet(“123Up3,”+DoubleToStr(upmarkers[pos][2],0),OBJPROP_COLOR,failupcolor);
}
}pos++;
}
}// now do the downs
//check all non triggerd DOWN 123s … delete non triggered&failed or lock triggered
pos=0;
// iterate all up 123s
while (pos < totdnmarkers)
{
// if 123 is not locked
if (downmarkers[pos][3] ==0)
{
mpos1=iBarShift(NULL,0,downmarkers[pos][0],true);
mpos2=iBarShift(NULL,0,downmarkers[pos][1],true);
mpos3=iBarShift(NULL,0,downmarkers[pos][2],true);
barpos = mpos3-1;
while (barpos >0)
{
// if 2 pos is triggered && didnt break 1 pos on same bar
// then lock as triggerd
if ((Low[barpos] < Low[mpos2]) && (High[barpos] <= High[mpos1]))
{
downmarkers[pos][3] =1;
break;
}
else
// if 1 pos broken then mark it as failed
if (High[barpos] > High[mpos1])
{
downmarkers[pos][3]=-1;
break;
}
barpos–;
}
}
// if lock = -1 then delete as its a non triggered & failed
if (downmarkers[pos][3]==-1)
{
remove123(pos,”D”);
}
else
pos++;
}
// test triggered up 123 for targets
// Set as failed if target not met before 1 pos broken
if (targetstart123 >0)
{
pos =0;
while (pos < totdnmarkers)
{
//if triggered but not hit target then check it
if (downmarkers[pos][3] == 1)
{
mpos1=iBarShift(NULL,0,downmarkers[pos][0],true);
mpos2=iBarShift(NULL,0,downmarkers[pos][1],true);
mpos3=iBarShift(NULL,0,downmarkers[pos][2],true);tgtval = ((Low[mpos2] -High[mpos1]) * targetpercent123)/100;
if (targetstart123 ==1) tgtval = tgtval + High[mpos1];
else
if (targetstart123 ==2) tgtval = tgtval + Low[mpos2];
else
if (targetstart123 ==3) tgtval = tgtval + High[mpos3];barpos = mpos3-1;
while (barpos >0)
{
// hit target so mark as 3 (triggered & target hit)
if (Low[barpos] <= tgtval)
{
downmarkers[pos][3] =3;
break;
}
else
// if 1 pos broken then mark it as failed
if (High[barpos] > High[mpos1])
{
downmarkers[pos][3]=2;
break;
}
barpos–;
}// recolor markers if its failed target
if (downmarkers[pos][3] ==2)
{
ObjectSet(“123Dp1,”+DoubleToStr(downmarkers[pos][0],0),OBJPROP_COLOR,faildncolor);
ObjectSet(“123Dp2,”+DoubleToStr(downmarkers[pos][1],0),OBJPROP_COLOR,faildncolor);
ObjectSet(“123Dp3,”+DoubleToStr(downmarkers[pos][2],0),OBJPROP_COLOR,faildncolor);
}
}pos++;
}
}}
// remove a 123 … delete its markers and then shuffle all other 123s up the marker arrays & resize arrays
void remove123(int posi,string mtype)
{
int x;
if (mtype == “U”)
{
ObjectDelete(“123Up1,”+DoubleToStr(upmarkers[posi][0],0));
movemarkers(“123Up1,”+DoubleToStr(upmarkers[posi][0],0));
ObjectDelete(“123Up2,”+DoubleToStr(upmarkers[posi][1],0));
movemarkers(“123Up2,”+DoubleToStr(upmarkers[posi][1],0));
ObjectDelete(“123Up3,”+DoubleToStr(upmarkers[posi][2],0));
movemarkers(“123Up3,”+DoubleToStr(upmarkers[posi][2],0));
for (x=posi; x < totupmarkers-1;x++)
{
upmarkers[x][0] = upmarkers[x+1][0];
upmarkers[x][1] = upmarkers[x+1][1];
upmarkers[x][2] = upmarkers[x+1][2];
upmarkers[x][3] = upmarkers[x+1][3];
}
totupmarkers–;
ArrayResize(upmarkers,totupmarkers);
}
else
{
ObjectDelete(“123Dp1,”+DoubleToStr(downmarkers[posi][0],0));
movemarkers(“123Dp1,”+DoubleToStr(downmarkers[posi][0],0));
ObjectDelete(“123Dp2,”+DoubleToStr(downmarkers[posi][1],0));
movemarkers(“123Dp2,”+DoubleToStr(downmarkers[posi][1],0));
ObjectDelete(“123Dp3,”+DoubleToStr(downmarkers[posi][2],0));
movemarkers(“123Dp3,”+DoubleToStr(downmarkers[posi][2],0));
for (x=posi; x < totdnmarkers-1;x++)
{
downmarkers[x][0] = downmarkers[x+1][0];
downmarkers[x][1] = downmarkers[x+1][1];
downmarkers[x][2] = downmarkers[x+1][2];
downmarkers[x][3] = downmarkers[x+1][3];
}
totdnmarkers–;
ArrayResize(downmarkers,totdnmarkers);
}}
void checkbandbreaks()
{
int pos;
double yadj;
bool bmark;// check upper band breaks
if (totbbup >0)
pos = iBarShift(NULL,0,bbreakup[totbbup-1],true)-1;
else pos = maxbars;while (pos >=0)
{
if (High[pos] > iBands(NULL,0,bandperiod,banddev,0,PRICE_CLOSE,MODE_UPPER,pos))
{
bmark = true;
// if user only wants to see the 1st bb break && this isnt the 1st then
if ((onlyshow1stbreak) &&
(High[pos+1] > iBands(NULL,0,bandperiod,banddev,0,PRICE_CLOSE,MODE_UPPER,pos+1)))
bmark = false;if (bmark)
{
yadj = (findobatpos(Time[pos],””,”T”)+1)*estpiptexth;
ObjectCreate(“123Ubb,”+DoubleToStr(Time[pos],0),OBJ_TEXT,0,Time[pos],High[pos]+yadj);
ObjectSetText(“123Ubb,”+DoubleToStr(Time[pos],0),”B”,fontsize,fontname,bbreakcolor);totbbup++;
ArrayResize(bbreakup,totbbup);
bbreakup[totbbup-1] = Time[pos];
}
}
pos–;
}// check lower band breaks
if (totbbdn >0)
pos = iBarShift(NULL,0,bbreakdn[totbbdn-1],true)-1;
else pos = maxbars;while (pos >=0)
{
if (Low[pos] < iBands(NULL,0,bandperiod,banddev,0,PRICE_CLOSE,MODE_LOWER,pos))
{
bmark = true;if ((onlyshow1stbreak) &&
(Low[pos+1] < iBands(NULL,0,bandperiod,banddev,0,PRICE_CLOSE,MODE_LOWER,pos+1)))
bmark= false;if (bmark)
{
yadj = (findobatpos(Time[pos],””,”B”))*estpiptexth;
ObjectCreate(“123Dbb,”+DoubleToStr(Time[pos],0),OBJ_TEXT,0,Time[pos],Low[pos]-yadj);
ObjectSetText(“123Dbb,”+DoubleToStr(Time[pos],0),”B”,fontsize,fontname,bbreakcolor);totbbdn++;
ArrayResize(bbreakdn,totbbdn);
bbreakdn[totbbdn-1] = Time[pos];
}
}
pos–;
}}
04/03/2018 at 10:30 AM #6701505/22/2018 at 2:52 PM #71104@nicolas @robertogozzi there is any chance to translate this?
05/22/2018 at 3:13 PM #71108As for me, no, since I don’t know the MT4 programming language.
05/22/2018 at 3:21 PM #7111105/25/2018 at 6:17 PM #7135806/11/2018 at 12:32 PM #72873Hello
123 patterns_ProRealTime
This could help you:
https://www.automatictrading.it/prodotto/1-2-3-swing-trading/Ale
1 user thanked author for this post.
06/19/2018 at 9:05 PM #73697https://www.prorealtime.com/en/indicator-library-open-1014
1 user thanked author for this post.
01/11/2020 at 1:07 PM #11642101/11/2020 at 5:40 PM #116448 -
AuthorPosts
Find exclusive trading pro-tools on