HistoryConverter

Author: 220Volt
Miscellaneous
Uses files from the file systemIt reads information from a fileIt reads information from a fileIt writes information to file
0 Views
0 Downloads
0 Favorites
HistoryConverter
//+------------------------------------------------------------------+
//|                                             HistoryConverter.mq4 |
//|                                                          220Volt |
//|                                             Version 1            |
//+------------------------------------------------------------------+
#property copyright "220Volt"
#property link      ""
#property show_inputs

#define _OUT_DELIMITER  ','

extern string fileName_1;        // Ôàéë ñ èñõîäíîé èñòîðèåé
extern string fileName_2;        // Ôàéë ñ èñõîäíîé èñòîðèåé
extern string fileName_rez;      // Èìÿ ôàéëà ñ ñèíòåçèðîâàííîé èñòîðèåé (áóäåò ñîçäàí èëè ïåðåçàïèñàí)
extern int delimiter = ',';      // Ðàçäåëèòåëü â ôàéëàõ-èñòî÷íèêàõ
extern int skipLine = 0;         // Ïðîïóñòèòü skipLin ñòðîê â ôàéëàõ-èñòî÷íèêàõ
extern int mode = 1;             // Ðåæèì ñèíòåçà: 1 -- high = max(highFile1, highFile2); low = min(lowFile1, lowFile2); close = (closeFile1 + closeFile2) / 2; open = (openFile1 + openFile2) / 2;
                                 //                2 -- param = (paramFile1 + paramFile2) / 2 (Avg èñòîðèÿ)
extern int digits = 5;           // Çíàêîâ ïîñëå òî÷êè (òî÷íîñòü èíñòðóìåíòà)

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int f1_handle = 0;
datetime f1_time = -1;

bool f1_Init()
{
   f1_handle = FileOpen(fileName_1, FILE_CSV|FILE_READ, delimiter);
   if( f1_handle == -1)
      return(false); 
   for(int count = skipLine;  count > 0;  count --)
   {
      while(true)
      {
         FileReadString(f1_handle);
         if(FileIsLineEnding(f1_handle))
            break;
      }
   }
   return(true);
}

void f1_Deinit()
{
   if(f1_handle > 0)
      FileClose(f1_handle);
}

datetime f1_GetTime()
{
   if(f1_time != -1)
      return(f1_time);
   f1_time = StrToTime( FileReadString(f1_handle) );
   if(FileIsEnding(f1_handle))
      f1_time = -1;
   return(f1_time);
}

void f1_GetData(double &open, 
               double &high, 
               double &low, 
               double &close, 
               double &volume)
{
   f1_time = -1;
   open = 0;
   high = 0;
   low = 0;
   close = 0;
   volume = 0;
   if(FileIsLineEnding(f1_handle))
      return;
   open = FileReadNumber(f1_handle);   if(FileIsLineEnding(f1_handle))  return;
   high = FileReadNumber(f1_handle);   if(FileIsLineEnding(f1_handle))  return;
   low = FileReadNumber(f1_handle);    if(FileIsLineEnding(f1_handle))  return;
   close = FileReadNumber(f1_handle);  if(FileIsLineEnding(f1_handle))  return;
   volume = FileReadNumber(f1_handle);
}
//+-----------------------------------------------

int f2_handle = 0;
datetime f2_time = -1;

bool f2_Init()
{
   f2_handle = FileOpen(fileName_2, FILE_CSV|FILE_READ, delimiter);
   if( f2_handle == -1)
      return(false);
   for(int count = skipLine;  count > 0;  count --)
   {
      while(true)
      {
         FileReadString(f2_handle);
         if(FileIsLineEnding(f2_handle))
            break;
      }
   }
   return(true);
}

void f2_Deinit()
{
   if(f2_handle > 0)
      FileClose(f2_handle);
}

datetime f2_GetTime()
{
   if(f2_time != -1)
      return(f2_time);
   f2_time = StrToTime( FileReadString(f2_handle) );
   if(FileIsEnding(f2_handle))
      f2_time = -1;
   return(f2_time);
}

