Expert Advisors • Indicators • Scripts • Libraries

MQL.RobotFX.org is the biggest collection of MetaTrader expert advisors (MT5 & MT4), indicators, scripts and libraries that can be used to improve trading results, minimize risks or simply automate trading tasks

MetaTrader 5 Libraries | Check for Market Open Hours

The MarketOpenHours.mqh file checks the Market Open Hours against the server time at the broker. Its input is only the Symbol name as string type. As a result you get a bool, true - the market is open, false - the market is closed. In the following image i show the Open Hours of my broker DarwinEx for the symbol EURUSD.

MetaTrader Experts, Indicators, Scripts and Libraries

You can see how different these open times are on different weekdays. So here is your include file:

//+------------------------------------------------------------------+  //|                                              MarketOpenHours.mqh |  //|                                        Wolfgang Melz, wm1@gmx.de |  //|                                                 https://melz.one |  //+------------------------------------------------------------------+  #property copyright "Wolfgang Melz, wm1@gmx.de"  #property link      "https://melz.one"    //+------------------------------------------------------------------+  //| MarketOpenHours                                                  |  //+------------------------------------------------------------------+  bool MarketOpenHours(string sym) {    bool isOpen = false;                                  // by default market is closed    MqlDateTime mdtServerTime;                            // declare server time structure variable    datetime dtServerDateTime = TimeTradeServer();        // store server time     if(!TimeToStruct(dtServerDateTime,                    // is servertime correctly converted to struct?                     mdtServerTime)) {      return(false);                                      // no, return market is closed    }      ENUM_DAY_OF_WEEK today = (ENUM_DAY_OF_WEEK)           // get actual day and cast to enum                              mdtServerTime.day_of_week;      if(today > 0 || today < 6) {                          // is today in monday to friday?      datetime dtF;                                       // store trading session begin and end time      datetime dtT;                                       // date component is 1970.01.01 (0)      datetime dtServerTime = dtServerDateTime % 86400;   // set date to 1970.01.01 (0)      if(!SymbolInfoSessionTrade(sym, today,              // do we have values for dtFrom and dtTo?                                 0, dtF, dtT)) {        return(false);                                    // no, return market is closed      }      switch(today) {                                     // check for different trading sessions        case 1:          if(dtServerTime >= dtF && dtServerTime <= dtT)  // is server time in 00:05 (300) - 00:00 (86400)            isOpen = true;                                // yes, set market is open          break;        case 5:          if(dtServerTime >= dtF && dtServerTime <= dtT)  // is server time in 00:04 (240) - 23:55 (86100)            isOpen = true;                                // yes, set market is open          break;        default:          if(dtServerTime >= dtF && dtServerTime <= dtT)  // is server time in 00:04 (240) - 00:00 (86400)            isOpen = true;                                // yes, set market is open          break;      }    }    return(isOpen);  }    //+------------------------------------------------------------------+  

The first part checks for the weekday, Mon - Fri to allow opening trades and trailing stop during the week. In the switch command the actual server time is checked against the broker's symbol session.

Implications:

  • If you run this script on every tick or every minute, it will give the exact open hours according to the broker's server like you see in the above image.
  • If you run this script every 5 minutes on my broker account, it is correct only on Monday 00:05 - 00:00
  • If you run this script on the open of each new bar, the first bar of every weekday get false, market closed also for the last bar on Friday
  • If you run this script on PERIOD_D1, PERIOD_W1, PERIOD_MN1 it will not give a true signal for my broker because it runs at 00:00 and market open is at 00:04
Feel free to use it in your EA at your own risk and backtest well.
46597