//+------------------------------------------------------------------+ //| FXTticksCollector.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include <FXTHeader.mqh> int ExtHandle=-1; string ExtFileName; int ExtBars; int ExtTicks; datetime ExtLastBarTime; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { ExtLastBarTime=0; ExtTicks=0; ExtBars=0; ExtFileName=Symbol()+Period()+"_0.fxt"; ExtHandle=FileOpen(ExtFileName,FILE_BIN|FILE_READ); //---- if(ExtHandle<0) { //---- file does not exist WriteHeaderAndFirstBars(); if(ExtHandle<0) return; } else { if(!ReadAndCheckHeader(ExtHandle,Period(),ExtBars)) { //---- file is wrong FileClose(ExtHandle); WriteHeaderAndFirstBars(); } else { CheckWrittenBars(); //---- reopen file for write FileClose(ExtHandle); ExtHandle=FileOpen(ExtFileName,FILE_BIN|FILE_READ|FILE_WRITE); FileSeek(ExtHandle,0,SEEK_END); //---- check for absentee bars after last run if(ExtLastBarTime<Time[0]) { int shift=iBarShift(NULL,0,ExtLastBarTime,true); if(shift>0) { int period_seconds=Period()*60; int added=0; //---- add missing bars while(shift>0) { datetime open_time=Time[shift]; FileWriteInteger(ExtHandle, open_time, LONG_VALUE); FileWriteDouble(ExtHandle, Open[shift], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Low[shift], DOUBLE_VALUE); FileWriteDouble(ExtHandle, High[shift], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Close[shift], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Volume[shift], DOUBLE_VALUE); FileWriteInteger(ExtHandle, open_time+period_seconds-1, LONG_VALUE); FileWriteInteger(ExtHandle, 1, LONG_VALUE); shift--; added++; if(ExtLastBarTime<open_time) ExtBars++; } Print("There were ",added," bars from ",TimeToStr(ExtLastBarTime)," added."); } } } } //---- WriteLastTick(); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- finalize header if(ExtHandle>0) { //---- store processed bars amount FileFlush(ExtHandle); FileSeek(ExtHandle,88,SEEK_SET); FileWriteInteger(ExtHandle,ExtBars,LONG_VALUE); //---- zeroize fields "for internal use" FileFlush(ExtHandle); FileSeek(ExtHandle,344,SEEK_SET); for(int i=0; i<64; i++) FileWriteInteger(ExtHandle,0,LONG_VALUE); //---- FileClose(ExtHandle); ExtHandle=0; Print(ExtTicks," ticks added. ",ExtBars," bars finalized in the header"); } //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(ExtHandle>0) WriteLastTick(); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void WriteHeaderAndFirstBars() { ExtHandle=FileOpen(ExtFileName,FILE_BIN|FILE_WRITE); if(ExtHandle<0) return; //---- int start_bar=Bars; if(Bars>100) start_bar=100; WriteHeader(ExtHandle,Symbol(),Period(),start_bar); //---- first 100 bars as is int period_seconds=i_period*60; for(int i=start_bar; i>0; i--,ExtBars++) { datetime cur_open=Time[i]; FileWriteInteger(ExtHandle, cur_open, LONG_VALUE); FileWriteDouble(ExtHandle, Open[i], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Low[i], DOUBLE_VALUE); FileWriteDouble(ExtHandle, High[i], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Close[i], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Volume[i], DOUBLE_VALUE); //---- generated current time for bar state FileWriteInteger(ExtHandle, cur_open+period_seconds-1, LONG_VALUE); //---- flag 0 - testing is not evaluated FileWriteInteger(ExtHandle, 0, LONG_VALUE); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CheckWrittenBars() { int bars_count=0; //---- ExtLastBarTime=0; FileSeek(ExtHandle,600,SEEK_SET); //---- while(!IsStopped()) { datetime open_time=FileReadInteger(ExtHandle, LONG_VALUE); if(FileIsEnding(ExtHandle)) break; //---- check for bar changing if(ExtLastBarTime!=open_time) { ExtLastBarTime=open_time; bars_count++; } //---- set position to next bar FileSeek(ExtHandle,48,SEEK_CUR); } //---- if(ExtBars!=bars_count) { Print("Wrong bars count ",ExtBars," in the FXT-header. Should be ",bars_count); ExtBars=bars_count; } //---- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void WriteLastTick() { //---- check for bar changing if(ExtLastBarTime!=Time[0]) { ExtLastBarTime=Time[0]; ExtBars++; } //---- FileWriteInteger(ExtHandle, ExtLastBarTime, LONG_VALUE); FileWriteDouble(ExtHandle, Open[0], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Low[0], DOUBLE_VALUE); FileWriteDouble(ExtHandle, High[0], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Close[0], DOUBLE_VALUE); FileWriteDouble(ExtHandle, Volume[0], DOUBLE_VALUE); FileWriteInteger(ExtHandle, CurTime(), LONG_VALUE); FileWriteInteger(ExtHandle, 4, LONG_VALUE); //---- ExtTicks++; } //+------------------------------------------------------------------+
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