void f2_GetData(double &open, 
               double &high, 
               double &low, 
               double &close, 
               double &volume)
{
   f2_time = -1;
   open = 0;
   high = 0;
   low = 0;
   close = 0;
   volume = 0;
   if(FileIsLineEnding(f2_handle))
      return;
   open = FileReadNumber(f2_handle);   if(FileIsLineEnding(f2_handle))  return;
   high = FileReadNumber(f2_handle);   if(FileIsLineEnding(f2_handle))  return;
   low = FileReadNumber(f2_handle);    if(FileIsLineEnding(f2_handle))  return;
   close = FileReadNumber(f2_handle);  if(FileIsLineEnding(f2_handle))  return;
   volume = FileReadNumber(f2_handle);
}
//+-----------------------------------------------

int fRez_handle = 0;

bool fRez_Init()
{
   if(mode != 1  &&  mode != 2)
      return(false);
   if( !f1_Init()  ||  !f2_Init() )  
      return(false);
   double open, high, low, close, volume;
   datetime time1 = -2, time2;
   while(true)
   {
      if(time1 == -2)
      {
         time1 = f1_GetTime();
         time2 = f2_GetTime();
      }
      else
      {
         if(time1 < time2)
         {
            f1_GetData(open, high, low, close, volume);
            time1 = f1_GetTime();
         }
         else
         {
            f2_GetData(open, high, low, close, volume);
            time2 = f2_GetTime();
         }
      }
      if(time1 == -1  ||  time2 == -1)
         return(false);
      if(time1 == time2)
         break; 
   }    
   
   fRez_handle = FileOpen(fileName_rez, FILE_CSV|FILE_WRITE, _OUT_DELIMITER);
   if( fRez_handle == -1)
      return(false);
   return(true);
}

void fRez_Deinit()
{
   f1_Deinit();
   f2_Deinit();
   if(fRez_handle > 0)
      FileClose(fRez_handle);
}

bool fRez_Step()
{
   datetime time1 = f1_GetTime();
   datetime time2 = f2_GetTime();
   if(time1 == -1  ||  time2 == -1)
      return(true);
   datetime rezTime;
   double rezOpen, rezHigh, rezLow, rezClose, rezVolume;
   if(time1 != time2)
   {
      if(time1 < time2)
      {
         rezTime = time1;
         f1_GetData(rezOpen, rezHigh, rezLow, rezClose, rezVolume);
      }
      else
      {
         f2_GetData(rezOpen, rezHigh, rezLow, rezClose, rezVolume);
         rezTime = time2;
      }
   }
   else
   {
      rezTime = time1;
      double f1Open, f1High, f1Low, f1Close, f1Volume;
      double f2Open, f2High, f2Low, f2Close, f2Volume;
      f1_GetData(f1Open, f1High, f1Low, f1Close, f1Volume);
      f2_GetData(f2Open, f2High, f2Low, f2Close, f2Volume);
      
      switch(mode)
      {
         case 1:
            rezOpen = (f1Open + f2Open) / 2; 
            rezHigh = MathMax(f1High, f2High); 
            rezLow = MathMin(f1Low, f2Low); 
            rezClose = (f1Close + f2Close) / 2; 
            rezVolume = (f1Volume + f2Volume) / 2;
            break;
            
         case 2:
            rezOpen = (f1Open + f2Open) / 2;  
            rezHigh = (f1High + f2High) / 2;
            rezLow = (f1Low + f2Low) / 2; 
            rezClose = (f1Close + f2Close) / 2; 
            rezVolume = (f1Volume + f2Volume) / 2;
      }
   }
     
   FileWrite( fRez_handle, 
            TimeToStr(rezTime, TIME_DATE|TIME_SECONDS), 
            DoubleToStr(rezOpen, digits), 
            DoubleToStr(rezHigh, digits), 
            DoubleToStr(rezLow, digits), 
            DoubleToStr(rezClose, digits), 
            DoubleToStr(rezVolume, digits) );
            
   return(false);
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   if( !fRez_Init() )
   {
      fRez_Deinit();
      return(1);
   }
   
   while(true)
      if(fRez_Step())
         break;

   fRez_Deinit();
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---