Author: Copyright � 2006, sx ted
Price Data Components
Series array that contains open time of each bar
0 Views
0 Downloads
0 Favorites
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;
  } 
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---