Author: Viatcheslav Suvorov
StepByStep
Price Data Components
Series array that contains open prices of each barSeries array that contains the lowest prices of each barSeries array that contains the highest prices of each barSeries array that contains close prices for each barSeries array that contains tick volumes of each bar
Miscellaneous
It writes information to fileIt writes information to fileIt writes information to fileIt writes information to file
2 Views
0 Downloads
0 Favorites
StepByStep
//+------------------------------------------------------------------+
//|                                                   StepByStep.mq4 |
//|                                              Viatcheslav Suvorov |
//+------------------------------------------------------------------+
#property copyright "Viatcheslav Suvorov"
#property show_inputs
#include <WinUser32.mqh>

#import "IdleLib.dll"
int GetLastKeyWP();
int IdleLibInit();
int IdleLibUnInit();
string GetActiveWndName();
#import

extern datetime startdate=0;//äàòà è âðåìÿ íà÷àëà ýìóëÿöèè
extern string instruments="EURUSD GBPUSD";//èíñòðóìåíòû ýìóëÿöèè, íàïðèìåð "EURUSD GBPUSD USDJPY"
extern string minperiod="M5";

datetime  minTime;
datetime  maxTime;
int     LastShift[100];
int     Handles[100];
int     HandlesPeriod[100];
string  NameOfHandles[100];
int     CountHandle;
datetime EmulationTime=0;
int mytimeframe[];

