//+------------------------------------------------------------------+
//|                                                  Output History  |
//+------------------------------------------------------------------+

#property show_inputs

#include <hanover --- function header.mqh>

extern string    CurrencyPairs                     = "EURUSD";
extern string    TimeFrames                        = "H1";
extern bool      OutputHeaderLine                  = true;
extern bool      DescendingDateTimeOrder           = false;
extern bool      DifferentSubfolderPerTimeFrame    = false;
extern string    FieldSeparator                    = ",";
extern string    DateFormat                        = "M/D/Y";
extern string    TimeFormat                        = "H:I";
extern string    PriceFormat                       = "T3.5";
extern string    PriceFormatJPYpairs               = "T5.3";
extern string    VolumeFormat                      = "T10";

string P[40],T[9];
int    handle;

//+------------------------------------------------------------------+
int start()  {
//+------------------------------------------------------------------+
  int np = StrToStringArray(CurrencyPairs,P);
  int nt = StrToStringArray(TimeFrames,T);
  for (int i=0; i<np; i++)  {
    for (int j=0; j<nt; j++)  { 
      out_hist(ExpandCcy(P[i]),StrToTF(T[j]));
  } }    
  MessageBox("History output complete","Output History script");
  return(0);
}

//+------------------------------------------------------------------+
int out_hist(string ccy, int tf)  {
//+------------------------------------------------------------------+
  string fname = ccy + "," + TFToStr(tf) + ".csv";
  if (DifferentSubfolderPerTimeFrame)
    fname = "TF-" + TFToStr(tf) + "\\" + ccy + "," + TFToStr(tf) + ".csv";
  handle = FileOpen(fname, FILE_CSV|FILE_WRITE, ',');
  if (handle<0)    return(0);
  if (OutputHeaderLine)
    FileWrite(handle,"Date,Time,Open,High,Low,Close,Volume");
  if (DescendingDateTimeOrder)  {  
    for (int i=0; i<iBars(ccy,tf); i++)  {
      out_line(ccy,tf,i);
  } } else {
    for (i=iBars(ccy,tf)-1; i>=0; i--)   {
      out_line(ccy,tf,i);
  } }
  FileClose(handle);
  return(0);
}

//+------------------------------------------------------------------+
int out_line(string ccy, int tf, int i)  {
//+------------------------------------------------------------------+
  string OHLCFormat = PriceFormat;
  if (StringFind(ccy,"JPY") >= 0)
    OHLCFormat = PriceFormatJPYpairs;
  FileWrite(handle, DateToStr(iTime(ccy,tf,i),DateFormat)        + FieldSeparator
                  + DateToStr(iTime(ccy,tf,i),TimeFormat)        + FieldSeparator
                  + NumberToStr(iOpen(ccy,tf,i),OHLCFormat)      + FieldSeparator
                  + NumberToStr(iHigh(ccy,tf,i),OHLCFormat)      + FieldSeparator
                  + NumberToStr(iLow(ccy,tf,i),OHLCFormat)       + FieldSeparator
                  + NumberToStr(iClose(ccy,tf,i),OHLCFormat)     + FieldSeparator
                  + NumberToStr(iVolume(ccy,tf,i),VolumeFormat)  );
  return(0);
}

#include <hanover --- extensible functions.mqh>