//+------------------------------------------------------------------+
//|                                                   SymbolMeta.mqh |
//+------------------------------------------------------------------+
#ifndef SYMBOLMETA_MQH
#define SYMBOLMETA_MQH

//+------------------------------------------------------------------+
//| One contiguous trading session window within a single day        |
//+------------------------------------------------------------------+
struct SSessionWindow
  {
   ENUM_DAY_OF_WEEK  day_of_week;
   int               start_seconds;
   int               end_seconds;
  };

//+------------------------------------------------------------------+
//| Cached contract specification and session schedule for a symbol  |
//+------------------------------------------------------------------+
struct SSymbolMeta
  {
   string                  symbol;
   int                     digits;
   double                  point;
   double                  tick_size;
   double                  tick_value;
   double                  lot_step;
   double                  lot_min;
   double                  lot_max;
   double                  contract_size;
   double                  margin_initial;
   string                  currency_base;
   string                  currency_profit;
   string                  currency_margin;
   ENUM_SYMBOL_TRADE_MODE  trade_mode;
   SSessionWindow          sessions[];
   bool                    is_valid;

   void                    Print(void) const;
  };

//+------------------------------------------------------------------+
//| Write all fields of this record to the Experts tab               |
//+------------------------------------------------------------------+
void SSymbolMeta::Print(void) const
  {
   ::Print("--- SSymbolMeta: ", symbol, " ---");
   ::PrintFormat("  digits=%d  point=%.5f  tick_size=%.5f  tick_value=%.5f",
                 digits, point, tick_size, tick_value);
   ::PrintFormat("  lot_step=%.2f  lot_min=%.2f  lot_max=%.2f  contract_size=%.2f",
                 lot_step, lot_min, lot_max, contract_size);
   ::PrintFormat("  margin_initial=%.2f  currencies=%s/%s/%s  trade_mode=%d",
                 margin_initial, currency_base, currency_profit,
                 currency_margin, (int)trade_mode);
   ::PrintFormat("  sessions=%d  is_valid=%s",
                 ::ArraySize(sessions), (is_valid ? "true" : "false"));

   for(int i = 0; i < ::ArraySize(sessions); i++)
     {
      ::PrintFormat("    day=%d  start=%ds  end=%ds",
                    (int)sessions[i].day_of_week,
                    sessions[i].start_seconds,
                    sessions[i].end_seconds);
     }
  }

#endif // SYMBOLMETA_MQH
//+------------------------------------------------------------------+