HELP: processing High Frequency data
I want to develop an EA to process live high frequency data (including ticks and order book events). but in first step I encountered problems in extracting data.
for start I tried to get tick data and save them to a file to check quality of data . here is the code:
after running the EA for one trading day I opened the text file and compared it to data that I had got from exchange website. there are tow problems:
1. when the transaction traffic is high and there are more than 2 tick events in a second, the EA could save only one or tow events and deny the rest.
I think I will encounter same problem using OnBookEvent handler to get book data .
if this is because of CPU or network limits to process data in such frequency I have an idea to solve first problem . using OnTimer event handler and in every second get last one second tick events (remember I need to process high frequency live data).
but I dont know how and I dont know if this solution works for book event, because I think despite of tick data, server dont save order book event so there is no historical data to extract for last second .
2. I need only data when transaction occurs not when quote changes , but OnTick event handler consider both. how can I write a code to distinguish and ignore quote changes data..
Hello haqiqi.afshin,
please take a look at this post on the Portuguese section of the forum. It's directly related to this situation. The only problem: it's in Portuguese.
Maybe it's the situation you're facing and you might come to the same conclusions as those on the related topic.
I hope it helps.
haqiqi.afshin:
...
2. I need only data when transaction occurs not when quote changes , but OnTick event handler consider both. how can I write a code to distinguish and ignore quote changes data.
I use this to record ticks (well the actual code records ticks from several symbols at the same time).
So you will loose only a few ticks every when the file writes once in an hour (or less)
struct OneTick { MqlTick tick; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ struct TickArray { OneTick ticks[20000]; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ struct TickContainer { TickArray allticks; int ticksrecorded; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CMultiTick { public: int file_handle; TickContainer bticks; CMultiTick() { file_handle = INVALID_HANDLE; } void CMultiTick:: ~CMultiTick() { SetFile(INVALID_HANDLE); } void CMultiTick::AddTick(const MqlTick &theTick) { AddTick(bticks,theTick); } void CMultiTick::AddTick(TickContainer &container,const MqlTick &theTick) { container.allticks.ticks[container.ticksrecorded].tick=theTick; if (container.ticksrecorded==20000) WriteTicksToFile(); else container.ticksrecorded++; } void CMultiTick::WriteTicksToFile() { if (file_handle!=INVALID_HANDLE) { int anz = bticks.ticksrecorded; if (anz>0) { FileWriteStruct(file_handle,bticks.allticks,sizeof(OneTick)*anz); bticks.ticksrecorded=0; Print(anz," ticks written to file. ",sizeof(OneTick)*anz); } } } void CMultiTick::SetFile(int fhandle) { if(file_handle!=INVALID_HANDLE) FileClose(file_handle); file_handle=fhandle; } };
I use this to record ticks (well the actual code records ticks from several symbols at the same time).
So you will loose only a few ticks every when the file writes once in an hour (or less)
You will ALWAYS lose ticks, independently of your code. See link provided by Malacarne.
I know but I checked that I got all ticks to make synthetic bars which had the same value than the ones from the broker.
Anyway I recorded 21 symbols at the same time and it worked quite well for me.
Hello haqiqi.afshin,
please take a look at this post on the Portuguese section of the forum. It's directly related to this situation. The only problem: it's in Portuguese.
Maybe it's the situation you're facing and you might come to the same conclusions as those on the related topic.
I hope it helps.
Hi Malacane
thank you.I read whole posts in that topic , it helped a lot (thanks google translate ;) ) . I hoped to find a solution to get all ticks perfectly. but apparently Its not easy. I use meta trader for stock market that is centralized . I compared volumes indicator "tick volume " with exchange "tick volume" data and they were equal. does this indicator count every ticks? . if so this indicator does not loose any tick !!!
or maybe it get the data separately .if there is not a way to get whole tick by OnTick Event handler I,m going to find a way to modify data by whatever volumes indicator uses for its source.
thanks so much.
Hi Malacane
thank you.I read whole posts in that topic , it helped a lot (thanks google translate ;) ) . I hoped to find a solution to get all ticks perfectly. but apparently Its not easy. I use meta trader for stock market that is centralized . I compared volumes indicator "tick volume " with exchange "tick volume" data and they were equal. does this indicator count every ticks? . if so this indicator does not loose any tick !!!
or maybe it get the data separately .if there is not a way to get whole tick by OnTick Event handler I,m going to find a way to modify data by whatever volumes indicator uses for its source.
thanks so much.
Isn't a quote's change always resulting from a transaction ? Probably it depends of what you are calling a transaction.
I think that was not clear. let me say this way : when new order arrives or someone modify or cancel his order the quote changes when a market order arrives quote changes too.
So I want to filter ticks resulted by market order . I tried to compare every ticks with tick before it . if ask and bid were equal then its a market order. it works but looses some data .(ticks that are saved by last code and are market order)
datetime dtm = TimeTradeServer(); string tick[7]; int i=0; string tickfile_handle; string tickfilename = Symbol()+"_tick_"+TimeToString(dtm,TIME_DATE)+".txt";MqlTick befortick;int OnInit() { tickfile_handle=FileOpen(tickfilename,FILE_WRITE|FILE_TXT|FILE_READ); SymbolInfoTick(Symbol(),befortick); return(INIT_SUCCEEDED); } void OnTick() { MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) { if(last_tick.ask==befortick.ask && last_tick.bid==befortick.bid) { datetime stm = TimeTradeServer(); i=i+1; tick[0]=i; tick[1]=TimeToString(stm,TIME_SECONDS); tick[2]=TimeToString(last_tick.time,TIME_SECONDS); tick[3]=last_tick.last; tick[4]=last_tick.volume; tick[5]=last_tick.ask; tick[6]=last_tick.bid; FileSeek(tickfile_handle,0,SEEK_END); FileWriteArray(tickfile_handle,tick,0,WHOLE_ARRAY); } } befortick=last_tick; }
I think that was not clear. let me say this way : when new order arrives or someone modify or cancel his order the quote changes when a market order arrives quote changes too.
So I want to filter ticks resulted by market order . I tried to compare every ticks with tick before it . if ask and bid were equal then its a market order. it works but looses some data .(ticks that are saved by last code and are market order)

- Free trading apps
- Free Forex VPS for 24 hours
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I want to develop an EA to process live high frequency data (including ticks and order book events). but in first step I encountered problems in extracting data.
for start I tried to get tick data and save them to a file to check quality of data . here is the code:
after running the EA for one trading day I opened the text file and compared it to data that I had got from exchange website. there are tow problems:
1. when the transaction traffic is high and there are more than 2 tick events in a second, the EA could save only one or tow events and deny the rest.
I think I will encounter same problem using OnBookEvent handler to get book data .
if this is because of CPU or network limits to process data in such frequency I have an idea to solve first problem . using OnTimer event handler and in every second get last one second tick events (remember I need to process high frequency live data).
but I dont know how and I dont know if this solution works for book event, because I think despite of tick data, server dont save order book event so there is no historical data to extract for last second .
2. I need only data when transaction occurs not when quote changes , but OnTick event handler consider both. how can I write a code to distinguish and ignore quote changes data.
.