void AddData(int minutes)
{
  int oldTime=EmulationTime;
  EmulationTime=EmulationTime+minutes*60; 
  bool holy=false;
  if (TimeDayOfWeek(EmulationTime)==0 || TimeDayOfWeek(EmulationTime)==6){
    while ((EmulationTime<maxTime) && (TimeDayOfWeek(EmulationTime)==0 || TimeDayOfWeek(EmulationTime)==6)) EmulationTime++;
    EmulationTime=EmulationTime+3600;    
    holy=true;
  }//   
  for (int i=1;i<=CountHandle;i++){    
    int shift=iBarShift(NameOfHandles[i],HandlesPeriod[i]-1,EmulationTime);     
    if (LastShift[i]>0) int shift1=LastShift[i]; else
      shift1=iBarShift(NameOfHandles[i],HandlesPeriod[i]-1,oldTime);              
    if ((shift!=-1) && (shift1!=-1)){       
      for (int j=shift1-1;j>shift;j--){                
         LastShift[i]=j;
         FileWriteInteger(Handles[i], iTime(NameOfHandles[i],HandlesPeriod[i]-1,j), LONG_VALUE);
         FileWriteDouble(Handles[i], iOpen(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iLow(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iHigh(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iClose(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iVolume(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);        
      }//for
   // if (minutes<HandlesPeriod[i]-1){
    if (HandlesPeriod[i]-1>mytimeframe[0]){
      datetime timeLastBar=iTime(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1); 
      int sh1=iBarShift(NameOfHandles[i],mytimeframe[0],timeLastBar);
            
      int sh2=iBarShift(NameOfHandles[i],mytimeframe[0],EmulationTime)+1;
      if (sh1-sh2==0) int delt=1; else  delt=sh1-sh2+1;
      

      if ((sh1<0) || (sh2<0)){
        double h1=iHigh(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1);
        double l1=iLow(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1);            
      } else {              
        h1=iHigh(NameOfHandles[i],mytimeframe[0],Highest(NameOfHandles[i],mytimeframe[0],MODE_HIGH,delt,sh2));
        l1=iLow(NameOfHandles[i],mytimeframe[0],Lowest(NameOfHandles[i],mytimeframe[0],MODE_LOW,delt,sh2));            
      }
      double o1=iOpen(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1);
      double c1=iClose(NameOfHandles[i],mytimeframe[0],sh2);
      if ((o1>h1) || (o1<l1) || (c1>h1) || (c1<l1)) {
        h1=MathMax(h1,MathMax(o1,c1));
        l1=MathMin(l1,MathMin(o1,c1));
      }  
      
      if (EmulationTime>=timeLastBar+HandlesPeriod[i]-1){                        
         int LastFPos=FileTell(Handles[i]);
         FileWriteInteger(Handles[i], iTime(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1), LONG_VALUE);
         FileWriteDouble(Handles[i], o1, DOUBLE_VALUE);
         FileWriteDouble(Handles[i], l1, DOUBLE_VALUE);
         FileWriteDouble(Handles[i], h1, DOUBLE_VALUE);
         FileWriteDouble(Handles[i], c1, DOUBLE_VALUE);         
         FileWriteDouble(Handles[i],iVolume(NameOfHandles[i],HandlesPeriod[i]-1,LastShift[i]-1), DOUBLE_VALUE);                         
         FileSeek(Handles[i],LastFPos,SEEK_SET);         
      }     
    }//if  
      FileFlush(Handles[i]);
      int hwnd=WindowHandle("t_"+NameOfHandles[i],HandlesPeriod[i]);        
      if(hwnd!=0) PostMessageA(hwnd,WM_COMMAND,33324,0);                              
    }//if
  }//for  
}
void BuildHistoryToDateTime()
{
  if (EmulationTime==0) EmulationTime=startdate;
  if (EmulationTime<minTime) EmulationTime=minTime;
  if (EmulationTime>maxTime) EmulationTime=minTime;
  for (int i=1;i<=CountHandle;i++){
    int shift=iBarShift(NameOfHandles[i],HandlesPeriod[i]-1,EmulationTime);          
    if (shift!=-1) {      
      for (int j=iBars(NameOfHandles[i],HandlesPeriod[i]-1);j>shift;j--){
         LastShift[i]=j;
         FileWriteInteger(Handles[i], iTime(NameOfHandles[i],HandlesPeriod[i]-1,j), LONG_VALUE);
         FileWriteDouble(Handles[i], iOpen(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iLow(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iHigh(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iClose(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);
         FileWriteDouble(Handles[i], iVolume(NameOfHandles[i],HandlesPeriod[i]-1,j), DOUBLE_VALUE);        
      }//for
      FileFlush(Handles[i]);
      int hwnd=WindowHandle("t_"+NameOfHandles[i],HandlesPeriod[i]);        
      if(hwnd!=0) PostMessageA(hwnd,WM_COMMAND,33324,0);                              
    }//if
  }//for
}
void InitAllHistory()
{  
  int pos=0;
  string curstr="";
  bool sign=true;
  CountHandle=0;
  int    i_unused[13];
  ArrayInitialize(Handles,0);
  ArrayInitialize(HandlesPeriod,0);     
  ArrayInitialize(LastShift,0);  
     
  while (sign) {
    if (pos>StringLen(instruments))  sign=false; else {
      int curchar=StringGetChar(instruments,pos);
      if ((curchar==' ') || (pos==StringLen(instruments))) { 
        Print("Ðàñïîçíàë èìÿ ",curstr);
        for (int i=0;i<ArraySize(mytimeframe);i++){     
          int modifyTF=mytimeframe[i]+1;
          int ExtHandle=FileOpenHistory("t_"+curstr+modifyTF+".hst", FILE_BIN|FILE_WRITE);   
          if (ExtHandle>0) {          
            CountHandle++;
            Handles[CountHandle]=ExtHandle;
            HandlesPeriod[CountHandle]=modifyTF;
            NameOfHandles[CountHandle]=curstr;          
               FileSeek(Handles[CountHandle],0,SEEK_SET);           
               FileWriteInteger(Handles[CountHandle], 400, LONG_VALUE);
               FileWriteString(Handles[CountHandle],"(C)opyright 2003, MetaQuotes Software Corp.", 64);
               FileWriteString(Handles[CountHandle], "t_"+curstr, 12);
               FileWriteInteger(Handles[CountHandle], modifyTF, LONG_VALUE);
               FileWriteInteger(Handles[CountHandle], MarketInfo(curstr,MODE_DIGITS), LONG_VALUE);
               FileWriteInteger(Handles[CountHandle], 0, LONG_VALUE);      
               FileWriteInteger(Handles[CountHandle], 0, LONG_VALUE);       
               FileWriteArray(Handles[CountHandle], i_unused, 0, 13);               
          }//if            
        }//for
        curstr="";
      } else curstr=curstr+CharToStr(curchar);
    }//else  
    pos++;
  }//while 
}//InitAllHistory

int start()
  {
   if (minperiod=="M1") {
     ArrayResize(mytimeframe,8); 
     mytimeframe[0]=1;mytimeframe[1]=5;mytimeframe[2]=15;mytimeframe[3]=30;mytimeframe[4]=60;mytimeframe[5]=240;mytimeframe[6]=1440;mytimeframe[7]=10080;     
   } else if (minperiod=="M5") {
     ArrayResize(mytimeframe,7); 
     mytimeframe[0]=5;mytimeframe[1]=15;mytimeframe[2]=30;mytimeframe[3]=60;mytimeframe[4]=240;mytimeframe[5]=1440;mytimeframe[6]=10080;          
   } else if (minperiod=="M15") {
     ArrayResize(mytimeframe,6); 
     mytimeframe[0]=15;mytimeframe[1]=30;mytimeframe[2]=60;mytimeframe[3]=240;mytimeframe[4]=1440;mytimeframe[5]=10080; 
   } else if (minperiod=="M30") {
     ArrayResize(mytimeframe,5);    
     mytimeframe[0]=30;mytimeframe[1]=60;mytimeframe[2]=240;mytimeframe[3]=1440;mytimeframe[4]=10080;     
   } else if (minperiod=="H1") {
     ArrayResize(mytimeframe,4);    
     mytimeframe[0]=60;mytimeframe[1]=240;mytimeframe[2]=1440;mytimeframe[3]=10080;     
   } else if (minperiod=="H4") {
     ArrayResize(mytimeframe,3);    
     mytimeframe[0]=240;mytimeframe[1]=1440;mytimeframe[2]=10080;     
   } else if (minperiod=="D1") {
     ArrayResize(mytimeframe,2);    
     mytimeframe[0]=1440;mytimeframe[1]=10080;     
   } else if (minperiod=="W1") {
     ArrayResize(mytimeframe,1);    
     mytimeframe[0]=10080;     
   } else {
     Print("Íåïðàâèëüíûé ìèíèìàëòüíûé TF");
     return(-1);
   }
   IdleLibInit();//èíèöèàëèçèðóåì Dll
   InitAllHistory();
   minTime=iTime(NameOfHandles[1],HandlesPeriod[1]-1,iBars(NameOfHandles[1],HandlesPeriod[1]-1)-1); 
   maxTime=iTime(NameOfHandles[1],HandlesPeriod[1]-1,0);   
   //Print("minTime=",TimeYear(minTime)," ",TimeMonth(minTime)," ",TimeDay(minTime));
    
   BuildHistoryToDateTime();      

         bool NeedLoop=true;int tick=0;
         while(NeedLoop){            
           int lastkey=GetLastKeyWP();           
           string lastwnd=GetActiveWndName();
           if ((lastkey==102) && (lastwnd!="")) {            
             if (StringFind(lastwnd,"M10081",0)>0) AddData(10080); else
             if (StringFind(lastwnd,"M1441",0)>0) AddData(1440); else               
             if (StringFind(lastwnd,"M241",0)>0) AddData(240); else 
             if (StringFind(lastwnd,"M61",0)>0) AddData(60); else 
             if (StringFind(lastwnd,"M31",0)>0) AddData(30); else 
             if (StringFind(lastwnd,"M16",0)>0) AddData(15); else 
             if (StringFind(lastwnd,"M6",0)>0) AddData(5); else 
             if (StringFind(lastwnd,"M2",0)>0) AddData(1);
             if (EmulationTime>=maxTime) NeedLoop=false;
           }//if  

           Sleep(100);
           tick++;
           if (tick>=20){
             for (int i=1;i<=CountHandle;i++){
               tick=0;
               int hwnd=WindowHandle("t_"+NameOfHandles[i],HandlesPeriod[i]);        
               if(hwnd!=0) PostMessageA(hwnd,WM_COMMAND,33324,0);                                           
             }//for  
            }//if  
         }//while                
              
   IdleLibUnInit();
   return(0);
  }//start

void deinit()
  { 
    for (int i=1;i<=CountHandle;i++){ 
      if(Handles[i]>=0) FileClose(Handles[i]);
    }  
  }//deinit()

Comments