//+------------------------------------------------------------------+
//|                                             System Info Dump.mq4 |
//+------------------------------------------------------------------+
#property show_inputs

#include <hanover --- function header (np).mqh>

extern string     OutputFileName     = "SystemInfo_[sym].TXT";
extern bool       AppendInfoToFile   = true;

string   optypes[6] = {"BUY","SELL","BUY LIMIT","SELL LIMIT","BUY STOP","SELL STOP"};

//+------------------------------------------------------------------+
int start()  {
//+------------------------------------------------------------------+
  OutputFileName = StringReplace(OutputFileName,"[sym]",Symbol());
  string out_text = StringRepeat("=",80) + "\nSYSTEM REGISTERS\n================\n" + DumpVars()
                  + "\n\nORDERS\n======\n" + ListOrders("OPCD")
                  + "\n\nOBJECTS\n=======\n" + ListObjects()
                  + "\n\nGLOBALS\n=======\n" + ListGlobals() + "\n" + StringRepeat("=",80);
  if (AppendInfoToFile)                  
    df(out_text);                
  else  
    ddf(out_text);                
  return(0);
}

//+------------------------------------------------------------------+
string DumpVars(string breakpoint_id="")   {
//+------------------------------------------------------------------+
//------------------------- System information
  string vars =                                                              "Chart                    [" + Symbol()+","+TFToStr(Period())+"]\n"              
              + DateToStr(TimeCurrent(),                                    "'MT4 time                 ['w D n Y H:I:S']\n'")
              + DateToStr(TimeLocal(),                                      "'Local time               ['w D n Y H:I:S']\n'")
              + StrToStr(err_msg(GetLastError()),                           "'Last error               ['T80']\n'")
              + DateToStr(MarketInfo(Symbol(),MODE_TIME),                   "'Last tick                ['w D n Y H:I:S']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_HIGH),                 "'High day price           ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_LOW),                  "'Low day price            ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_BID),                  "'Bid Price                ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_ASK),                  "'Ask Price                ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_SPREAD),               "'Spread (points)          ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_POINT),                "'Point                    ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_DIGITS),               "'Digits                   ['T-4']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),            "'Stop Level               ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_LOTSIZE),              "'Lot Size                 ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_TICKVALUE),            "'Tick Value (points)      ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_TICKSIZE),             "'Tick Size                ['T-4.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_SWAPLONG),             "'Swap Long                ['T-6.5']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),            "'Swap Short               ['T-6.5']\n'")
              + DateToStr(MarketInfo(Symbol(),MODE_STARTING),               "'Market starting date     ['w D n Y H:I:S']\n'")
              + DateToStr(MarketInfo(Symbol(),MODE_EXPIRATION),             "'Market expiration date   ['w D n Y H:I:S']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_TRADEALLOWED),         "'Trade Allowed            ['T-4']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MINLOT),               "'Minimum Lots             ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_LOTSTEP),              "'Lot Step                 ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MAXLOT),               "'Maximum Lots             ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_SWAPTYPE),             "'Swap Type                ['T-4']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_PROFITCALCMODE),       "'Profit calc mode         ['T-4']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MARGINCALCMODE),       "'Margin calc mode         ['T-4']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MARGININIT),           "'Init Margin              ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MARGINMAINTENANCE),    "'Margin Maint             ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MARGINHEDGED),         "'Hedged Margin            ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_MARGINREQUIRED),       "'Required Margin          ['T-9.3']\n'")
              + NumberToStr(MarketInfo(Symbol(),MODE_FREEZELEVEL),          "'Freeze Level             ['T-4.5']\n\n'")
              + NumberToStr(Bars,                                           "'Bars                     ['T-6']\n'")
              + NumberToStr(IndicatorCounted(),                             "'IndicatorCounted()       ['T-6']\n'")
              + NumberToStr(GetTickCount(),                                 "'GetTickCount()           ['T-12']\n'")
              + NumberToStr(GlobalVariablesTotal(),                         "'GlobalVariablesTotal()   ['T-6']\n'")
              + NumberToStr(OrdersTotal(),                                  "'OrdersTotal()            ['T-6']\n'")
              + NumberToStr(OrdersHistoryTotal(),                           "'OrdersHistoryTotal()     ['T-6']\n'")
              + NumberToStr(ObjectsTotal(),                                 "'ObjectsTotal()           ['T-6']\n\n'")
              + NumberToStr(WindowsTotal(),                                 "'WindowsTotal()           ['T-6']\n'")
              + NumberToStr(WindowHandle(Symbol(),Period()),                "'WindowHandle()           ['T-12']\n'")
              + NumberToStr(WindowBarsPerChart(),                           "'WindowBarsPerChart()     ['T-6']\n'")
              + NumberToStr(WindowFirstVisibleBar(),                        "'WindowFirstVisibleBar()  ['T-6']\n'")
              + StrToStr(WindowExpertName(),                                "'WindowExpertName()       ['L60']\n'")
              + NumberToStr(WindowPriceMax(),                               "'WindowPriceMax()         ['T-4.5']\n'")
              + NumberToStr(WindowPriceMin(),                               "'WindowPriceMin()         ['T-4.5']\n'")
              + NumberToStr(WindowPriceOnDropped(),                         "'WindowPriceOnDropped()   ['T-4.5']\n'")
              + DateToStr(WindowTimeOnDropped(),                            "'WindowTimeOnDropped()    ['w D n Y H:I:S']\n'")
              + NumberToStr(WindowXOnDropped(),                             "'WindowXOnDropped()       ['T-6']\n'")
              + NumberToStr(WindowYOnDropped(),                             "'WindowYOnDropped()       ['T-6']\n\n'")
              + StrToStr(TerminalCompany(),                                 "'Terminal Company         ['L60']\n'")
              + StrToStr(TerminalName(),                                    "'Terminal Name            ['L60']\n'")
              + StrToStr(TerminalPath(),                                    "'Terminal Path            ['T256']\n\n'")
              + StrToStr(AccountCompany(),                                  "'Account Company          ['L60']\n'")
              + StrToStr(AccountServer(),                                   "'Account Server           ['L60']\n'")
              + NumberToStr(AccountNumber(),                                "'Account Number           ['T-8']\n'")
