periodgen





//+------------------------------------------------------------------+
//|                                                    periodgen.mq4 |
//|                                                     Igor Morozov |
//+------------------------------------------------------------------+
//| Quickly create historical data from M1 data. Change TIMESHIFT to |
//| shift time for your server.                                      |
//| Steps to create data:                                            |
//| 1. create subfolder .../experts/files/databank/                  |
//| 2. copy M1 data into databank and call M1_XXXXXX.hst             |
//|    (alpari format)                                               |
//| 3. attach script 'periodgen' to the same chart XXXXXX, frame     |
//|    doesn't matter                                                |
//| 4. It will create subfolder .../experts/files/databank/XXXXXX    |
//|    in which you will find all timeframes up to D1 will be        |
//|    generated                                                     |
//+------------------------------------------------------------------+
#property copyright "Igor Morozov"
#property link      ""
//----
#include <stdlib.mqh>
#define NUM_FILES 7
#define DATA_FOLDER "databank"
#define BS "\\"
#define TIMESHIFT 3 // timeshift in hours
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
// initialize
	  int i;
	  int iFile, lFile, pFile[7];
	  string iFileName = "M1_" + Symbol() + ".hst"; // alpari input file
	  string lFileName = Symbol() + BS + Symbol() + ".log";
	  int pTime[NUM_FILES];
	  double pOpen[NUM_FILES];
	  double pLow[NUM_FILES];
	  double pHigh[NUM_FILES];
	  double pClose[NUM_FILES];
	  double pVolume[NUM_FILES];
	  int pCount[NUM_FILES];
	  int pPeriod[NUM_FILES];
	  pPeriod[0] = PERIOD_M1;
	  pPeriod[1] = PERIOD_M5;
	  pPeriod[2] = PERIOD_M15;
	  pPeriod[3] = PERIOD_M30;
	  pPeriod[4] = PERIOD_H1;
	  pPeriod[5] = PERIOD_H4;
	  pPeriod[6] = PERIOD_D1;
	  string pFileName[NUM_FILES];
	  for(i = 0; i < NUM_FILES; i++)
		     pFileName[i] = Symbol() + BS + Symbol() + pPeriod[i] + ".hst";
   int f_Unused[13];
// open files
	  iFile = FileOpen(DATA_FOLDER + BS + iFileName, FILE_BIN|FILE_READ);
	  if(iFile < 0)
	    {
		     Print(iFileName, " Open Error: ", ErrorDescription(GetLastError()));
		     return(0);
	    }
	  lFile = FileOpen(DATA_FOLDER + BS + lFileName, FILE_CSV|FILE_WRITE, " ");
	  if(lFile < 0)
	    {
		     Print(lFileName, " Open Error: ", ErrorDescription(GetLastError()));
		     return(0);
	    }
	  if(FileSize(iFile) < 192)
	    {
		     Print(iFileName, " has no data");
		     return(0);
	    }
	  for(i = 0; i < NUM_FILES; i++)
	    {
		     pFile[i] = FileOpen(DATA_FOLDER + BS + pFileName[i], FILE_BIN|FILE_WRITE);
		     if(pFile[i] < 0)
		       {
			        Print(pFileName[i], " Open Error: ", ErrorDescription(GetLastError()));
			        return(0);
		       }
	    }
	  FileWrite(lFile, TimeToStr(TimeCurrent()));
	  FileWrite(lFile, "Creating all timeframes for", Symbol(), "from", 
	            DATA_FOLDER + BS + iFileName);
	  FileWrite(lFile, "Time Shift ", TIMESHIFT);
	  // read header
	  int f_Version = FileReadInteger(iFile);
	  string f_CopyRight = FileReadString(iFile, 64);
	  string f_Symbol = FileReadString(iFile, 12);
	  int f_Period = FileReadInteger(iFile);
	  int f_Digits = FileReadInteger(iFile);
	  int f_TimeStamp = FileReadInteger(iFile);
	  int f_Sync = FileReadInteger(iFile);
	  FileReadArray(iFile, f_Unused, 0, 13);
	  FileWrite(lFile, "*------------------------------------------------");
	  FileWrite(lFile, "Header Information copied:");
	  FileWrite(lFile, "   Version:", "\t", f_Version);
	  FileWrite(lFile, " CopyRight:", "\t", f_CopyRight);
	  FileWrite(lFile, "    Symbol:", "\t", f_Symbol);
	  FileWrite(lFile, "    Period:", "\t", f_Period);
	  FileWrite(lFile, "    Digits:", "\t", f_Digits);
	  FileWrite(lFile, "Time Stamp:", "\t", TimeToStr(f_TimeStamp));
	  FileWrite(lFile, "      Sync:", "\t", f_Sync);
	  FileWrite(lFile, "*------------------------------------------------");
	  // write output headers
	  for(i = 0; i < NUM_FILES; i++)
	    {
	      FileWriteInteger(pFile[i], f_Version, LONG_VALUE);
   	   FileWriteString(pFile[i], f_CopyRight, 64);
   	   FileWriteString(pFile[i], f_Symbol, 12);
   	   FileWriteInteger(pFile[i], pPeriod[i], LONG_VALUE);
   	   FileWriteInteger(pFile[i], f_Digits, LONG_VALUE);
   	   FileWriteInteger(pFile[i], TimeCurrent(), LONG_VALUE);       //timesign
   	   FileWriteInteger(pFile[i], f_Sync, LONG_VALUE);       //last_sync
   	   FileWriteArray(pFile[i], f_Unused, 0, 13);
	    }
	  // init timeframes
	  int iCount;
	  int tCount = (FileSize(iFile) - 148) / 44;
   int f_Time = FileReadInteger(iFile) + TIMESHIFT*3600;
   double f_Open = FileReadDouble(iFile);
   double f_Low = FileReadDouble(iFile);
   double f_High = FileReadDouble(iFile);
   double f_Close = FileReadDouble(iFile);
   double f_Volume = FileReadDouble(iFile);
   iCount++;
	  FileWrite(lFile, "Start Time: ", TimeToStr(f_Time));
   for(i = 0; i < NUM_FILES; i++)
     {
 	     pTime[i] = f_Time - f_Time % (pPeriod[i]*60);
 	     pOpen[i] = f_Open;
 	     pLow[i] = f_Low;
 	     pHigh[i] = f_High;
 	     pClose[i] = f_Close;
 	     pVolume[i] = f_Volume;
     }
	  // creation loop	
   //	int testcount;
	  while(true)
	    {
		     bool isEndOfFile = FileTell(iFile) >= FileSize(iFile) - 1;
		     if(!isEndOfFile)
		       {
	   	      f_Time =FileReadInteger(iFile) + TIMESHIFT*3600;
	   	      f_Open =FileReadDouble(iFile);
   		      f_Low =FileReadDouble(iFile);
   		      f_High =FileReadDouble(iFile);
	   	      f_Close =FileReadDouble(iFile);
   		      f_Volume =FileReadDouble(iFile);
   		      iCount++;
	   	      if(iCount % 100000 == 0)
   			         Print(DoubleToStr(iCount*100.0 / tCount, 0), "% processed");
   	     }
   	   for(i = 0; i < NUM_FILES; i++)
   	     {
   		      int newtime = f_Time - f_Time % (pPeriod[i]*60);
   		      if(newtime != pTime[i] || isEndOfFile)
   		        {
	              FileWriteInteger(pFile[i], pTime[i]);
   	           FileWriteDouble(pFile[i], pOpen[i]);
      	        FileWriteDouble(pFile[i], pLow[i]);
         	     FileWriteDouble(pFile[i], pHigh[i]);
	              FileWriteDouble(pFile[i], pClose[i]);
   	           FileWriteDouble(pFile[i], pVolume[i]);
   	           pCount[i]++;
   	           if(pCount[i] % 100000 == 0)
   	      	        FileFlush(pFile[i]);
   	           if(!isEndOfFile)
   	             {
		   		            pTime[i] = newtime;
   				            pOpen[i] = f_Open;
		   		            pLow[i] = f_Low;
   				            pHigh[i] = f_High;
		   		            pClose[i] = f_Close;
   				            pVolume[i] = f_Volume;
   			           }
   		        }
   		      else
   		        {
   			         pClose[i] = f_Close;
   			         if(pLow[i] > f_Low)
   				            pLow[i] = f_Low;
   			         if(pHigh[i] < f_High)
   				            pHigh[i] = f_High;
   			         pVolume[i] += f_Volume;
   		        }
   	     }
   	   if(isEndOfFile)
   		  break;
	    }
	  // finish up
	  FileWrite(lFile, "  End Time: ", TimeToStr(f_Time));
	  FileWrite(lFile, "*------------------------------------------------");
	  FileWrite(lFile, "Records Processed (" + Symbol() + "1): ", iCount);
	  FileWrite(lFile, "Records Created:");
	  for(i = 0; i < NUM_FILES; i++)
		     FileWrite(lFile, Symbol() + pPeriod[i] + ":", pCount[i]);
   FileClose(iFile);
   FileClose(lFile);
   for(i = 0; i < NUM_FILES; i++)
 	     FileClose(pFile[i]);
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar
Series array that contains tick volumes of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

Uses files from the file system

It writes information to file
It reads information from a file