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