//+------------------------------------------------------------------+
//| XPeriod.mq4 |
//| Denis Orlov |
//| http://denis-or-love.narod.ru |
/*
Èíäèêàòîð ïîçâîëÿåò îòîáðàæàòü ñâå÷íûå ãðàôèêè ðàçíûõ âðåìåííûõ ïåðèîäîâ â îäíîì îêíå.
Ïîäðîáíî:
http://codebase.mql4.com/ru/6014
The indicator allows to display candle schedules of the different time periods in one window.
In detail:
http://codebase.mql4.com/6072
***
Âñå ìîè èíäèêàòîðû:
http://codebase.mql4.com/ru/author/denis_orlov
***
ÏÎËÜÇÓÉÒÅÑÜ È ÏÐÎÖÂÅÒÀÉÒÅ!
***
All my indicators:
http://codebase.mql4.com/author/denis_orlov
***
USE AND PROSPER!
*/
//+------------------------------------------------------------------+
#property copyright "Denis Orlov"
#property link "http://denis-or-love.narod.ru"
//#include <Trend.mqh>
//#include <DrawObjects.mqh>
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DarkTurquoise
#property indicator_color2 DarkBlue
#property indicator_color3 DarkTurquoise
#property indicator_color4 DarkBlue
double Line1[], Line2[], Line3[], Line4[];
//#property indicator_maximum 100
//#property indicator_minimum 0
extern bool TesterMode=false;
extern int TimeFrame=0;
extern int History=10;
extern int Vertical_Shift=-60;
extern bool DoubleLong=false;
extern bool OutlineCandles=true;
extern color ColorBullShadow=BlanchedAlmond;
extern color ColorBullBody=NavajoWhite;
extern color ColorBearShadow=Gainsboro;
extern color ColorBearBody=Gray;
extern bool BackRoundCandles=True;
extern int OutlineWidth=3;
extern color LabelColor=Blue;
string pr="XPeriod ";
int per,per1;
bool redraw=false;
int bar0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
if(TimeFrame==0)
switch(Period()) // Ðàñ÷¸ò êîýôôèöèåíòîâ äëÿ..
{ // .. ðàçëè÷íûõ ÒÔ
case 1: TimeFrame=1; break;// Òàéìôðåéì Ì1
case 5: TimeFrame=1; break;// Òàéìôðåéì Ì5
case 15: TimeFrame=5; break;// Òàéìôðåéì Ì15
case 30: TimeFrame=15; break;// Òàéìôðåéì Ì30
case 60: TimeFrame=30; break;// Òàéìôðåéì H1
case 240: TimeFrame=60; break;// Òàéìôðåéì H4
case 1440: TimeFrame=240; break;// Òàéìôðåéì D1
case 10080: TimeFrame=1440; break;// Òàéìôðåéì W1
case 43200: TimeFrame=10080; break;// Òàéìôðåéì ÌN
}
//IndicatorBuffers(4);
SetIndexStyle(0,DRAW_HISTOGRAM,0,3);
SetIndexBuffer(0,Line1);
SetIndexStyle(1,DRAW_HISTOGRAM,0,3);
SetIndexBuffer(1,Line2);
SetIndexStyle(2,DRAW_HISTOGRAM,0,1);
SetIndexBuffer(2,Line3);
SetIndexStyle(3,DRAW_HISTOGRAM,0,1);
SetIndexBuffer(3,Line4);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Delete_My_Obj(pr+PeriodToStr(TimeFrame));
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
string TF=PeriodToStr(TimeFrame);
IndicatorShortName(pr+TF);
double TesterTimeCurrent=GlobalVariableGet( "TesterTimeCurrent");
//if( TesterTimeCurrent==0) return;
// bar0=TimeToBarPeriod(TesterTimeCurrent, TimeFrame);
if(TesterMode) bar0=iBarShift(NULL,TimeFrame,TesterTimeCurrent);
else bar0=0;
DrawText( pr+TF+" label", Time[0]+Period()*90 , iLow(NULL,TimeFrame,bar0)+Vertical_Shift*Point,
TF//TimeToStr(Time[0],TIME_SECONDS)+"; "+ TimeToStr(TesterTimeCurrent,TIME_SECONDS)//
,LabelColor);
//if(ObjectFind(pr+TF+" label")>-1)
//{
double lp=ObjectGet(pr+TF+" label",OBJPROP_PRICE1);
if(lp!=iLow(NULL,TimeFrame,bar0)+Vertical_Shift*Point)
{
Vertical_Shift=(lp- iLow(NULL,TimeFrame,bar0))/Point;
redraw=True;
}
//}
Chart( bar0,bar0);///ðèñóåì ãðàôèê - òîëüêî ïîñëåäíèé áàð
// Comment(Vertical_Shift);
if(TimeFrame<Period())
int canF=iBarShift(NULL,TimeFrame,Time[History]);
else
{
if(!TesterMode)canF=History;
else
canF=iBarShift(NULL,TimeFrame,TesterTimeCurrent)+History;
}
if (per1 != iTime(NULL,TimeFrame, 0) || per!= Time[0] || redraw) // îäèí ðàç â áàð èëè ïðè ïåðåðèñîâêå
{
per = Time[0];
per1= iTime(NULL,TimeFrame, bar0);
redraw=False;
ArrayInitialize( Line1, 0);
ArrayInitialize( Line2, 0);
ArrayInitialize( Line3, 0);
ArrayInitialize( Line4, 0);
Chart( canF,bar0);///ðèñóåì âåñü ãðàôèê
if(!OutlineCandles)return(0);
if(TimeFrame<Period())
{
//canF=TimeToBarPeriod(Time[History], TimeFrame);
canF=iBarShift(NULL,TimeFrame,Time[History]);
int K=MathRound(Period()/TimeFrame), cnt2=History+1;
for( int i=canF;i>=bar0;i=i-K)
{
cnt2--;
datetime t1=Time[i-bar0];
int t_2=i-K+1-bar0;
if(t_2<0) datetime t2=Time[0];
else
t2=Time[t_2];
//if(cnt2==1)Alert(canF+";"+bar0+";"+i+";"+K+";"+(i-K+1-bar0));
if(DoubleLong)
double p1=High[cnt2]*2-Low[cnt2]+Vertical_Shift*Point;
else p1=High[cnt2]+Vertical_Shift*Point;
double p2=Low[cnt2]+Vertical_Shift*Point;
double op=Open[cnt2], cl=Close[cnt2];
if(op<cl) color clr=ColorBullShadow; else clr=ColorBearShadow;
string name=pr+TF+" Candle Shadows "+cnt2;//+" "+TimeToStr(t1,TIME_DATE|TIME_MINUTES);
DrawRect(name, t1, p1, t2, p2, clr, OutlineWidth, "", BackRoundCandles, 0);
if(op!=cl)//BODY
{
if(op<cl)
{
if(DoubleLong)
{
p1=cl*2-Low[cnt2]+Vertical_Shift*Point;
p2=op*2-Low[cnt2]+Vertical_Shift*Point;
}
else
{
p1=cl+Vertical_Shift*Point;
p2=op+Vertical_Shift*Point;
}
clr=ColorBullBody;
}
else
{
if(DoubleLong)
{
p1=op*2-Low[cnt2]+Vertical_Shift*Point;
p2=cl*2-Low[cnt2]+Vertical_Shift*Point;
}
else
{
p1=op+Vertical_Shift*Point;
p2=cl+Vertical_Shift*Point;
}
clr=ColorBearBody;
}
name=pr+TF+" Candle Body "+cnt2;//+" "+TimeToStr(t1,TIME_DATE|TIME_MINUTES);
DrawRect(name, t1, p1, t2, p2, clr, OutlineWidth, "", BackRoundCandles, 0);
}//if(op!=cl)
}//for
}
else
{
Delete_My_Obj(pr+TF+" Candle ");
K=MathRound(TimeFrame/Period());
// canF=TimeToBarPeriod(iTime(NULL,TimeFrame, History), Period());
cnt2=canF+1; // cnt2=History+1
canF=iBarShift(NULL,Period(),iTime(NULL,TimeFrame, canF));
for( i=canF;i>=0;i=i-K)
{
cnt2--;
t1=Time[i];
t_2=i-K+1;
if(t_2<0) t2=Time[0];
else
t2=Time[t_2];
//Alert(canF+";"+cnt2);
p1=iHigh(NULL,TimeFrame,cnt2);
p2=iLow(NULL,TimeFrame,cnt2);
op=iOpen(NULL,TimeFrame,cnt2); cl=iClose(NULL,TimeFrame,cnt2);
if(op<cl) clr=ColorBullShadow; else clr=ColorBearShadow;
name=pr+TF+" Candle Shadows "+cnt2;//+" "+TimeToStr(t1,TIME_DATE|TIME_MINUTES);
DrawRect(name, t1, p1, t2, p2, clr, OutlineWidth, "", BackRoundCandles, 0);
if(op!=cl) //BODY
{
if(op<cl)
{
p1=cl;
p2=op;
clr=ColorBullBody;
}
else
{
p1=op;
p2=cl;
clr=ColorBearBody;
}
name=pr+TF+" Candle Body "+cnt2;//+" "+TimeToStr(t1,TIME_DATE|TIME_MINUTES);
DrawRect(name, t1, p1, t2, p2, clr, OutlineWidth, "", BackRoundCandles, 0);
}//if(op!=cl)
}//for
}//else
}// if (per != Time[0]) // îäèí ðàç â áàð
//----
return(0);
}
//+------------------------------------------------------------------+
void Chart(int from, int to)
{
// if(TimeFrame<Period())
int b0=bar0;
// else b0=0;
for(int i=from;i>=to;i--)
{
double p_1=iOpen(NULL,TimeFrame,i), p_2=iClose(NULL,TimeFrame,i);
if(p_1<p_2)//UP
{
if(DoubleLong)
Line3[i-b0]=iHigh(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
else
Line3[i-b0]=iHigh(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line4[i-b0]=iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
if(DoubleLong)
{
Line1[i-b0]=iClose(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line2[i-b0]=iOpen(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
else
{
Line1[i-b0]=iClose(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line2[i-b0]=iOpen(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
}
else
{
if(p_1>p_2)
{
if(DoubleLong)
{
Line2[i-b0]=iOpen(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line1[i-b0]=iClose(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
else
{
Line2[i-b0]=iOpen(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line1[i-b0]=iClose(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
}
else
if(p_1==p_2)//dodge
{
if(DoubleLong)
{
Line2[i-b0]=iOpen(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+(Vertical_Shift+0.01)*Point;
Line1[i-b0]=iClose(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
else
{
Line2[i-b0]=iOpen(NULL,TimeFrame,i)+(Vertical_Shift+0.01)*Point;
Line1[i-b0]=iClose(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
}
if(DoubleLong)
Line4[i-b0]=iHigh(NULL,TimeFrame,i)*2-iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
else
Line4[i-b0]=iHigh(NULL,TimeFrame,i)+Vertical_Shift*Point;
Line3[i-b0]=iLow(NULL,TimeFrame,i)+Vertical_Shift*Point;
}
}
}
//----------------------
void Delete_My_Obj(string Prefix)
{//Alert(ObjectsTotal());
for(int k=ObjectsTotal()-1; k>=0; k--) // Ïî êîëè÷åñòâó âñåõ îáúåêòîâ
{
string Obj_Name=ObjectName(k); // Çàïðàøèâàåì èìÿ îáúåêòà
string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Èçâëåêàåì ïåðâûå ñèì
if (Head==Prefix)// Íàéäåí îáúåêò, ..
{
ObjectDelete(Obj_Name);
//Alert(Head+";"+Prefix);
}
}
}
//----------------------
string PeriodToStr(int Per)
{
switch(Per) // Ðàñ÷¸ò äëÿ..
{ // .. ðàçëè÷íûõ ÒÔ
case 1: return("M1"); break;// Òàéìôðåéì Ì1
case 5: return("M5"); break;// Òàéìôðåéì Ì5
case 15: return("M15"); break;// Òàéìôðåéì Ì15
case 30: return("M30"); break;// Òàéìôðåéì Ì30
case 60: return("H1"); break;// Òàéìôðåéì H1
case 240: return("H4"); break;// Òàéìôðåéì H4
case 1440: return("D1"); break;// Òàéìôðåéì D1
case 10080: return("W1"); break;// Òàéìôðåéì W1
case 43200: return("ÌN"); break;// Òàéìôðåéì ÌN
}
}
//----------------------
int DrawText( string name, datetime T, double P, string Text, color Clr=Green, int Win=0, int Fsize=10)
{
if (name=="") name="Text_"+T;
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name, OBJ_TEXT, Win, T, P);
}
ObjectSet(name, OBJPROP_TIME1, T);
ObjectSet(name, OBJPROP_PRICE1, P);
ObjectSetText(name, Text ,Fsize,"Arial",Clr);
}
//----------------------
int DrawRect(string name, datetime T1, double P1, datetime T2, double P2, color Clr, int W=1, string Text="", bool BACK=false, int Win=0)
{
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name, OBJ_RECTANGLE, Win,T1,P1,T2,P2);//ñîçäàíèå òðåíäîâîé ëèíèè
}
ObjectSet(name, OBJPROP_TIME1 ,T1);
ObjectSet(name, OBJPROP_PRICE1,P1);
ObjectSet(name, OBJPROP_TIME2 ,T2);
ObjectSet(name, OBJPROP_PRICE2,P2);
ObjectSet(name,OBJPROP_BACK, BACK);
ObjectSet(name,OBJPROP_STYLE,0);
ObjectSet(name, OBJPROP_COLOR , Clr);
ObjectSet(name, OBJPROP_WIDTH , W);
ObjectSetText(name,Text);
// WindowRedraw();
}
Comments