XPeriod





//+------------------------------------------------------------------+
//|                                                      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();
   }   



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: