As part of my investigations into forex news trading I have found it necessary to obtain forex tick level data for back testing purposes and below I provide code to achieve this using Dukascopy’s Node library, being called from Octave and using some system calls. A useful youtube video about the Dukascopy Node library will give readers some background information.
function [ first_days , last_days ] = first_and_last_weekday_of_month( y )
t1 = datenum( [ y , 1 , 1 , 0 , 0 , 0 ] ) ;
t2 = datenum( [ y , 12 , 31 , 0 , 0 , 0 ] ) ;
t = datevec( t1 : t2 ) ;
delete_ix = strcmp( 'Saturday' , datestr( t , 'dddd' ) ) ; % find all Saturdays
t( delete_ix , : ) = [] ;
delete_ix = strcmp( 'Sunday' , datestr( t , 'dddd' ) ) ; % find all Sundays
t( delete_ix , : ) = [] ;
first_day_ix = find( diff( [ 1 ; t( : , 2 ) ] ) > 0 ) ;
first_days = [ t( 1 , : ) ; t( first_day_ix , : ) ] ;
last_day_ix = first_day_ix - 1 ; last_day_ix( last_day_ix <= 0 ) = [] ;
last_days = [ t( last_day_ix , : ) ; t( end , : ) ] ;
endfunction
ii_vec = [ 2020 , 2021 , 2022 , 2023 , 2024 ] ;
for ii = ii_vec
[ first_days , last_days ] = first_and_last_weekday_of_month( ii ) ;
for jj = 1 : 12
cd /path/to/folder ;
command = [ 'npx dukascopy-node -i eurusd -from ' , datestr( first_days( jj , : ) , 29 ) , ' -to ' , datestr( last_days( jj , : ) , 29 ) , ...
' --timeframe tick --format csv --retries 5 --directory eurusd --date-format "YYYY-MM-DD HH:mm:ss:SSS" ' ] ;
system( command ) ;
cd /path/to/folder/eurusd ;
## delete header
command = [ "sed -i '/timestamp,askPrice,bidPrice/d' eurusd-tick-" , datestr( first_days( jj , : ) , 29 ) , "-" , datestr( last_days( jj , : ) , 29 ) , ".csv" ] ;
system( command ) ;
FID = fopen( 'eurusd-tick-2015-10-02-2015-10-03.csv' , 'r' ) ;
FID = fopen( [ 'eurusd-tick-' , datestr( first_days( jj , : ) , 29 ) , '-' , datestr( last_days( jj , : ) , 29 ) , '.csv' ] , 'r' ) ;
sizeM = [ 9 , Inf ] ;
M = fscanf( FID , "%4d-%2d-%2d %2d:%2d:%2d:%3d,%f,%f" , sizeM )' ;
fclose( FID ) ;
save( '-binary' , [ 'eurusd-' , num2str( ii ) , '-' , num2str( first_days( jj , 2 ) ) , '.bin' ] , 'M' ) ;
delete( 'eurusd-tick-*' ) ;
clear -x ii_vec ii jj first_days last_days first_and_last_weekday_of_month
endfor ## jj loop
clear -x ii_vec ii first_and_last_weekday_of_month
endfor ## ii_vec
The result of running the above code results in a folder full of tick data saved in Octave’s native binary format, one file per month, with each file’s name being descriptive of the data contained within.
I hope readers will find this useful.