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.

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.