//+------------------------------------------------------------------+ //| | //| Copyright © 1999-2007, MetaQuotes Software Corp. | //| http://www.metaquotes.ru | //+------------------------------------------------------------------+ #property strict #property link "mankurt@freemail.ru" #property copyright "© 2006, mankurt" #property indicator_chart_window //---- extern int TimeFrame=60; extern color UpCandle=clrLime; extern color DnCandle=clrRed; extern color DojiColor=clrBlue; extern int Width=1; extern bool BGCandle=false; //---- int Nbar,OpenBar,timer,i,timerTF,name,MidBar; double HighPrevBar,LowPrevBar,ClosePrevBar; double OpenNewBar,HighNewBar,LowNewBar,CloseNewBar; double HighCurBar,LowCurBar,CloseCurBar; double priceNewSH,priceNewSL,pricePrevSH,pricePrevSL,priceCurSH,priceCurSL; string nameNewCandle,namePrevCandle; string nameNewShadowH,nameNewShadowL,namePrevShadowH,namePrevShadowL; string NameBar,NameHigh,NameLow; datetime TimeOpenNewBar,TimeCloseNewBar,TimeClosePrevBar; datetime timeNewShadow,timePrevShadow; bool NewBar; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { IndicatorShortName("M"+(string)TimeFrame+" íà M"+(string)Period()); Nbar=TimeFrame/Period(); timer=Period()*60; Print("Nbar=",Nbar," timer=",timer); timerTF=TimeFrame*60; name=0; TimeOpenNewBar=Time[Bars-1]; OpenNewBar=Open[Bars-1]; NewBar=false; NameBar="Bar M"+(string)TimeFrame+"-"; NameHigh="High M"+(string)TimeFrame+"-"; NameLow="Low M"+(string)TimeFrame+"-"; Print("MathRound=",MathRound(Nbar/2)*timer); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() { for(int DelOBJ=1; DelOBJ<=name; DelOBJ++) { ObjectDelete(NameBar+(string)DelOBJ); ObjectDelete(NameHigh+(string)DelOBJ); ObjectDelete(NameLow+(string)DelOBJ); } Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { if(TimeFrame>1440) { Comment("\n"," TimeFrame more than D1 is not supporting!!!");return(0); } if(Period()>240) { Comment("\n"," Period more than H4 is not supporting!!!");return(0); } if(TimeFrame<=Period() || MathMod(TimeFrame,Period())!=0) { Comment("\n"," TimeFrame should be more or divisible by M",Period());return(0); } i=Bars-IndicatorCounted(); if(IndicatorCounted()==0) i--; while(i>0) { i--; while(i>=0) if(Time[i]==TimeOpenNewBar || BarNew(i,TimeFrame)==false)i--; else { NewBar=true; name++; break; } if(i<0) i=0; if(NewBar==true) { //+-----------------------------------------Previos Bar--------------------------------------------+ OpenBar=iBarShift(NULL,0,TimeOpenNewBar,false); TimeClosePrevBar=Time[i+1]; ClosePrevBar=Close[i+1]; HighPrevBar=High[iHighest(NULL,0,MODE_HIGH,OpenBar-i,i+1)]; LowPrevBar=Low[iLowest(NULL,0,MODE_LOW,OpenBar-i,i+1)]; namePrevCandle=NameBar+(string)(name-1); MidBar=OpenBar-(int)MathRound((OpenBar-i)/2); timePrevShadow=Time[MidBar]; pricePrevSH=PriceShadow(OpenNewBar,ClosePrevBar,0); pricePrevSL=PriceShadow(OpenNewBar,ClosePrevBar,1); namePrevShadowH=NameHigh+(string)(name-1); namePrevShadowL=NameLow+(string)(name-1); //+----------------------------------Modifi Previos Bar & Shadow-----------------------------------+ if(ObjectFind(namePrevCandle)==0) { ObjectMove(namePrevCandle,1,TimeClosePrevBar,ClosePrevBar); PropBar(OpenNewBar,ClosePrevBar,namePrevCandle); if(OpenBar==i+1) ObjectSet(namePrevCandle,OBJPROP_WIDTH,Width*3); } if(ObjectFind(namePrevShadowH)==0) { if(pricePrevSH==HighPrevBar) ObjectDelete(namePrevShadowH); else { ObjectMove(namePrevShadowH,0,timePrevShadow,pricePrevSH); ObjectMove(namePrevShadowH,1,timePrevShadow,HighPrevBar); ColorShadow(OpenNewBar,ClosePrevBar,namePrevShadowH); ObjectSetText(namePrevShadowH,"High="+DoubleToStr(HighPrevBar,Digits),7,"Tahoma"); } } if(ObjectFind(namePrevShadowL)==0) { if(pricePrevSL==LowPrevBar) ObjectDelete(namePrevShadowL); else { ObjectMove(namePrevShadowL,0,timePrevShadow,pricePrevSL); ObjectMove(namePrevShadowL,1,timePrevShadow,LowPrevBar); ColorShadow(OpenNewBar,ClosePrevBar,namePrevShadowL); ObjectSetText(namePrevShadowL,"Low="+DoubleToStr(LowPrevBar,Digits),7,"Tahoma"); } } //+-------------------------------------------New Bar----------------------------------------------+ OpenNewBar=Open[i]; TimeOpenNewBar=Time[i]; HighNewBar=High[i]; LowNewBar=Low[i]; CloseNewBar=Close[i]; TimeCloseNewBar=Time[i]+timerTF-timer; nameNewCandle=NameBar+(string)name; timeNewShadow=Time[i]+(datetime)MathRound(Nbar/2)*timer; priceNewSH=PriceShadow(OpenNewBar,CloseNewBar,0); priceNewSL=PriceShadow(OpenNewBar,CloseNewBar,1); nameNewShadowH=NameHigh+(string)name; nameNewShadowL=NameLow+(string)name; NewBar=false; } else { //+------------------------------------------Current Bar-------------------------------------------+ OpenBar=iBarShift(NULL,0,TimeOpenNewBar,false); CloseCurBar=Close[i]; HighCurBar=High[iHighest(NULL,0,MODE_HIGH,OpenBar+1,i)]; LowCurBar=Low[iLowest(NULL,0,MODE_LOW,OpenBar+1,i)]; priceCurSH=PriceShadow(OpenNewBar,CloseCurBar,0); priceCurSL=PriceShadow(OpenNewBar,CloseCurBar,1); } //+------------------------------Create New Object & Modifi Current--------------------------------+ if(ObjectFind(nameNewCandle)!=0) { //Print("Created candle ",nameNewCandle); ObjectCreate(nameNewCandle,OBJ_RECTANGLE,0,TimeOpenNewBar,OpenNewBar,TimeCloseNewBar,CloseNewBar); ObjectSet(nameNewCandle,OBJPROP_STYLE,STYLE_SOLID); PropBar(OpenNewBar,CloseNewBar,nameNewCandle); } else { //Print("Moved candle ",nameNewCandle); ObjectMove(nameNewCandle,1,TimeCloseNewBar,CloseCurBar); PropBar(OpenNewBar,CloseCurBar,nameNewCandle); } if(ObjectFind(nameNewShadowH)!=0) { Print("Created nameNewShadowH ",nameNewShadowH); ObjectCreate(nameNewShadowH,OBJ_TREND,0,timeNewShadow,priceNewSH,timeNewShadow,HighNewBar); ObjectSet(nameNewShadowH,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(nameNewShadowH,OBJPROP_WIDTH,Width); ObjectSet(nameNewShadowH,OBJPROP_RAY,false); ColorShadow(OpenNewBar,CloseNewBar,nameNewShadowH); } else { Print("Moved nameNewShadowH ",nameNewShadowH); ObjectMove(nameNewShadowH,0,timeNewShadow,priceCurSH); ObjectMove(nameNewShadowH,1,timeNewShadow,HighCurBar); ColorShadow(OpenNewBar,CloseCurBar,nameNewShadowH); } if(ObjectFind(nameNewShadowL)!=0) { ObjectCreate(nameNewShadowL,OBJ_TREND,0,timeNewShadow,priceNewSL,timeNewShadow,LowNewBar); ObjectSet(nameNewShadowL,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(nameNewShadowL,OBJPROP_WIDTH,Width); ObjectSet(nameNewShadowL,OBJPROP_RAY,false); ColorShadow(OpenNewBar,CloseNewBar,nameNewShadowL); } else { ObjectMove(nameNewShadowL,0,timeNewShadow,priceCurSL); ObjectMove(nameNewShadowL,1,timeNewShadow,LowCurBar); ColorShadow(OpenNewBar,CloseCurBar,nameNewShadowL); } } //+-------------------------------------Comment OHLC-----------------------------------------------+ Comment(Symbol(),",M",TimeFrame," O=",OpenNewBar,", H=",HighCurBar, ", L=",LowCurBar,", C=",CloseCurBar,"\n"); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool BarNew(int j,int tmf) { int t0=1440*(TimeDayOfWeek(Time[j])-1)+60*TimeHour(Time[j])+TimeMinute(Time[j]), t1=1440*(TimeDayOfWeek(Time[j+1])-1)+60*TimeHour(Time[j+1])+TimeMinute(Time[j+1]); if(MathMod(t0,tmf)-MathMod(t1,tmf)==t0-t1)return(false); else return(true); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double PriceShadow(double OpnB,double ClsB,int swt) { double prH=0,prL=0; if(OpnBClsB){prH=OpnB; prL=ClsB;} if(OpnB==ClsB){prH=ClsB; prL=ClsB;} switch(swt) { case 0:return(prH);break; case 1:return(prL);break; } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PropBar(double OpPr,double ClPr,string NmOBJ) { string Cl=" Close="+DoubleToStr(ClPr,Digits); string Op=" Open="+DoubleToStr(OpPr,Digits); if(OpPr==ClPr) { ObjectSet(NmOBJ,OBJPROP_BACK,false); ObjectSet(NmOBJ,OBJPROP_COLOR,DojiColor); ObjectSetText(NmOBJ,"Doji "+Op+Cl,7,"Tahoma"); } if(OpPrClPr) { ObjectSet(NmOBJ,OBJPROP_COLOR,DnCandle); ObjectSet(NmOBJ,OBJPROP_BACK,BGCandle); ObjectSetText(NmOBJ,"DnBar "+Op+Cl,7,"Tahoma"); } ObjectSet(NmOBJ,OBJPROP_WIDTH,Width); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ColorShadow(double OP,double CP,string NOBJ) { if(OP==CP)ObjectSet(NOBJ,OBJPROP_COLOR,DojiColor); if(OPCP)ObjectSet(NOBJ,OBJPROP_COLOR,DnCandle); } //+------------------------------------------------------------------+