server_tz_changes

Author: Copyright © 2018, Amr Ali
0 Views
0 Downloads
0 Favorites
server_tz_changes
ÿþ//+------------------------------------------------------------------+

//|                                                server_tz_changes |

//|                                        Copyright © 2018, Amr Ali |

//|                             https://www.mql5.com/en/users/amrali |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2018, Amr Ali"

#property link      "https://www.mql5.com/en/users/amrali"

#property version "2.16"

#property description "Estimation of the server's TZ and DST changes based on week opening hours in history."

#property script_show_inputs



// Uncomment the following line to see debug messages

// #define PRINT_TZ_DETAILS

#include "TimeZoneInfo.mqh"



//--- input variables

input datetime StartDate =  D'2008.03.01';

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

   if((SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE) != SYMBOL_CALC_MODE_FOREX

       && SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE) != SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE

       && SymbolInfoInteger(_Symbol, SYMBOL_INDUSTRY) != INDUSTRY_COMMODITIES_PRECIOUS)

      || !(SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE) == "USD" || SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT) == "USD"))

     {

      Print("It's recommended to apply this script to a major Forex currency pair or precious Metal");

     }



   PrintFormat("%s ~ %s", AccountInfoString(ACCOUNT_COMPANY), AccountInfoString(ACCOUNT_SERVER));



   const int hour = 3600;

   const datetime from = fmax(StartDate, (datetime)SeriesInfoInteger(_Symbol, PERIOD_H1, SERIES_FIRSTDATE) + 5 * 24 * hour);

   const datetime to = (datetime)SeriesInfoInteger(_Symbol, PERIOD_H1, SERIES_LASTBAR_DATE);

   datetime array[];

   datetime prev_srvtime   = -1;

   datetime prev_utctime   = -1;

   int      prev_utcOffset = -1;

   int      prev_DST       = -1;



   ResetLastError();

   const int n = CopyTime(_Symbol, PERIOD_H1, from, to, array);

   if(n<=0)

     {

      Print("Unable to copy time. Error = ",GetLastError());

      return;

     }



   PrintFormat("Got %d H1 bars on %s, ~%d days [%s - %s]", n, _Symbol, n / 24, t2s(array[0]), t2s(array[n - 1]));



//--- use the current chart's symbol for estimation of the server's TZ/DST

   CTimeZoneInfo::SetUsingGoldSymbol(false);



   CTimeZoneInfo broker(ZONE_ID_BROKER);



   Print("Server TZ Changes: ");



   for(int i = 0; i < n; ++i)

     {

      broker.SetLocalTime(array[i]);



      int utcOffset = broker.TimeGMTOffset();

      int DST       = broker.TimeDaylightSavings();



      datetime srvtime = array[i];

      datetime utctime = array[i] - utcOffset;



      // Only show times when the offset change is detected

      if(utcOffset != prev_utcOffset)

        {

         PrintFormat("Server time = %s  | GMT = %s | Server time zone = GMT%+g %s",

                     t2s(srvtime),

                     t2s(utctime),

                     utcOffset/(double)hour,

                     DST ? "(DST)" : "");

        }



      // Save previous data

      prev_srvtime   = srvtime;

      prev_utctime   = utctime;

      prev_utcOffset = utcOffset;

      prev_DST       = DST;

     }



   Print("done.");

  }

//+------------------------------------------------------------------+

//| Formats time with the weekday name => "Wed, 2023.02.14 01:59"    |

//+------------------------------------------------------------------+

string t2s(const datetime t, const int mode = TIME_DATE | TIME_MINUTES)

  {

   const string days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

   const int i = ((int)((uint)t / 86400 + 4) % 7);  // i = DayOfWeek(t)

   return days[i % 7] + ", " + TimeToString(t, mode);

  }



//+------------------------------------------------------------------+

Comments