//+------------------------------------------------------------------+ //|Auto TL 04.mq4 //|Copyright © 2008, Todd Geiger aka fxid10t@yahoo.com (tageiger@comcast.net) //|http://www.metaquotes.net //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Todd Geiger aka fxid10t@yahoo.com (tageiger@comcast.net)" #property link "http://www.metaquotes.net" #property indicator_chart_window extern int period=1440; //time period from which the initial high/lows are taken from extern int Sensitivity=2;//see note below * extern color Color=Magenta; /*Sensitivity is the number of period bars from the current bar to the 2nd point of the last trendline that triggers a new trendline creation. If the trendlines are too close, increase the value. Too far, then decrease the value.*/ int s; double L1,L2,H1,H2; double df1,df2,uf1,uf2; datetime LT1,LT2,HT1,HT2; datetime dft1,dft2,uft1,uft2; string hn,ln,dfn,ufn; int init() { dfn="start"; ufn="start"; s=Sensitivity; return(0); } int deinit(){ //delete all indicator created TL's for(int i=ObjectsTotal();i>=0;i--) { if(StringSubstr(ObjectName(i),0,5)=="Lo TL" || StringSubstr(ObjectName(i),0,5)=="Hi TL" || StringSubstr(ObjectName(i),0,5)=="Bear " || StringSubstr(ObjectName(i),0,5)=="Bull ") { ObjectDelete(ObjectName(i)); } } return(0); } int start() { //.....trendline breach handling..... //.....get most recent TL names if(ObjectsTotal()>0) { string lt,ht; ln="Lo TL 1970.01.01 00:00"; hn="Hi TL 1970.01.01 00:00"; for(int i=ObjectsTotal();i>=0;i--) { if(StringSubstr(ObjectName(i),0,5)=="Lo TL") { lt=ObjectName(i); if(ObjectGet(lt,2)>StrToTime(StringSubstr(ln,6,16))) { ln=lt; LT1=ObjectGet(ln,0); L1=ObjectGet(ln,1); LT2=ObjectGet(ln,2); L2=ObjectGet(ln,3); for(int iii=1; iii<iBarShift(Symbol(),Period(),ObjectGet(ln,2)); iii++) { if(Low[iii]<ObjectGetValueByShift(ln,iii)) { ObjectDelete(ln); ln="Lo TL 1970.01.01 00:00"; } } } } if(StringSubstr(ObjectName(i),0,5)=="Hi TL") { ht=ObjectName(i); if(ObjectGet(ht,2)>StrToTime(StringSubstr(hn,6,16))) { hn=ht; HT1=ObjectGet(hn,0); H1=ObjectGet(hn,1); HT2=ObjectGet(hn,2); H2=ObjectGet(hn,3); for(int ii=1; ii<iBarShift(Symbol(),Period(),ObjectGet(hn,2)); ii++) { if(High[ii]>ObjectGetValueByShift(hn,ii)) { ObjectDelete(hn); hn="Hi TL 1970.01.01 00:00"; } } } } } } if(L2<L1 || LT1==LT2 || L2==0 || L1==0) { ObjectDelete(ln); L1=0; L2=0; LT1=0; LT2=0; ln="Lo TL 1970.01.01 00:00"; } if(H2>H1 || HT1==HT2 || H2==0 || H1==0) { ObjectDelete(hn); H1=0; H2=0; HT1=0; HT2=0; hn="Hi TL 1970.01.01 00:00"; } //if no TL's, make some... if(ObjectFind(hn)<0 || iBarShift(Symbol(),period,HT2)>s) { HTL(); } if(ObjectFind(ln)<0 || iBarShift(Symbol(),period,LT2)>s) { LTL(); } FIB(); return(0);} //+------------------------------------------------------------------+ void FIB() { if(LT1<HT1) { if(ObjectFind(dfn)>-1) { ObjectDelete(dfn); } dfn="Bear Fib "+TimeToStr(LT1,TIME_DATE|TIME_MINUTES); dft1=Time[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,LT1),0)]; df1=High[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,LT1),0)]; dft2=Time[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,dft1),0)]; df2=Low[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,dft1),0)]; if(ObjectFind(ufn)>-1) { ObjectDelete(ufn); } ufn="Bull Fib "+TimeToStr(HT1,TIME_DATE|TIME_MINUTES); uft2=Time[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,LT1),0)]; uf2=High[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,LT1),0)]; uft1=Time[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,LT1)+5,0)]; uf1=Low[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,LT1)+5,0)]; } if(HT1<LT1) { if(ObjectFind(ufn)>-1) { ObjectDelete(ufn); } ufn="Bull Fib "+TimeToStr(HT1,TIME_DATE|TIME_MINUTES); uft1=Time[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,HT1),0)]; uf1=Low[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,HT1),0)]; uft2=Time[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,uft1),0)]; uf2=High[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,uft1),0)]; if(ObjectFind(dfn)>-1) { ObjectDelete(dfn); } dfn="Bear Fib "+TimeToStr(LT1,TIME_DATE|TIME_MINUTES); dft2=Time[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,HT1),0)]; df2=Low[iLowest(Symbol(),0,MODE_LOW,iBarShift(Symbol(),0,HT1),0)]; dft1=Time[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,HT1)+5,0)]; df1=High[iHighest(Symbol(),0,MODE_HIGH,iBarShift(Symbol(),0,HT1)+5,0)]; } ObjectCreate(dfn,10,0,dft1,df1,dft2,df2); ObjectSet(dfn,9,1);//set as background drawing ObjectSet(dfn,201,Red); ObjectSet(dfn,200,4); ObjectSet(dfn,210+0,0); ObjectSetFiboDescription(dfn,0,"0"); ObjectSet(dfn,210+1,0.382); ObjectSetFiboDescription(dfn,1,"0.382"); ObjectSet(dfn,210+2,0.618); ObjectSetFiboDescription(dfn,2,"0.618"); ObjectSet(dfn,210+3,1.00); ObjectSetFiboDescription(dfn,3,"1.00"); ObjectCreate(ufn,10,0,uft1,uf1,uft2,uf2); ObjectSet(ufn,9,1);//set as background drawing ObjectSet(ufn,201,Green); ObjectSet(ufn,200,4); ObjectSet(ufn,210+0,0); ObjectSetFiboDescription(ufn,0,"0"); ObjectSet(ufn,210+1,0.382); ObjectSetFiboDescription(ufn,1,"0.382"); ObjectSet(ufn,210+2,0.618); ObjectSetFiboDescription(ufn,2,"0.618"); ObjectSet(ufn,210+3,1.00); ObjectSetFiboDescription(ufn,3,"1.00"); }//end FIB(); void HTL() { if(HT1==0) { HT1=iTime(Symbol(),period,iHighest(Symbol(),period,MODE_HIGH,iBars(Symbol(),period),1)); H1=iHigh(Symbol(),period,iHighest(Symbol(),period,MODE_HIGH,iBars(Symbol(),period),1)); HT2=iTime(Symbol(),period,iHighest(Symbol(),period,MODE_HIGH,iBars(Symbol(),period),1)-1); H2=iHigh(Symbol(),period,iHighest(Symbol(),period,MODE_HIGH,iBars(Symbol(),period),1)-1); if(H2==0) H2=H1-1*Point; hn="Hi TL "+TimeToStr(HT1,TIME_DATE|TIME_MINUTES); create.hi(); } if(HT1>0) { HT1=HT2; H1=H2; HT2=Time[iBarShift(Symbol(),Period(),HT1)-1]; H2=High[iBarShift(Symbol(),Period(),HT1)-1]; hn="Hi TL "+TimeToStr(HT1,TIME_DATE|TIME_MINUTES); create.hi();} }//end HTL(); void LTL() { if(LT1==0) { LT1=iTime(Symbol(),period,iLowest(Symbol(),period,MODE_LOW,iBars(Symbol(),period),1)); L1=iLow(Symbol(),period,iLowest(Symbol(),period,MODE_LOW,iBars(Symbol(),period),1)); LT2=iTime(Symbol(),period,iLowest(Symbol(),period,MODE_LOW,iBars(Symbol(),period),1)-1); L2=iLow(Symbol(),period,iLowest(Symbol(),period,MODE_LOW,iBars(Symbol(),period),1)-1); ln="Lo TL "+TimeToStr(LT1,TIME_DATE|TIME_MINUTES); create.low(); } if(LT1>0) { LT1=LT2; L1=L2; LT2=Time[iBarShift(Symbol(),Period(),LT1)-1]; L2=Low[iBarShift(Symbol(),Period(),LT1)-1]; ln="Lo TL "+TimeToStr(LT1,TIME_DATE|TIME_MINUTES); create.low();} }//end LTL(); void create.low() { ObjectCreate(ln,2,0,LT1,L1,LT2,L2); ObjectSet(ln,6,Color);//color ObjectSet(ln,7,0);//STYLE_DASH ObjectSet(ln,8,0);//width ObjectSet(ln,9,1);//set as background drawing ObjectSet(ln,10,1);//set as ray for(int ii=iBarShift(Symbol(),Period(),LT1); ii>0; ii--) { if(Low[ii]<ObjectGetValueByShift(ln,ii)) { LT2=Time[ii]; L2=Low[ii]; ObjectMove(ln,1,LT2,L2); } } }//create.low(); void create.hi() { ObjectCreate(hn,2,0,HT1,H1,HT2,H2); ObjectSet(hn,6,Color);//color ObjectSet(hn,7,0);//STYLE_DASH ObjectSet(hn,8,0);//width ObjectSet(hn,9,1);//set as background drawing ObjectSet(hn,10,1);//set as ray for(int ii=iBarShift(Symbol(),Period(),HT1); ii>0; ii--) { if(High[ii]>ObjectGetValueByShift(hn,ii)) { HT2=Time[ii]; H2=High[ii]; ObjectMove(hn,1,HT2,H2); } } }//end create.hi();
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: