Search code examples
csvmql4mt4

Issue with MT4 OHLC to .CSV file


Newb here.

I downloaded this indicator to extract OHLC from MT4 client terminal.
It seemed fine at first, but:
1. It saves data with 2 decimal places only;
2. It doesn't save the OHLC for all instruments.

Can someone give me a hand with the right set of code?

I am attaching the code that I downloaded from the net and the results that drive me nuts. enter image description here

//+------------------------------------------------------------------+
//|                                        FXPT_ExportHistoryCSV.mq4 |
//|                                         modified by fxprotrader |
//|                                     http://www.fxpro-trader.com" |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, fxprotrader"
#property link      "http://www.fxpro-trader.com"
// #property show_inputs
//-------- HISTORY----------------
// v1.0 Initial release(12162012)
//--------------------------------
//----
 int handle;

 //number of bars to export per Symbol
//  int maxBars = 6418;
extern int maxBars = 200;
 //test first on several pairs
// string Currencies[] = {"EURUSD","AUDUSD","GBPUSD","EURJPY","GBPJPY","USDCAD"};
string Currencies[] = {"#Corn","#France40","#Germany30","#NaturalGas","#Oil","#UK100","#USA30","#USA500","#USTECH100",  "#Wheat",   "#XAGUSD",  "#XAUUSD",  "58.com",   "ABENGOA",  "ABNAmro",  "ADIDAS",   "ADIDAS",   "AGRICOLE", "AIB",  "AIRBUS",   "Albemarle",    "ALCATEL",  "ALCOA",    "ALIBABA",  "ALLIANZ",  "ALPHA",    "AlticeUSA",    "Aluminium",    "AMADEUS",  "AMAZON",   "AMD",  "AMEX", "AMOVIL",   "Amsterdam25",  "Anglo",    "APACHE",   "APPLE",    "APPLE.",   "ARCELOR",  "Arconic",  "ASTRAZENECA",  "ATnT", "AUDBRL",   "AUDCAD",   "AUDCAD!",  "AUDCAD.",  "AUDCHF",   "AUDCHF!",  "AUDCHF.",  "AUDCNH",   "AUDCZK",   "AUDDKK",   "AUDHKD",   "AUDHRK",   "AUDHUF",   "AUDILS",   "AUDINR",   "AUDJPY",   "AUDJPY!",  "AUDJPY.",  "AUDMXN",   "AUDNOK",   "AUDNZD",   "AUDNZD!",  "AUDNZD.",  "AUDPLN",   "AUDPNC",   "AUDRON",   "AUDRUB",   "AUDSEK",   "AUDSGD",   "AUDTRY",   "AUDUSD",   "AUDUSD!",  "AUDUSD.",  "AUDZAR",   "Autodesk", "AVAGO",    "AVOLON",   "BAIDU",    "BancoBPM", "BASF", "BAYER",    "BBBeyond", "BBVA", "BerkshireB",   "BestBuy",  "Billiton", "BITCOIN",  "BITCOIN-D",    "BITCOIN-M",    "BITCOIN-W",    "BlackBerry",   "BMO",  "BMPS", "BMPSIENA", "BMW",  "BNPEU",    "BOA",  "BOEING",   "BP",   "BrentOil", "BRLJPY",   "BRLPLN",   "BTCUSD",   "Burberry", "BUZZI",    "CADBRL",   "CADCHF",   "CADCHF.",  "CADCNH",   "CADDKK",   "CADHKD",   "CADHRK",   "CADHUF",   "CADILS",   "CADINR",   "CADJPY",   "CADJPY.",  "CADMXN",   "CADNOK",   "CADPLN",   "CADRON",   "CADRUB",   "CADSEK",   "CADSGD",   "CADTRY",   "CADZAR",   "CAP",  "CARREFOUR",    "CATERPILLAR",  "CEMEX",    "CEZ",  "CHFJPY",   "CHFJPY.",  "CHFPLN",   "CHFPLN.",  "ChildrensPl",  "China300ETF",  "China50",  "ChinaMob", "CISCO",    "CitiGroup",    "CNHJPY",   "COCACOLA", "Cocoa",    "Cocoa!",   "Cocoa!",   "Coffee",   "Coffee!",  "Coffee!",  "Cognex",   "COMMERZBANK",  "Copper",   "CoreCivic",    "Corn", "Corn!",    "Corn!",    "Costco",   "Cotton",   "Cotton!",  "Ctrip.com",    "CZKPLN",   "DAIMLER",  "DanskeBank",   "DaveBuster",   "Deere",    "Denmark20",    "DeutschBank",  "DeutscheTel",  "DeutscheTel",  "Diamond",  "DIGICEL",  "DISNEY",   "DKKJPY",   "DKKPLN",   "DNB",  "doBank",   "Dollarindex",  "easyJet",  "EBAY", "EDF",  "EEE",  "ELECTRICA",    "Ellaktor", "ELPE", "EMPRESAS", "ENAGAS",   "ENEL", "ENI",  "EOAN", "Ericsson", "ERSTE",    "ETE",  "EURAUD",   "EURAUD!",  "EURAUD.",  "EURBRL",   "EURCAD",   "EURCAD!",  "EURCAD.",  "EURCHF",   "EURCHF!",  "EURCHF.",  "EURCNH",   "EURCZK",   "EURCZK.",  "EURDKK",   "EURDKK.",  "EURGBP",   "EURGBP!",  "EURGBP.",  "EURHKD",   "EURHRK",   "EURHUF",   "EURHUF.",  "EURILS",   "EURINR",   "EURJPY",   "EURJPY!",  "EURJPY.",  "EURMXN",   "EURNOK",   "EURNOK.",  "EURNZD",   "EURNZD.",  "EUROPCAR", "EUROPCAR", "Europe50", "EURPLN",   "EURPLN.",  "EURPNC",   "EURRON",   "EURRON.",  "EURRUB",   "EURSEK",   "EURSEK.",  "EURSGD",   "EURTRY",   "EURTRY.",  "EURUSD",   "EURUSD!",  "EURUSD.",  "EURZAR",   "Expedia",  "ExxonMobil",   "Facebook", "FAURECIA", "FCA",  "FERRARI",  "FIAT", "FirstData",    "FITBIT",   "FOMENTO",  "France40", "FSOLAR",   "GAMESA",   "GameStop", "Gap",  "GAZPROM",  "GBPAUD",   "GBPAUD!",  "GBPAUD.",  "GBPCAD",   "GBPCAD!",  "GBPCAD.",  "GBPCHF",   "GBPCHF!",  "GBPCHF.",  "GBPCNH",   "GBPCZK",   "GBPDKK",   "GBPHKD",   "GBPHRK",   "GBPHUF",   "GBPILS",   "GBPJPY",   "GBPJPY!",  "GBPJPY.",  "GBPMXN",   "GBPNOK",   "GBPNZD",   "GBPNZD.",  "GBPPLN",   "GBPRON",   "GBPRON.",  "GBPRUB",   "GBPSEK",   "GBPSGD",   "GBPSGD.",  "GBPTRY",   "GBPTRY.",  "GBPUSD",   "GBPUSD!",  "GBPUSD.",  "GBPZAR",   "GE",   "GEMALTO",  "GENERALI", "GER10YBond",   "germany30",    "GILEAD",   "Gilt10Y",  "GLENCORE", "GM",   "GoDaddy",  "GolarLNG", "GoldmnSachs",  "GOOGLE",   "GoPro",    "Greece20", "GRIFOLS",  "Grivalia", "Groupon",  "GRUMA",    "Handelsbank",  "Harley",   "HEINEKEN", "HEINEKEN", "Hermes",   "HewlettEnt",   "HILTON",   "HKDJPY",   "HKDPLN",   "HongKong45",   "HP",   "HRKJPY",   "HSBC", "HTO",  "HUBSPOT",  "HUFJPY",   "HUFPLN",   "IBERDROLA",    "IBM",  "Ikang",    "ILIAD",    "ILSBRL",   "ILSCNH",   "ILSCZK",   "ILSDKK",   "ILSHKD",   "ILSHUF",   "ILSINR",   "ILSJPY",   "ILSMXN",   "ILSNOK",   "ILSPLN",   "ILSPNC",   "ILSRON",   "ILSRUB",   "ILSSEK",   "ILSSGD",   "ILSTRY",   "ILSZAR",   "India50",  "INDITEX",  "INDRA",    "INFINEON", "INTEL",    "INTESA",   "Intuit",   "Italy40",  "JABIL",    "Japan225", "JAZZTEL",  "JCPenney", "JCPenney", "JD.com",   "JIMMYCHOO",    "JPMorgan", "JPN10yBond",   "JPYINR",   "Jumbo",    "K+S",  "K+S",  "KGHM", "KING", "KirbyCorp",    "KOMERCNI", "KRAFT",    "LEVTST",   "Line", "LineCorp", "LINKEDIN", "LionsGate",    "Lloyds",   "LockheedM",    "LUFTHANSA",    "LukoilUSD",    "Lululemon",    "LVMH", "Macys",    "MAGNIT",   "MANU", "MARRIOTT", "MARVELL",  "Mastercard",   "Match",    "McDonalds",    "MEGAFON",  "METRO",    "MGM",  "MICHELIN", "MICRON",   "MICROSOFT",    "MOL",  "MOMO", "MONDELEZ", "Moneta",   "MONSANTO", "MorganStan",   "Moscow50", "MotorOil", "MsciMexico",   "MSCITaiwan",   "MTELEKOM", "MTN",  "MXNJPY",   "MXNPLN",   "Mytilineos",   "Mytilineos",   "NaturalGas",   "NESTLE",   "NETFLIX",  "NewOriental",  "NIKE", "Nintendo", "NintendoJP",   "NOBLE",    "NOKIA",    "NOKJPY",   "NOKPLN",   "Norway25", "NovoNord", "Novozymes",    "NUANCE",   "NWR",  "NZDCAD",   "NZDCAD.",  "NZDCHF",   "NZDCHF.",  "NZDJPY",   "NZDJPY.",  "NZDUSD",   "NZDUSD!",  "NZDUSD.",  "Oil",  "OPAP", "ORACLE",   "OrangeFR", "OTP",  "Palladium",    "PartyCity",    "PayPal",   "PEKAO",    "PepsiCo",  "PetroChina",   "PetrolBras",   "PEUGEOT",  "PEUGEOT",  "PFIZER",   "PGE",  "PHILIPS",  "PIRELLI",  "PKNORLEN", "PKOBP",    "Platinum", "Play", "PLNCNH",   "PLNHRK",   "PLNINR",   "PLNJPY",   "PNCCAD",   "PNCJPY",   "PNCPLN",   "PNCUSD",   "Poland20", "POPOLARE", "POPULARESP",   "POSTEITALIA",  "POTASH",   "PPC",  "PRICELINE",    "PSBC", "PZU",  "Qualcomm", "QUNAR",    "RBS",  "REE",  "RegalBeloit",  "Renault",  "REPSOL",   "Rice", "RioTinto", "ROCKET",   "ROLLSROYCE",   "ROMGAZ",   "RONJPY",   "RONPLN",   "ROSNEFT",  "RUBJPY",   "RUBPLN",   "RWE",  "SABADELL", "SABMiller",    "SACYR",    "SafeBulkers",  "SAfrica40",    "SaintGobain",  "SALESFORCE",   "SAMSUNG",  "SANDISK",  "SANOFI",   "SANTANDER",    "SAP",  "Sasol",    "SBERBANK", "Scorpio",  "SEKJPY",   "SEKPLN",   "Severstal",    "SGDJPY",   "SGDPLN",   "ShakeShack",   "SHELL",    "SHOPIFY",  "SIEMENS",  "SINA", "Snap", "SOCIETE",  "SOLARCITY",    "SONY", "SouFun",   "soybeans", "Soybeans!",    "Soybeans!",    "Soybeans!",    "Spain35",  "Splunk",   "Square",   "STARBUCKS",    "Statoil",  "Sugar",    "Sweden30", "Swiss20",  "Sydney200",    "SYMANTEC", "Synaptics",    "Target",   "TDBank",   "TECK", "TECK.",    "TECK.",    "TELECOMITAL",  "TELEFONESP",   "TELEFONICA",   "Telenor",  "TeliaSonera",  "TerraForm",    "TESCO",    "TESLA",    "TEVA", "Tiffany",  "TitanCement",  "TOTAL",    "TOYOTA",   "TPSA", "TRIPADVISOR",  "TRYJPY",   "TRYPLN",   "Twilio",   "TWITTER",  "UBS",  "UK100",    "Unicredit",    "UNISTEEL", "US10YNote",    "US30YBond",    "USA2000",  "USA30",    "USA500",   "USDBRL",   "USDCAD",   "USDCAD!",  "USDCAD.",  "USDCHF",   "USDCHF!",  "USDCHF.",  "USDCNH",   "USDCZK",   "USDCZK.",  "USDDKK",   "USDDKK.",  "USDHKD",   "USDHRK",   "USDHUF",   "USDHUF.",  "USDILS",   "USDINR",   "USDJPY",   "USDJPY!",  "USDJPY.",  "USDMXN",   "USDNOK",   "USDNOK.",  "USDPLN",   "USDPLN!",  "USDPLN.",  "USDRON",   "USDRON.",  "USDRUB",   "USDSEK",   "USDSEK.",  "USDSGD",   "USDSGD.",  "USDTRY",   "USDTRY.",  "USDZAR",   "USFoods",  "USTECH100",    "VA",   "VALE", "VestasWind",   "VIG",  "VINCI",    "Vipshop",  "VISA", "VIVENDI",  "vixx", "VODAFONE", "VolksWagen",   "Volvo",    "WALMART",  "WEIBO",    "WellsFargo",   "Wheat",    "Wheat!",   "Wheat!",   "WIZZ", "WOWO", "WPP",  "XAGUSD",   "XAGUSD.",  "XAUUSD",   "XAUUSD.",  "Xylem",    "YAHOO",    "YamanaGold",   "YANDEX",   "Yara", "Yelp", "YYInc",    "ZARJPY",   "ZARPLN",   "Zinc", "ZTO",  "ZYNGA",};
string dSymbol;
double Poin;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){

   if (Point==0.00001) Poin=0.0001;
   else {
      if (Point==0.001) Poin=0.01;
      else Poin=Point;
   }
  return(0);
  }