//              + StrToStr(AccountName(),                                     "'Account Name             ['L60']\n'")
              + StrToStr(AccountCurrency(),                                 "'Account Currency         ['L20']\n'")
              + NumberToStr(AccountLeverage(),                              "'Account Leverage         ['T-8']\n'")
              + NumberToStr(AccountBalance(),                               "'Account Balance          ['T-,11.2']\n'")
              + NumberToStr(AccountEquity(),                                "'Account Equity           ['T-,11.2']\n'")
              + NumberToStr(AccountProfit(),                                "'Account Profit           ['T-,11.2']\n'")
              + NumberToStr(AccountCredit(),                                "'Account Credit           ['T-,11.2']\n'")
              + NumberToStr(AccountFreeMargin(),                            "'Account Free Margin      ['T-,11.2']\n'")
              + NumberToStr(AccountFreeMarginMode(),                        "'Account Margin Mode      ['T-4']\n'")
              + NumberToStr(AccountMargin(),                                "'Account Margin           ['T-,11.2']\n'")
              + NumberToStr(AccountStopoutLevel(),                          "'Account Stop Level       ['T-8']\n'")
              + NumberToStr(AccountStopoutMode(),                           "'Account Stop Mode        ['T-4']\n\n'")
              + NumberToStr(IsConnected(),                                  "'Connected                ['T-4']\n'")
              + NumberToStr(IsDemo(),                                       "'Demo                     ['T-4']\n'")
              + NumberToStr(IsDllsAllowed(),                                "'DLLs On                  ['T-4']\n'")
              + NumberToStr(IsExpertEnabled(),                              "'Experts On               ['T-4']\n'")
              + NumberToStr(IsLibrariesAllowed(),                           "'Libraries On             ['T-4']\n'")
              + NumberToStr(IsOptimization(),                               "'Optimization             ['T-4']\n'")
              + NumberToStr(IsStopped(),                                    "'Stopped                  ['T-4']\n'")
              + NumberToStr(IsTesting(),                                    "'Testing                  ['T-4']\n'")
              + NumberToStr(IsTradeAllowed(),                               "'Trade Allowed            ['T-4']\n'")
              + NumberToStr(IsTradeContextBusy(),                           "'Trade Context Busy       ['T-4']\n'")
              + NumberToStr(IsVisualMode(),                                 "'Visual Mode              ['T-4']\n'")
              + NumberToStr(UninitializeReason(),                           "'Uninitialize Reason      ['T-4']\n\n'")
