//+------------------------------------------------------------------+ //| Forex Sessions and Day Range Indicator | //+------------------------------------------------------------------+ #property copyright "Your Name" #property link "https://www.example.com" #property version "1.00" #property indicator_chart_window #include struct SessionInfo { string name; int startHour; // Standard start hour (GMT) int startMinute; int endHour; // Standard end hour (GMT) int endMinute; bool *isDST(datetime); // DST check function int dstAdjustment; // Hours to add during DST }; SessionInfo sessions[] = { {"Sydney", 21, 0, 5, 0, IsSydneyDST, 1}, {"Tokyo", 23, 0, 8, 0, IsTokyoDST, 0}, {"London", 7, 0, 15, 0, IsLondonDST, 1}, {"New York", 12, 0, 17, 0, IsNewYorkDST, 1} }; bool sessionActive[]; double sessionHigh[]; double sessionLow[]; datetime sessionStartTime[]; datetime sessionEndTime[]; double dayHigh = 0; double dayLow = 0; datetime dayStartTime; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { ArrayResize(sessionActive, ArraySize(sessions)); ArrayResize(sessionHigh, ArraySize(sessions)); ArrayResize(sessionLow, ArraySize(sessions)); ArrayResize(sessionStartTime, ArraySize(sessions)); ArrayResize(sessionEndTime, ArraySize(sessions)); for(int i=0; i= todayStart && currentTime < todayEnd) { if(!sessionActive[i]) { sessionActive[i] = true; sessionStartTime[i] = todayStart; sessionEndTime[i] = todayEnd; sessionHigh[i] = Bid; sessionLow[i] = Ask; } else { if(Bid > sessionHigh[i]) sessionHigh[i] = Bid; if(Ask < sessionLow[i]) sessionLow[i] = Ask; } } else { sessionActive[i] = false; } } // Check day range bool dstActiveNY = IsNewYorkDST(currentTime); int dayStartHour = dstActiveNY ? 21 : 22; datetime todayDayStart = StringToTime(TimeToString(currentTime, TIME_DATE) + " " + IntegerToString(dayStartHour) + ":00"); if(currentTime < todayDayStart) { todayDayStart -= 24 * 3600; } if(dayStartTime != todayDayStart) { dayStartTime = todayDayStart; dayHigh = Bid; dayLow = Ask; } else { if(Bid > dayHigh) dayHigh = Bid; if(Ask < dayLow) dayLow = Ask; } // Display information on chart string comment = "Active Forex Sessions:\n"; for(int i=0; i= dstStart && time < dstEnd; } bool IsNewYorkDST(datetime time) { int year = TimeYear(time); datetime march1 = StringToTime(year + ".03.01 00:00"); int dayOfWeekMarch1 = TimeDayOfWeek(march1); int secondSundayMarch = 1 + (7 - dayOfWeekMarch1) % 7 + 7; datetime dstStart = StringToTime(year + ".03." + IntegerToString(secondSundayMarch) + " 07:00"); datetime nov1 = StringToTime(year + ".11.01 00:00"); int dayOfWeekNov1 = TimeDayOfWeek(nov1); int firstSundayNov = 1 + (7 - dayOfWeekNov1) % 7; datetime dstEnd = StringToTime(year + ".11." + IntegerToString(firstSundayNov) + " 06:00"); return time >= dstStart && time < dstEnd; } bool IsSydneyDST(datetime time) { int year = TimeYear(time); datetime oct1 = StringToTime(year + ".10.01 00:00"); int dayOfWeekOct1 = TimeDayOfWeek(oct1); int firstSundayOct = 1 + (7 - dayOfWeekOct1) % 7; datetime dstStart = StringToTime(year + ".10." + IntegerToString(firstSundayOct) + " 13:00"); datetime apr1 = StringToTime(year + ".04.01 00:00"); int dayOfWeekApr1 = TimeDayOfWeek(apr1); int firstSundayApr = 1 + (7 - dayOfWeekApr1) % 7; datetime dstEnd = StringToTime(year + ".04." + IntegerToString(firstSundayApr) + " 15:00"); return time >= dstStart && time < dstEnd; } bool IsTokyoDST(datetime time) { return false; }