//+------------------------------------------------------------------+
//|  start function                                    |
//+------------------------------------------------------------------+
int start(){

 int count = ArraySize(Currencies);
 for (int ii=0; ii<count; ii++){
 dSymbol = Currencies[ii];   
 handle = FileOpen("Hist_"+dSymbol+"_"+Period()+".csv", FILE_BIN|FILE_WRITE);

if(handle < 1){
 Print("Err ", GetLastError());
return(0);
}
 WriteHeader();

for(int i = 0; i < maxBars - 1; i++){
 WriteDataRow(i);
}
 FileClose(handle);
}
 Alert("Done. "+maxBars+" bars generated "+TimeMonth(TimeLocal())+TimeDay(TimeLocal())+TimeYear(TimeLocal()) +"_"+TimeHour(TimeLocal())+TimeMinute(TimeLocal()));

return(0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void WriteData(string txt){

   FileWriteString(handle, txt,StringLen(txt));

return;
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void WriteHeader(){

 WriteData("Symbol,");
 WriteData("Date,");
 WriteData("DayOfWeek,");
 WriteData("DayOfYear,");
 WriteData("Open,");
 WriteData("High,");
 WriteData("Low,");
 WriteData("Close,");
 WriteData("RSI5,RSI11,MOM3_c,CCI11_c,");
 WriteData("\n");

  return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void WriteDataRow(int i){

 double  dSymTime, dSymOpen, dSymHigh, dSymLow, dSymClose, dSymVolume;
 int dDayofWk,dDayofYr,iDigits;
 dSymTime = (iTime(dSymbol,Period(),i));
 dDayofWk = (TimeDayOfWeek(dSymTime));
 dDayofYr = TimeDayOfYear(dSymTime);


 dSymOpen = (iOpen(dSymbol,Period(),i));

// if(TimeToStr(dSymTime, TIME_DATE)!= "1970."){
if(dSymOpen>0){
 WriteData(dSymbol+",");
 WriteData(TimeToStr(dSymTime, TIME_DATE|TIME_MINUTES)+",");

 iDigits=MarketInfo(Symbol(),MODE_DIGITS);
 dSymOpen = (iOpen(dSymbol,Period(),i));
 dSymHigh = (iHigh(dSymbol,Period(),i));
 dSymLow = (iLow(dSymbol,Period(),i));
 dSymClose = (iClose(dSymbol,Period(),i));
 dSymVolume = (iVolume(dSymbol,Period(),i));

//  int BarsInBox=8;

//  double PeriodHighest = High[iHighest(dSymbol,Period(),MODE_HIGH,BarsInBox+1,i)];
//  double PeriodLowest  =  Low[iLowest(dSymbol,Period(),MODE_LOW,BarsInBox+1,i)];
//  double PeriodRNG  =  (PeriodHighest-PeriodLowest)/Poin;
double RSI5_c  =  iRSI(NULL,0,5,PRICE_CLOSE,i);
double RSI5_p3  = iRSI(NULL,0,5,PRICE_CLOSE,i+3);
double MOM3_c  = iMomentum(NULL,0,21,PRICE_CLOSE,i);
double MOM3_p3  = iMomentum(NULL,0,21,PRICE_CLOSE,i+3);
double CCI11_c =  iCCI(NULL,0,5,PRICE_CLOSE,i);
double CCI11_p3 =  iCCI(NULL,0,5,PRICE_CLOSE,i+3);


 WriteData(dDayofWk+","+dDayofYr+",");
 WriteData(DoubleToStr(dSymOpen, iDigits)+",");
 WriteData(DoubleToStr(dSymHigh, iDigits)+",");
 WriteData(DoubleToStr(dSymLow, iDigits)+",");
//  WriteData(DoubleToStr(dSymClose, iDigits)+","+PeriodHighest+","+PeriodLowest+","+PeriodRNG);
 WriteData(DoubleToStr(dSymClose, iDigits)+","+DoubleToStr(RSI5_c,2)+","+DoubleToStr(RSI5_p3,2)+
 ","+DoubleToStr(MOM3_c,2)+","+DoubleToStr(MOM3_p3,2)+","+DoubleToStr(CCI11_c,2)+","+DoubleToStr(CCI11_p3,2)+",");
 WriteData("\n");
 }

 return;
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetPeriodName(){

   switch(Period()){

       case PERIOD_D1:  return("Day");
       case PERIOD_H4:  return("4_Hour");
       case PERIOD_H1:  return("Hour");
       case PERIOD_M1:  return("Minute");
       case PERIOD_M15: return("15_Minute");
       case PERIOD_M30: return("30_Minute");
       case PERIOD_M5:  return("5_Minute");
       case PERIOD_MN1: return("Month");
       case PERIOD_W1:  return("Week");
     }
  }

Fail to extract all OHLC data and saving w 2 decimal places


Solution

  • Principal flaw: a choice to design this as a CustomIndicator is bad

    The CustomIndicator-type of MQL4 code will hang-&-wait until a QUOTE message arrives from the Broker-side ( waiting thus for a first FxEvent to appear ... and it may never arrive ... so some other MQL4-code type would serve better ... )

    Decimal places:

    You ask others to help you, but it seems you have not at least tried to read your code, have you?

    You explicitly trimmed values to no more than 2 decimal places:

           WriteData( DoubleToStr( dSymClose, iDigits ) + ","
                    + DoubleToStr( RSI5_c,    2 )       + ","
                    + DoubleToStr( RSI5_p3,   2 )       + ","
                    + DoubleToStr( MOM3_c,    2 )       + ","
                    + DoubleToStr( MOM3_p3,   2 )       + ","
                    + DoubleToStr( CCI11_c,   2 )       + ","
                    + DoubleToStr( CCI11_p3,  2 )       + ","
                      );
    

    Next,
    your code "forgets" to work without inherited properties from current-graph, which excludes independence from that, which you need ( a USDJPY graph will yield 3 == MarketInfo( Symbol(), MODE_DIGITS ) for all instruments processed, just because you are on USDJPY graph.

           iDigits    = MarketInfo(  Symbol(),MODE_DIGITS );
           dSymOpen   = ( iOpen(    dSymbol,  Period(), i ) );
           dSymHigh   = ( iHigh(    dSymbol,  Period(), i ) );
           dSymLow    = ( iLow(     dSymbol,  Period(), i ) );
           dSymClose  = ( iClose(   dSymbol,  Period(), i ) );
           dSymVolume = ( iVolume(  dSymbol,  Period(), i ) );
    

    A similar error in concept comes from using all local-Graph-bound "default" values -- NULL, where dSymbol ought stand instead, 0 where a PERIOD_M1 or other explicit TimeFrame ought serve in a sufficiently robust way ... so some effort are to be spent on this ...

           double RSI5_c   =  iRSI(      NULL, 0,  5, PRICE_CLOSE, i   );
           double RSI5_p3  =  iRSI(      NULL, 0,  5, PRICE_CLOSE, i+3 );
           double MOM3_c   =  iMomentum( NULL, 0, 21, PRICE_CLOSE, i   );
           double MOM3_p3  =  iMomentum( NULL, 0, 21, PRICE_CLOSE, i+3 );
           double CCI11_c  =  iCCI(      NULL, 0,  5, PRICE_CLOSE, i   );
           double CCI11_p3 =  iCCI(      NULL, 0,  5, PRICE_CLOSE, i+3 );
    

    So,
    a careful re-design is in place, downloading a file is not a safe way to get a result for free and the author + [fxprotrader] did quite a poor level of a professional trading tool design.

    Better go into MQL4-Script type of code and remove all forgotten dependencies on the local-Graph properties. A more efficient processing of char-IO, using StringFormat( .., ..[, .. ] ) would also help a lot, not to mention a preventive check, if a named symbol indeed exists in the local-HistoryCenter database and/or handle the cases, where symbol exists, but not having pre-loaded data from Broker and mediate a resolution for such a case.

    // #property copyright "Copyright © 2012, fxprotrader" #property link      "http://www.fxpro-trader.com"
    // #property show_inputs
    
        // a number of bars to export per Symbol
       //  int    maxBars = 6418;
    extern int    maxBars =  200;
           int    handle;
           string dSymbol;
           double Poin;
    
     // test first on several pairs
    //     string Currencies[] = { "EURUSD", "AUDUSD", "GBPUSD", "EURJPY", "GBPJPY", "USDCAD" };
           string Currencies[] = { "#Corn",
                                   "#France40",
                                   "#Germany30",
                                   "#NaturalGas",
                                   "#Oil",
                                   "#UK100",
                                   "#USA30",
                                   "#USA500",
                                   "#USTECH100",
                                   "#Wheat",
                                   "#XAGUSD",
                                   "#XAUUSD",
                                   "58.com",
                                   "ABENGOA",
                                   "ABNAmro",  "ADIDAS",   "ADIDAS",   "AGRICOLE", "AIB",  "AIRBUS",   "Albemarle",    "ALCATEL",  "ALCOA",    "ALIBABA",  "ALLIANZ",  "ALPHA",    "AlticeUSA",    "Aluminium",    "AMADEUS",  "AMAZON",   "AMD",  "AMEX", "AMOVIL",   "Amsterdam25",  "Anglo",    "APACHE",   "APPLE",    "APPLE.",   "ARCELOR",  "Arconic",  "ASTRAZENECA",  "ATnT", "AUDBRL",   "AUDCAD",   "AUDCAD!",  "AUDCAD.",  "AUDCHF",   "AUDCHF!",  "AUDCHF.",  "AUDCNH",   "AUDCZK",   "AUDDKK",   "AUDHKD",   "AUDHRK",   "AUDHUF",   "AUDILS",   "AUDINR",   "AUDJPY",   "AUDJPY!",  "AUDJPY.",  "AUDMXN",   "AUDNOK",   "AUDNZD",   "AUDNZD!",  "AUDNZD.",  "AUDPLN",   "AUDPNC",   "AUDRON",   "AUDRUB",   "AUDSEK",   "AUDSGD",   "AUDTRY",   "AUDUSD",   "AUDUSD!",  "AUDUSD.",  "AUDZAR",   "Autodesk", "AVAGO",    "AVOLON",   "BAIDU",    "BancoBPM", "BASF", "BAYER",    "BBBeyond", "BBVA", "BerkshireB",   "BestBuy",  "Billiton", "BITCOIN",  "BITCOIN-D",    "BITCOIN-M",    "BITCOIN-W",    "BlackBerry",   "BMO",  "BMPS", "BMPSIENA", "BMW",  "BNPEU",    "BOA",  "BOEING",   "BP",   "BrentOil", "BRLJPY",   "BRLPLN",   "BTCUSD",   "Burberry", "BUZZI",    "CADBRL",   "CADCHF",   "CADCHF.",  "CADCNH",   "CADDKK",   "CADHKD",   "CADHRK",   "CADHUF",   "CADILS",   "CADINR",   "CADJPY",   "CADJPY.",  "CADMXN",   "CADNOK",   "CADPLN",   "CADRON",   "CADRUB",   "CADSEK",   "CADSGD",   "CADTRY",   "CADZAR",   "CAP",  "CARREFOUR",    "CATERPILLAR",  "CEMEX",    "CEZ",  "CHFJPY",   "CHFJPY.",  "CHFPLN",   "CHFPLN.",  "ChildrensPl",  "China300ETF",  "China50",  "ChinaMob", "CISCO",    "CitiGroup",    "CNHJPY",   "COCACOLA", "Cocoa",    "Cocoa!",   "Cocoa!",   "Coffee",   "Coffee!",  "Coffee!",  "Cognex",   "COMMERZBANK",  "Copper",   "CoreCivic",    "Corn", "Corn!",    "Corn!",    "Costco",   "Cotton",   "Cotton!",  "Ctrip.com",    "CZKPLN",   "DAIMLER",  "DanskeBank",   "DaveBuster",   "Deere",    "Denmark20",    "DeutschBank",  "DeutscheTel",  "DeutscheTel",  "Diamond",  "DIGICEL",  "DISNEY",   "DKKJPY",   "DKKPLN",   "DNB",  "doBank",   "Dollarindex",  "easyJet",  "EBAY", "EDF",  "EEE",  "ELECTRICA",    "Ellaktor", "ELPE", "EMPRESAS", "ENAGAS",   "ENEL", "ENI",  "EOAN", "Ericsson", "ERSTE",    "ETE",  "EURAUD",   "EURAUD!",  "EURAUD.",  "EURBRL",   "EURCAD",   "EURCAD!",  "EURCAD.",  "EURCHF",   "EURCHF!",  "EURCHF.",  "EURCNH",   "EURCZK",   "EURCZK.",  "EURDKK",   "EURDKK.",  "EURGBP",   "EURGBP!",  "EURGBP.",  "EURHKD",   "EURHRK",   "EURHUF",   "EURHUF.",  "EURILS",   "EURINR",   "EURJPY",   "EURJPY!",  "EURJPY.",  "EURMXN",   "EURNOK",   "EURNOK.",  "EURNZD",   "EURNZD.",  "EUROPCAR", "EUROPCAR", "Europe50", "EURPLN",   "EURPLN.",  "EURPNC",   "EURRON",   "EURRON.",  "EURRUB",   "EURSEK",   "EURSEK.",  "EURSGD",   "EURTRY",   "EURTRY.",  "EURUSD",   "EURUSD!",  "EURUSD.",  "EURZAR",   "Expedia",  "ExxonMobil",   "Facebook", "FAURECIA", "FCA",  "FERRARI",  "FIAT", "FirstData",    "FITBIT",   "FOMENTO",  "France40", "FSOLAR",   "GAMESA",   "GameStop", "Gap",  "GAZPROM",  "GBPAUD",   "GBPAUD!",  "GBPAUD.",  "GBPCAD",   "GBPCAD!",  "GBPCAD.",  "GBPCHF",   "GBPCHF!",  "GBPCHF.",  "GBPCNH",   "GBPCZK",   "GBPDKK",   "GBPHKD",   "GBPHRK",   "GBPHUF",   "GBPILS",   "GBPJPY",   "GBPJPY!",  "GBPJPY.",  "GBPMXN",   "GBPNOK",   "GBPNZD",   "GBPNZD.",  "GBPPLN",   "GBPRON",   "GBPRON.",  "GBPRUB",   "GBPSEK",   "GBPSGD",   "GBPSGD.",  "GBPTRY",   "GBPTRY.",  "GBPUSD",   "GBPUSD!",  "GBPUSD.",  "GBPZAR",   "GE",   "GEMALTO",  "GENERALI", "GER10YBond",   "germany30",    "GILEAD",   "Gilt10Y",  "GLENCORE", "GM",   "GoDaddy",  "GolarLNG", "GoldmnSachs",  "GOOGLE",   "GoPro",    "Greece20", "GRIFOLS",  "Grivalia", "Groupon",  "GRUMA",    "Handelsbank",  "Harley",   "HEINEKEN", "HEINEKEN", "Hermes",   "HewlettEnt",   "HILTON",   "HKDJPY",   "HKDPLN",   "HongKong45",   "HP",   "HRKJPY",   "HSBC", "HTO",  "HUBSPOT",  "HUFJPY",   "HUFPLN",   "IBERDROLA",    "IBM",  "Ikang",    "ILIAD",    "ILSBRL",   "ILSCNH",   "ILSCZK",   "ILSDKK",   "ILSHKD",   "ILSHUF",   "ILSINR",   "ILSJPY",   "ILSMXN",   "ILSNOK",   "ILSPLN",   "ILSPNC",   "ILSRON",   "ILSRUB",   "ILSSEK",   "ILSSGD",   "ILSTRY",   "ILSZAR",   "India50",  "INDITEX",  "INDRA",    "INFINEON", "INTEL",    "INTESA",   "Intuit",   "Italy40",  "JABIL",    "Japan225", "JAZZTEL",  "JCPenney", "JCPenney", "JD.com",   "JIMMYCHOO",    "JPMorgan", "JPN10yBond",   "JPYINR",   "Jumbo",    "K+S",  "K+S",  "KGHM", "KING", "KirbyCorp",    "KOMERCNI", "KRAFT",    "LEVTST",   "Line", "LineCorp", "LINKEDIN", "LionsGate",    "Lloyds",   "LockheedM",    "LUFTHANSA",    "LukoilUSD",    "Lululemon",    "LVMH", "Macys",    "MAGNIT",   "MANU", "MARRIOTT", "MARVELL",  "Mastercard",   "Match",    "McDonalds",    "MEGAFON",  "METRO",    "MGM",  "MICHELIN", "MICRON",   "MICROSOFT",    "MOL",  "MOMO", "MONDELEZ", "Moneta",   "MONSANTO", "MorganStan",   "Moscow50", "MotorOil", "MsciMexico",   "MSCITaiwan",   "MTELEKOM", "MTN",  "MXNJPY",   "MXNPLN",   "Mytilineos",   "Mytilineos",   "NaturalGas",   "NESTLE",   "NETFLIX",  "NewOriental",  "NIKE", "Nintendo", "NintendoJP",   "NOBLE",    "NOKIA",    "NOKJPY",   "NOKPLN",   "Norway25", "NovoNord", "Novozymes",    "NUANCE",   "NWR",  "NZDCAD",   "NZDCAD.",  "NZDCHF",   "NZDCHF.",  "NZDJPY",   "NZDJPY.",  "NZDUSD",   "NZDUSD!",  "NZDUSD.",  "Oil",  "OPAP", "ORACLE",   "OrangeFR", "OTP",  "Palladium",    "PartyCity",    "PayPal",   "PEKAO",    "PepsiCo",  "PetroChina",   "PetrolBras",   "PEUGEOT",  "PEUGEOT",  "PFIZER",   "PGE",  "PHILIPS",  "PIRELLI",  "PKNORLEN", "PKOBP",    "Platinum", "Play", "PLNCNH",   "PLNHRK",   "PLNINR",   "PLNJPY",   "PNCCAD",   "PNCJPY",   "PNCPLN",   "PNCUSD",   "Poland20", "POPOLARE", "POPULARESP",   "POSTEITALIA",  "POTASH",   "PPC",  "PRICELINE",    "PSBC", "PZU",  "Qualcomm", "QUNAR",    "RBS",  "REE",  "RegalBeloit",  "Renault",  "REPSOL",   "Rice", "RioTinto", "ROCKET",   "ROLLSROYCE",   "ROMGAZ",   "RONJPY",   "RONPLN",   "ROSNEFT",  "RUBJPY",   "RUBPLN",   "RWE",  "SABADELL", "SABMiller",    "SACYR",    "SafeBulkers",  "SAfrica40",    "SaintGobain",  "SALESFORCE",   "SAMSUNG",  "SANDISK",  "SANOFI",   "SANTANDER",    "SAP",  "Sasol",    "SBERBANK", "Scorpio",  "SEKJPY",   "SEKPLN",   "Severstal",    "SGDJPY",   "SGDPLN",   "ShakeShack",   "SHELL",    "SHOPIFY",  "SIEMENS",  "SINA", "Snap", "SOCIETE",  "SOLARCITY",    "SONY", "SouFun",   "soybeans", "Soybeans!",    "Soybeans!",    "Soybeans!",    "Spain35",  "Splunk",   "Square",   "STARBUCKS",    "Statoil",  "Sugar",    "Sweden30", "Swiss20",  "Sydney200",    "SYMANTEC", "Synaptics",    "Target",   "TDBank",   "TECK", "TECK.",    "TECK.",    "TELECOMITAL",  "TELEFONESP",   "TELEFONICA",   "Telenor",  "TeliaSonera",  "TerraForm",    "TESCO",    "TESLA",    "TEVA", "Tiffany",  "TitanCement",  "TOTAL",    "TOYOTA",   "TPSA", "TRIPADVISOR",  "TRYJPY",   "TRYPLN",   "Twilio",   "TWITTER",  "UBS",  "UK100",    "Unicredit",    "UNISTEEL", "US10YNote",    "US30YBond",    "USA2000",  "USA30",    "USA500",   "USDBRL",   "USDCAD",   "USDCAD!",  "USDCAD.",  "USDCHF",   "USDCHF!",  "USDCHF.",  "USDCNH",   "USDCZK",   "USDCZK.",  "USDDKK",   "USDDKK.",  "USDHKD",   "USDHRK",   "USDHUF",   "USDHUF.",  "USDILS",   "USDINR",   "USDJPY",   "USDJPY!",  "USDJPY.",  "USDMXN",   "USDNOK",   "USDNOK.",  "USDPLN",   "USDPLN!",  "USDPLN.",  "USDRON",   "USDRON.",  "USDRUB",   "USDSEK",   "USDSEK.",  "USDSGD",   "USDSGD.",  "USDTRY",   "USDTRY.",  "USDZAR",   "USFoods",  "USTECH100",    "VA",   "VALE", "VestasWind",   "VIG",  "VINCI",    "Vipshop",  "VISA", "VIVENDI",  "vixx", "VODAFONE", "VolksWagen",   "Volvo",    "WALMART",  "WEIBO",    "WellsFargo",   "Wheat",    "Wheat!",   "Wheat!",   "WIZZ", "WOWO", "WPP",  "XAGUSD",   "XAGUSD.",  "XAUUSD",   "XAUUSD.",  "Xylem",    "YAHOO",    "YamanaGold",   "YANDEX",   "Yara", "Yelp", "YYInc",    "ZARJPY",   "ZARPLN",   "Zinc", "ZTO",  "ZYNGA",
                                    };
    
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init(){
    
        if (        Point == 0.00001 ) Poin = 0.0001;
        else { if ( Point == 0.001   ) Poin = 0.01;
               else                    Poin = Point;
        }
        return( 0 );
        }
    //+------------------------------------------------------------------+
    //| start function                                    |
    //+------------------------------------------------------------------+
    int start(){
    
        int count = ArraySize( Currencies );
    
        for ( int ii = 0; ii < count; ii++ ){
    
              dSymbol = Currencies[ii];   
              handle  = FileOpen( "Hist_" + dSymbol + "_" + Period() + ".csv", FILE_BIN | FILE_WRITE );
    
              if ( handle < 1 ){
                   Print( "Err ", GetLastError() );
                   return( 0 );
              }
              WriteHeader();
    
              for ( int i = 0; i < maxBars - 1; i++ ){
                    WriteDataRow( i );
              }
              FileClose( handle );
         }
         Alert( "Done. "
              +  maxBars + " bars generated "
              +  TimeMonth( TimeLocal() )
              +  TimeDay(   TimeLocal() )
              +  TimeYear(  TimeLocal() )
              + "_"
              +  TimeHour(  TimeLocal() )
              +  TimeMinute(TimeLocal() )
                 );
    
         return( 0 );
         }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void WriteData( string txt ){
    
         FileWriteString( handle, txt, StringLen( txt ) );
    
         return;
         }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void WriteHeader(){
    
         WriteData( "Symbol," );
         WriteData( "Date," );
         WriteData( "DayOfWeek," );
         WriteData( "DayOfYear," );
         WriteData( "Open," );
         WriteData( "High," );
         WriteData( "Low," );
         WriteData( "Close," );
         WriteData( "RSI5,RSI11,MOM3_c,CCI11_c," );
         WriteData( "\n" );
    
         return;
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void WriteDataRow( int i ){
    
         double  dSymTime, dSymOpen, dSymHigh, dSymLow, dSymClose, dSymVolume;
         int     dDayofWk, dDayofYr, iDigits;
    
         dSymTime = ( iTime( dSymbol, Period(), i ) );
         dDayofWk = (  TimeDayOfWeek( dSymTime ) );
         dDayofYr =    TimeDayOfYear( dSymTime );
    
         dSymOpen = ( iOpen( dSymbol, Period(), i ) );
    
      // if (  TimeToStr( dSymTime, TIME_DATE ) != "1970." ){
         if (  dSymOpen >  0 ){
    
               WriteData( dSymbol + "," );
               WriteData( TimeToStr( dSymTime, TIME_DATE | TIME_MINUTES ) + "," );
    
               iDigits    = MarketInfo(  Symbol(),MODE_DIGITS );
               dSymOpen   = ( iOpen(    dSymbol,  Period(), i ) );
               dSymHigh   = ( iHigh(    dSymbol,  Period(), i ) );
               dSymLow    = ( iLow(     dSymbol,  Period(), i ) );
               dSymClose  = ( iClose(   dSymbol,  Period(), i ) );
               dSymVolume = ( iVolume(  dSymbol,  Period(), i ) );
    
           //  int    BarsInBox = 8;
    
           //  double PeriodHighest = High[iHighest( dSymbol, Period(), MODE_HIGH, BarsInBox + 1, i )];
           //  double PeriodLowest  = Low[ iLowest(  dSymbol, Period(), MODE_LOW,  BarsInBox + 1, i )];
           //  double PeriodRNG     = ( PeriodHighest - PeriodLowest ) / Poin;
    
               double RSI5_c   =  iRSI(      NULL, 0,  5, PRICE_CLOSE, i   );
               double RSI5_p3  =  iRSI(      NULL, 0,  5, PRICE_CLOSE, i+3 );
               double MOM3_c   =  iMomentum( NULL, 0, 21, PRICE_CLOSE, i   );
               double MOM3_p3  =  iMomentum( NULL, 0, 21, PRICE_CLOSE, i+3 );
               double CCI11_c  =  iCCI(      NULL, 0,  5, PRICE_CLOSE, i   );
               double CCI11_p3 =  iCCI(      NULL, 0,  5, PRICE_CLOSE, i+3 );
    
               WriteData( dDayofWk + "," + dDayofYr + "," );
    
               WriteData( DoubleToStr( dSymOpen,  iDigits ) + "," );
               WriteData( DoubleToStr( dSymHigh,  iDigits ) + "," );
               WriteData( DoubleToStr( dSymLow,   iDigits ) + "," );
    
           //  WriteData( DoubleToStr( dSymClose, iDigits ) + "," + PeriodHighest + "," + PeriodLowest + "," + PeriodRNG );
               WriteData( DoubleToStr( dSymClose, iDigits ) + ","
                        + DoubleToStr( RSI5_c,    2 )       + ","
                        + DoubleToStr( RSI5_p3,   2 )       + ","
                        + DoubleToStr( MOM3_c,    2 )       + ","
                        + DoubleToStr( MOM3_p3,   2 )       + ","
                        + DoubleToStr( CCI11_c,   2 )       + ","
                        + DoubleToStr( CCI11_p3,  2 )       + ","
                          );
               WriteData( "\n" );
         }
         return;
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    string GetPeriodName() {
    
       switch( Period() ){
    
           case PERIOD_D1:  return( "Day" );
           case PERIOD_H4:  return( "4_Hour" );
           case PERIOD_H1:  return( "Hour" );
           case PERIOD_M1:  return( "Minute" );
           case PERIOD_M15: return( "15_Minute" );
           case PERIOD_M30: return( "30_Minute" );
           case PERIOD_M5:  return( "5_Minute" );
           case PERIOD_MN1: return( "Month" );
           case PERIOD_W1:  return( "Week" );
           }
       }