//+------------------------------------------------------------------+
//| |
//| 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(OpnB<ClsB){prH=ClsB; prL=OpnB;}
if(OpnB>ClsB){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(OpPr<ClPr)
{
ObjectSet(NmOBJ,OBJPROP_COLOR,UpCandle);
ObjectSet(NmOBJ,OBJPROP_BACK,BGCandle);
ObjectSetText(NmOBJ,"UpBar "+Op+Cl,7,"Tahoma");
}
if(OpPr>ClPr)
{
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(OP<CP)ObjectSet(NOBJ,OBJPROP_COLOR,UpCandle);
if(OP>CP)ObjectSet(NOBJ,OBJPROP_COLOR,DnCandle);
}
//+------------------------------------------------------------------+
Comments