[MQL4 Coding Help] Close All Trade X hours before MarketClose & Start taking after X hours when market open

shanmugapradeep

Active Trader
Dec 18, 2020
151
8
34
39
Hello,

I am trying to achieve two operation, On friday before market close, close all the open trade before X hour and On Monday after market open, Start taking new trade after X hour. I am trying like this

MQL4:
int MinuteToAvoid = 60;
void MarketHoursMonitor()
{
   datetime serverTime = TimeCurrent();
   int dayOfWeek = TimeDayOfWeek(serverTime);
   string dateToday = TimeToString(serverTime, TIME_DATE);
 
   //--------- Friday: Close all trades 1 hour before market close ---------//
   if (dayOfWeek == 5)
   {
      datetime marketCloseTime = StrToTime(dateToday + " 23:59");
      datetime closeAllTime = marketCloseTime - (MinuteToAvoid * 60); // 1 hour before close
 
      if (serverTime >= closeAllTime)
      {
        //Close the trade
      }
   }
 
   //--------- Monday: Print after 1 hour of market opening ---------//
   if (dayOfWeek == 1)
   {
      datetime marketOpenTime = StrToTime(dateToday + " 00:01");
      datetime oneHourAfterOpen = marketOpenTime + (MinuteToAvoid * 60); // 1 hour after open
 
      if (serverTime >= oneHourAfterOpen)
      {
         //Open the new trade
      }
   }
}

Main problem is Different broker have different timezone, This work according to broker timezone StrToTime(dateToday + " 23:59") and StrToTime(dateToday + " 00:01")


What should i do to make it work?
 
Use an input parameter for the closing and opening time and set it according to your broker when attaching the EA.
Is it possible to Automatic it without Input Parameters? Today i came across this documents https://docs.mql4.com/marketinformation/symbolinfosessiontrade

I am trying like this

MQL4:
extern int MinuteToAvoid = 60;
void MarketHoursMonitor()
{
   datetime serverTime = TimeCurrent();
   int dayOfWeek = TimeDayOfWeek(serverTime);
   datetime todayMidnight = StringToTime(TimeToString(serverTime, TIME_DATE) + " 00:00");
 
   datetime sessionOpenOffset, sessionCloseOffset;
   if (SymbolInfoSessionTrade(Symbol(), (ENUM_DAY_OF_WEEK)dayOfWeek, 0, sessionOpenOffset, sessionCloseOffset))
   {
      datetime realSessionOpen  = todayMidnight + sessionOpenOffset;
      datetime realSessionClose = todayMidnight + sessionCloseOffset;
 
      //--------- Friday: Close all trades 1 hour before market close ---------//
      if (dayOfWeek == 5 )
      {
         datetime closeAllTime = realSessionClose - (MinuteToAvoid * 60); // 1 hour before session close
 
         if (serverTime >= closeAllTime)
         {
            // Close trades
         }
      }
 
      //--------- Monday: Open after 1 hour of market opening ---------//
      if (dayOfWeek == 1 )
      {
         datetime oneHourAfterOpen = realSessionOpen + (MinuteToAvoid * 60); // 1 hour after session open
 
         if (serverTime >= oneHourAfterOpen)
         {
            // Open new trade or allow trading
         }
      }
   }
}

But still operation is not as expected
 
Last edited:
Did you check the time values that SymbolInfoSessionTrade is returning? Are they correct? Some broker may not be returning correct values there.

I tried like this

MQL4:
datetime serverTime = TimeCurrent();
   int dayOfWeek = TimeDayOfWeek(serverTime);
   datetime todayMidnight = StringToTime(TimeToString(serverTime, TIME_DATE) + " 00:00");
 
   datetime sessionOpen, sessionClose;
   if(SymbolInfoSessionTrade(Symbol(), FRIDAY, 0, sessionOpen, sessionClose))
     {
      datetime realSessionOpen  = todayMidnight + sessionOpen;
      datetime realSessionClose = todayMidnight + sessionClose;
 
      Print("Open : " + TimeToString(realSessionOpen, TIME_SECONDS) + " | Close : " + TimeToString(realSessionClose, TIME_SECONDS));
     }

Output :

Open : 01:02:00 | Close : 23:57:00

Output look fine. can you try my code and let me know what the problem?
 
I tried like this

MQL4:
datetime serverTime = TimeCurrent();
   int dayOfWeek = TimeDayOfWeek(serverTime);
   datetime todayMidnight = StringToTime(TimeToString(serverTime, TIME_DATE) + " 00:00");
 
   datetime sessionOpen, sessionClose;
   if(SymbolInfoSessionTrade(Symbol(), FRIDAY, 0, sessionOpen, sessionClose))
     {
      datetime realSessionOpen  = todayMidnight + sessionOpen;
      datetime realSessionClose = todayMidnight + sessionClose;
 
      Print("Open : " + TimeToString(realSessionOpen, TIME_SECONDS) + " | Close : " + TimeToString(realSessionClose, TIME_SECONDS));
     }

Output :

Open : 01:02:00 | Close : 23:57:00

Output look fine. can you try my code and let me know what the problem?
How exactly are you checking if your code works? Are you running it in a backtest?