//+------------------------------------------------------------------+ //| 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: