//+------------------------------------------------------------------+
//|                                                  ICT_Tod+Dow.mq4 |
//|                                                          mwa mwa |
//|    Courtesies: Soheil's SK-Days_of_Week Indi & Market Hours Indi |
//+------------------------------------------------------------------+
#property copyright   "mwa mwa"
#property description "ICT Time of Day + Days of Week Indicator"
#property link        "free_to_modify_as_you.wish"
#property version     "1.0"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 12

#property		indicator_buffers 4
#property		indicator_color1 DeepSkyBlue
#property		indicator_width1 3
#property		indicator_color2 MediumOrchid
#property		indicator_width2 3
#property		indicator_color3 Tomato
#property		indicator_width3 3
#property		indicator_color4 Goldenrod
#property		indicator_width4 3

input string      shortname="ICT_Tod+Dow";
extern string     note1    = "== Time of Day input times: ==";
//extern string     Timeframes_in_Minutes_csv_ = "1,5,15,30,60";
extern double     LondonOpen		= 9;
extern double		LondonClose		= 12;
extern double		NewYorkOpen		= 15;
extern double		NewYorkClose	= 18;
extern double		SydneyOpen		= 16;
extern double		SydneyClose		= 17;
extern double		TokyoOpen		= 3;
extern double		TokyoClose		= 8;

extern string     note2    = "== Day of week input colours: ==";
extern int        BarCount=500;
extern string     Font="LeelawadeeUI";
extern int        FontSize=6;
//extern string     Timeframes_in_Minutes_csv = "1,5,15,30,60,240,1440,10080,43200";
extern color      TextColor_Mon = Gold;
extern color      TextColor_Tue = Lime;
extern color      TextColor_Wed = Gold;
extern color      TextColor_Thr = Lime;
extern color      TextColor_Fri = Gold;
extern color      TextColor_Sat = Lime;
extern color      TextColor_Sun = Gold;

//----Variables
string dayW;

// Buffers
double dLondonBuffer[];
double dNewYorkBuffer[];
double dSydneyBuffer[];
double dTokyoBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {

   IndicatorShortName("ICT_Tod+Dow");
   SetIndexBuffer(0,dLondonBuffer);
	SetIndexLabel(0,"London");
	SetIndexBuffer(1,dNewYorkBuffer);
	SetIndexLabel(1,"New York");
	SetIndexBuffer(2,dSydneyBuffer);
	SetIndexLabel(2,"Sydney");
	SetIndexBuffer(3,dTokyoBuffer);
	SetIndexLabel(3,"Tokyo");
        
   return(0);   }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i=0; i<Bars; i++)
     {
      ObjectDelete("Mon"+iTime(Symbol(),0,i));
      ObjectDelete("Tue"+iTime(Symbol(),0,i));
      ObjectDelete("Wed"+iTime(Symbol(),0,i));
      ObjectDelete("Thr"+iTime(Symbol(),0,i));
      ObjectDelete("Fri"+iTime(Symbol(),0,i));
      ObjectDelete("Sat"+iTime(Symbol(),0,i));
      ObjectDelete("Sun"+iTime(Symbol(),0,i));
     }
   return(1);
  } 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int counted_bars=IndicatorCounted();
   if(counted_bars < 0)  return(-1);
   if(counted_bars>0) counted_bars--;
   int i=Bars-counted_bars;
   if(counted_bars==0) i--;

   if(counted_bars<0 || BarCount<0) return(-1);

   while(i>=0) {
   //for (i>=0;i--) {

      if(TimeDayOfWeek(Time[i])==1 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Mon"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],4);
         ObjectSetText(dayW,"Mo "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Mon);
         ObjectSet(dayW,OBJPROP_TEXT,"Mo "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==2 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Tue"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],6);
         ObjectSetText(dayW,"Tu "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Tue);
         ObjectSet(dayW,OBJPROP_TEXT,"Tu "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==3 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Wed"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],8);
         ObjectSetText(dayW,"We "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Wed);
         ObjectSet(dayW,OBJPROP_TEXT,"We "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==4 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Thr"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],10);
         ObjectSetText(dayW,"Th "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Thr);
         ObjectSet(dayW,OBJPROP_TEXT,"Th "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==5 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Fri"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],12);
         ObjectSetText(dayW,"Fr "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Fri);
         ObjectSet(dayW,OBJPROP_TEXT,"Fr "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==6 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Sat"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],0);
         ObjectSetText(dayW,"Sa "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Sat);
         ObjectSet(dayW,OBJPROP_TEXT,"Sa "+TimeDay(iTime(Symbol(),0,i)));
        }

      if(TimeDayOfWeek(Time[i])==0 && TimeHour(Time[i])==0 && TimeMinute(Time[i])==0)
        {
         dayW="Sun"+iTime(Symbol(),0,i);
         ObjectCreate(dayW,OBJ_TEXT,ChartWindowFind(0,"ICT_Tod+Dow"),Time[i],2);
         ObjectSetText(dayW,"Su "+TimeDay(iTime(Symbol(),0,i)),FontSize,Font,TextColor_Sun);
         ObjectSet(dayW,OBJPROP_TEXT,"Su "+TimeDay(iTime(Symbol(),0,i)));
        }
      i--;
    }
   //return(0);
   
	// Determine number of bars to iterate over for Time of Day Indicator
	int iBarsToCalc = Bars - IndicatorCounted();
	if (iBarsToCalc < Bars) iBarsToCalc++;
	
	// Iterate over bars
	for (int j=iBarsToCalc-1;j>=0;j--) {
		
		// Set London Line
		if (isMarketOpen(LondonOpen, LondonClose, Time[j]))
			dLondonBuffer[j] = 4;
		else
			dLondonBuffer[j] = EMPTY_VALUE;
		
		// Set NewYork Line
		if (isMarketOpen(NewYorkOpen, NewYorkClose, Time[j]))
			dNewYorkBuffer[j] = 6;
		else
			dNewYorkBuffer[j] = EMPTY_VALUE;		
			
		// Set Sydney Line
		if (isMarketOpen(SydneyOpen, SydneyClose, Time[j]))
			dSydneyBuffer[j] = 4;
		else
			dSydneyBuffer[j] = EMPTY_VALUE;	
				
		// Set Tokyo Line
		if (isMarketOpen(TokyoOpen, TokyoClose, Time[j]))
			dTokyoBuffer[j] = 2;
		else
			dTokyoBuffer[j] = EMPTY_VALUE;	 }
			
      return (0);
  }
//+------------------------------------------------------------------+
//| Custom function for time of day above                            |
//|     Still looking for accurate close times & open times inputs   |                                                  |
//+------------------------------------------------------------------+ 
bool isMarketOpen(double iOpenHour, double iCloseHour, datetime timestamp) {

	double iBarHour = TimeHour(timestamp);
	
	if (iOpenHour < iCloseHour && (iBarHour >= iOpenHour && iBarHour <= iCloseHour))  
	//inputed opentime < inputed closetime &( bar hour >= inputed opentime & barhour <= inputed closehour )
		return(true);
	if (iOpenHour > iCloseHour || (iBarHour >= iOpenHour && iBarHour < iCloseHour))
		return(true);
		
	return(false);
}  