//------------------------- Current order information                                                  
              + NumberToStr(OrderTicket(),                                  "'OrderTicket()            ['T-12']\n'") 
              + StrToStr(optypes[OrderType()],                              "'OrderType()              ['T20']\n'")
              + StrToStr(OrderStatus(OrderTicket()),                        "'OrderStatus(Ticket)      ['T20']\n'")
              + StrToStr(OrderSymbol(),                                     "'OrderSymbol()            ['T20']\n'")
              + NumberToStr(OrderLots(),                                    "'OrderLots()              ['R,-6.5']\n'") 
              + NumberToStr(OrderOpenPrice(),                               "'OrderOpenPrice()         ['R,-6.5']\n'") 
              + DateToStr(OrderOpenTime(),                                  "'OrderOpenTime()          ['w D n Y H:I:S']\n'")
              + NumberToStr(OrderClosePrice(),                              "'OrderClosePrice()        ['R,-6.5']\n'") 
              + DateToStr(OrderCloseTime(),                                 "'OrderCloseTime()         ['w D n Y H:I:S']\n'")
              + NumberToStr(OrderStopLoss(),                                "'OrderStopLoss()          ['R,-6.5']\n'") 
              + NumberToStr(OrderTakeProfit(),                              "'OrderTakeProfit()        ['R,-6.5']\n'") 
              + NumberToStr(OrderProfit(),                                  "'OrderProfit()            ['R,-6.5']\n'") 
              + NumberToStr(OrderCommission(),                              "'OrderCommission()        ['R,-6.5']\n'") 
              + NumberToStr(OrderSwap(),                                    "'OrderSwap()              ['R,-6.5']\n'") 
              + StrToStr(OrderComment(),                                    "'OrderComment()           ['T20']\n'")
              + NumberToStr(OrderMagicNumber(),                             "'OrderMagicNumber()       ['T-12']\n'") 
              + DateToStr(OrderExpiration(),                                "'OrderExpiration()        ['w D n Y H:I:S']\n\n'");

  return(vars);
}

//+------------------------------------------------------------------+
int df(string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="",
          string s9="", string s10="", string s11="", string s12="", string s13="", string s14="", string s15="")     {
//+------------------------------------------------------------------+
// Outputs up to 15 values to the debug file (after creating the file, if it doesn't already exist)
  string out = StringTrimRight(StringConcatenate(s1, " ", s2, " ", s3, " ", s4, " ", s5, " ", s6, " ", s7, " ", s8, " ", 
                                                 s9, " ", s10, " ", s11, " ", s12, " ", s13, " ", s14, " ", s15));
  int h = FileOpen(OutputFileName,FILE_CSV|FILE_READ|FILE_WRITE,'~');
  FileSeek(h,0,SEEK_END);
  FileWrite(h,out);
  FileClose(h);
  return(0);
}

//+------------------------------------------------------------------+
int ddf(string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="",
           string s9="", string s10="", string s11="", string s12="", string s13="", string s14="", string s15="")     {
//+------------------------------------------------------------------+
// Deletes and re-creates the debug file, and adds up to 15 values to it
  string out = StringTrimRight(StringConcatenate(s1, " ", s2, " ", s3, " ", s4, " ", s5, " ", s6, " ", s7, " ", s8, " ", 
                                                 s9, " ", s10, " ", s11, " ", s12, " ", s13, " ", s14, " ", s15));
  int h = FileOpen(OutputFileName,FILE_CSV|FILE_WRITE,'~');
  FileWrite(h,out);
  FileClose(h);
  return(0);
}

//+------------------------------------------------------------------+
#include <hanover --- extensible functions (np).mqh>

