TR_EUR





//+------------------------------------------------------------------+
//|                                                        TR_EU.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, sx ted"
#property indicator_chart_window

//---- input parameters
extern color ShadeColor    =DarkSlateGray;
extern bool  SetImmediacyON=true; // if set ON forces shading after first tick in new session

extern int  MAX_DAYS_TO_SHADE=2;     // maximum number of days back from last chart date to be shaded

// my session
extern int SESSION_OPEN_HH =08;     // session open hour
extern int SESSION_OPEN_MM =00;     // session open minutes
extern int SESSION_CLOSE_HH=18;     // session close hour
extern int SESSION_CLOSE_MM=30;     // session close minutes
double     dLow, dHigh, TR; 

//---- global variables to program
string   obj[],                  // array of object names
         sName,                  // name for the object
         sStart;                 // session open time HH:Mi
datetime tStart;                 // session open date+time
int      iSessionDuration,       // session duration in seconds
         iStart=-1, iEnd;        // x co-ordinates of object (index)

datetime tTrueStart;             // if SetImmediacyON keep track of correct start datetime
int      iExtra=0;               // forces shading if SetImmediacyON and value is set to 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if(Period() > PERIOD_H4) return(0); // no shading required
   // determine open time of first bar in the session matching chart time frame:
   sStart=" "+TimeToStr(StrToTime("2006.5.22")+(MathFloor((SESSION_OPEN_HH*60+SESSION_OPEN_MM)/Period())*Period())*60, TIME_MINUTES);
   // calculate session duration, check if session covers two days (cater for GMT+3 and above)
   if(SESSION_OPEN_HH*60+SESSION_OPEN_MM >= SESSION_CLOSE_HH*60+SESSION_CLOSE_MM) iSessionDuration = ((23-SESSION_OPEN_HH+SESSION_CLOSE_HH)*60+59-SESSION_OPEN_MM+SESSION_CLOSE_MM+1)*60;
   else iSessionDuration = ( (SESSION_CLOSE_HH*60+SESSION_CLOSE_MM) - (SESSION_OPEN_HH*60+SESSION_OPEN_MM) )*60;
   // round session duration to suit chart time frame
   datetime tNewStart=StrToTime(TimeToStr(Time[0], TIME_DATE)+sStart);
   datetime tNewEnd  =StrToTime(TimeToStr(Time[0], TIME_DATE)+" "+DoubleToStr(SESSION_OPEN_HH ,0)+":"+DoubleToStr(SESSION_OPEN_MM ,0))+iSessionDuration;
   iSessionDuration  =MathRound((tNewEnd-tNewStart)/Period())*Period();   
   // find first bar at or nearest to start of first day to shade
   int iCount=0;
   for(int i=0; i < Bars; i++)
     {
      tNewStart=StrToTime(TimeToStr(Time[i], TIME_DATE)+sStart);
      if(Time[i] >= tNewStart && Time[i] < tNewStart+iSessionDuration)
        {
         if(TimeToStr(Time[i], TIME_DATE) != sName)   // new session
           {
            sName=TimeToStr(Time[i], TIME_DATE);
            iCount++;
            if(iCount > MAX_DAYS_TO_SHADE) break; 
           }
         iStart=i;
        }
     }
   iCount=iStart;
   iStart=-1;
   sName="";
   // shade previous sessions and current session if started
   for(i=iCount; i >= 0; i--)
     {
      tNewStart=StrToTime(TimeToStr(Time[i], TIME_DATE)+sStart);
      if(Time[i] >= tNewStart && Time[i] < tNewStart+iSessionDuration)
        {
         if(TimeToStr(Time[i], TIME_DATE) == sName)   // current session
           {
            dLow =MathMin(dLow,  Low[i]);
            dHigh=MathMax(dHigh, High[i]);
           }
         else                                         // new session started
           {
            sName =TimeToStr(Time[i], TIME_DATE);
            tStart=tNewStart;
            iStart=i;
            dLow  =Low[i];
            dHigh =High[i];
           }
         iEnd=i;  
        }
      else if(iStart > -1)
        {
         Comment (Low,High);
         CreateRectangle(true);
         iStart=-1;
        }  
     }
   if(iStart > -1) CreateRectangle(true); // paint the last one if session not closed

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i=0; i < ArraySize(obj); i++)
     {
      if(ObjectFind(obj[i]) > -1) ObjectDelete(obj[i]); 
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if(Period() > PERIOD_H4) return(0); // no shading required
   // check if in current session
   if(Time[0] >= tStart && Time[0] < tStart+iSessionDuration)
     {
      // still in current session, so just widen the rectangle
      dLow =MathMin(dLow, Low[0]);
      dHigh=MathMax(dHigh, High[0]);
      ObjectSet(sName,OBJPROP_PRICE1,dLow-Point);
      ObjectSet(sName,OBJPROP_TIME2 ,Time[iEnd]);
      ObjectSet(sName,OBJPROP_PRICE2,dHigh+Point);
      if(iExtra == 1)
        {
         // determine if correct start time is among the bars
         int iShift=iBarShift(NULL, 0, tTrueStart, false);
         // reset to correct start time if rectangle length > 1
         if(iShift > 1) { ObjectSet(sName,OBJPROP_TIME1,Time[iShift]); iExtra=0; }
        }
      ObjectsRedraw();
     }
   else
     {
      // check if new session started
      datetime tNewStart=StrToTime(TimeToStr(iTime(NULL, PERIOD_D1, 0), TIME_DATE)+sStart);
      if( ( SetImmediacyON && ((Time[0] >= tNewStart && Time[0] < tNewStart+iSessionDuration) || (LocalTime() >= tNewStart && LocalTime() < tNewStart+iSessionDuration) ) ) ||
          (!SetImmediacyON &&   Time[0] >= tNewStart && Time[0] < tNewStart+iSessionDuration)
        )
        {
         // new session started
         sName =TimeToStr(iTime(NULL, PERIOD_D1, 0), TIME_DATE);
         tStart=tNewStart;
         iStart=0;
         iEnd  =0;
         dLow  =Low[0];
         dHigh =High[0];
         CreateRectangle(false);
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Create and paint rectangle                                       |
//+------------------------------------------------------------------+
void CreateRectangle(bool bCalledFromInit)
  {
   if(SetImmediacyON && iStart == iEnd)
     {
      tTrueStart=Time[iStart];
      iExtra++; // force shading
     }   
   sName="EUR_TR_"+sName;
   ObjectCreate(sName,OBJ_RECTANGLE,0,Time[iStart+iExtra],dLow-Point,Time[iEnd],dHigh+Point);
   ObjectSet(sName,OBJPROP_COLOR,ShadeColor);
   // keep track of object names for tidying up upon exit
   int iCount=ArraySize(obj);
   if(bCalledFromInit || iCount < MAX_DAYS_TO_SHADE) ArrayResize(obj, iCount+1);
   else if(ObjectFind(obj[iCount-1]) > -1) ObjectDelete(obj[iCount-1]); // delete last one to respect MAX_DAYS_TO_SHADE
   for(int i = ArraySize(obj)-1; i > 0; i--)
     {
      obj[i]=obj[i-1]; // shuffle object names down and losing one
     }
   obj[0]=sName;
  } 
//+------------------------------------------------------------------+



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


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: