//+------------------------------------------------------------------+ //|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; extern int Sensitivity =3;//see note below * extern color Color =Magenta; extern bool Draw.Fibo? =false; /*Sensitivity is the number of 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() { if(period<Period()) { period=0; } //.....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(Close[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(Close[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(); } if(Draw.Fibo?) { FIB(); } return(0);} //+------------------------------------------------------------------+ void FIB() { if(LT1<HT1) { if(ObjectFind(dfn)>-1) { ObjectDelete(dfn); } dft1=Time[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1),0)]; df1=Close[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1),0)]; dft2=Time[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,dft1),0)]; df2=Close[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,dft1),0)]; dfn="Bear Fib "+TimeToStr(dft1,TIME_DATE|TIME_MINUTES); if(ObjectFind(ufn)>-1) { ObjectDelete(ufn); } uft2=Time[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1),0)]; uf2=Close[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1),0)]; uft1=Time[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1)+5,0)]; uf1=Close[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,LT1)+5,0)]; ufn="Bull Fib "+TimeToStr(uft1,TIME_DATE|TIME_MINUTES); } if(HT1<LT1) { if(ObjectFind(ufn)>-1) { ObjectDelete(ufn); } uft1=Time[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1),0)]; uf1=Close[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1),0)]; uft2=Time[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,uft1),0)]; uf2=Close[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,uft1),0)]; ufn="Bull Fib "+TimeToStr(uft1,TIME_DATE|TIME_MINUTES); if(ObjectFind(dfn)>-1) { ObjectDelete(dfn); } dft2=Time[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1),0)]; df2=Close[iLowest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1),0)]; dft1=Time[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1)+5,0)]; df1=Close[iHighest(Symbol(),0,MODE_CLOSE,iBarShift(Symbol(),0,HT1)+5,0)]; dfn="Bear Fib "+TimeToStr(dft1,TIME_DATE|TIME_MINUTES); } ObjectCreate(dfn,10,0,dft1,df1,dft2,df2); ObjectSet(dfn,9,1);//set as background drawing ObjectSet(dfn,201,Crimson); ObjectSet(dfn,200,6); 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.5); ObjectSetFiboDescription(dfn,2,"0.5 %$"); ObjectSet(dfn,210+3,0.618); ObjectSetFiboDescription(dfn,3,"0.618 %$"); ObjectSet(dfn,210+4,0.764); ObjectSetFiboDescription(dfn,4,"0.764 %$"); ObjectSet(dfn,210+5,1.00); ObjectSetFiboDescription(dfn,5,"1.00 %$"); ObjectCreate(ufn,10,0,uft1,uf1,uft2,uf2); ObjectSet(ufn,9,1);//set as background drawing ObjectSet(ufn,6,Green); ObjectSet(ufn,201,Green); ObjectSet(ufn,200,6); 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.5); ObjectSetFiboDescription(ufn,2,"0.5 %$"); ObjectSet(ufn,210+3,0.618); ObjectSetFiboDescription(ufn,3,"0.618 %$"); ObjectSet(ufn,210+4,0.764); ObjectSetFiboDescription(ufn,4,"0.764 %$"); ObjectSet(ufn,210+5,1.00); ObjectSetFiboDescription(ufn,5,"1.00 %$"); }//end FIB(); void HTL() { if(HT1==0) { HT1=iTime(Symbol(),period,iHighest(Symbol(),period,MODE_CLOSE,iBars(Symbol(),period),1)); H1=iClose(Symbol(),period,iHighest(Symbol(),period,MODE_CLOSE,iBars(Symbol(),period),1)); HT2=iTime(Symbol(),period,iHighest(Symbol(),period,MODE_CLOSE,iBars(Symbol(),period),1)-1); H2=iClose(Symbol(),period,iHighest(Symbol(),period,MODE_CLOSE,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=Close[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_CLOSE,iBars(Symbol(),period),1)); L1=iClose(Symbol(),period,iLowest(Symbol(),period,MODE_CLOSE,iBars(Symbol(),period),1)); LT2=iTime(Symbol(),period,iLowest(Symbol(),period,MODE_CLOSE,iBars(Symbol(),period),1)-1); L2=iClose(Symbol(),period,iLowest(Symbol(),period,MODE_CLOSE,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=Close[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(Close[ii]<ObjectGetValueByShift(ln,ii)) { LT2=Time[ii]; L2=Close[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(Close[ii]>ObjectGetValueByShift(hn,ii)) { HT2=Time[ii]; H2=Close[ii]; ObjectMove(hn,1,HT2,H2); } } }//end create.hi();
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: