How to prepare your tick data for Metatrader 4

If you’re reading this guide, I will assume you already downloaded your tick data either from one of the free sources mentioned on the Downloading free tick data page or from your own private source and now you need to use it in Metatrader 4.

Note: please refer to the old version of the guide if you’re using MT4 build 509 or older.

Converting the data

To put it simply, Metatrader 4 does not know how to directly read a CSV file containing tick data and thus it cannot use it in your backtests. However, what it can read is a proprietary file format that contains ticks so all we have to do is convert from our CSV file to FXT, the latter being the format I mentioned. To this end, I wrote a few scripts but later decided to make it less complicated and merged them into a single script that should be able to convert data from pretty much any source and put it into an FXT. One thing to note is that during backtesting, Metatrader 4 also makes use of the HST files when calculating the indicators so in order to have accurate tick data backtesting, you must also have HST files that match your FXT file.

So, what you need to convert is the CSV2FXT binaries that can be found in the tick data downloads section. It’s important to note that for the newer MT4 builds you will need CSV2FXT v0.44 or higher. Metaquotes changed the FXT and HST format after build 509 so all builds newer than that require the modified script. It’s a good idea to get the latest script even if you already have a compatible version.

Here’s a short guide on how to convert the tick data to an FXT file and a series of HST files:

  1. If you haven’t done so already, you have to head to the tick data downloads section and download the CSV2FXT binaries archive.
  2. Copy the files from the zip archive to your MT4 data folder. To find out what is your data folder, open MT4, head to File and click Open Data Folder, which will open an explorer window with your MT4 data folder (typically looks like C:\Users\[username]\AppData\Roaming\MetaQuotes\Terminal\[32_character_hex_string]\). There’s a directory structure inside, make sure the files land in the proper places (CSV2FXT.mq4 and CSV2FXT.ex4 must be in MQL4\Scripts, FXTHeader.mqh must be in MQL4\include, CsvReader.dll must be in MQL4\Libraries). Note that if you are using the /portable switch, your data folder will be the same as the MT4 installation folder.
  3. Move the tick data file (the CSV file) to MQL4\Files in the same MT4 data folder.
  4. Open a chart for the pair that you have data for (if you have an EURUSD.csv file, you MUST open an EURUSD chart).
  5. Select the timeframe that you wish to generate the FXT for. For instance, if you want to backtest on M1, then select M1 as the chart timeframe. Please note that the FXT file that you create for a particular timeframe (even M1) will NOT work for any other timeframe; you simply have to generate a new FXT if you want to backtest on another timeframe.
  6. Ensure that your terminal is connected to the broker (look in the lower right corner, if it says “not connected” you need to fix that before proceeding).
  7. Make sure that DLL calls are allowed. If you don’t know how to do that, you have to open the Tools menu, select Options, select Expert Advisors and ensure that Allow DLL imports is enabled while Confirm DLL function calls is disabled.
  8. Double click the CSV2FXT script in the navigation panel (it’s in the scripts section).
  9. Configure the parameters in the window that pops up.
    • CSV2FXT version – this is a parameter that is only meant to give you a quick indication of what version you have installed. Changing it has no effect.
    • CSV filename – you can leave this blank if the file is named just like the symbol and has a CSV extension (e.g. EURUSD.csv); otherwise, just type the file name.
    • Create HST files – this setting must be true in order to create the HST files that you need for your backtest. You can set it to false if you already generated HST files for the symbol with the same GMT/DST settings and you’re just generating an FXT for a different timeframe. You must create new HST files every time you change the GMT or DST.
      Note: Enabling this setting will create HST files for the whole time span of your tick data file regardless of the time range selected.
    • Spread – the fixed spread of your resulting FXT file, expressed in pips (2.3 will result in a 2.3 pips spread). Leaving it set to the default of 0.0 will make the converter use the current spread of your broker. Please pay attention to the fact that many brokers are widening their spreads during the weekends.
      If you intend to use real spread (the variable spread in your CSV), you can leave this parameter set to 0.0.
      Note: starting from MT4 builds 8xx, the Spread field in the MT4 backtesting pane overrides the spread configured for the FXT unless the FXT is using real spread (see below).
    • Start date and End date – these fields control the time span of the FXT file. You can leave these fields set to their default values (1907.01.01), in which case the converter will just use the whole time range available in the CSV file.
    • Use real (variable) spread – as its name suggests, enabling this parameter will make your resulting FXT use the real (variable) spread from your CSV file.
      The Tick Data Suite will autodetect whether your FXT is using real spread or not so there’s nothing to worry about if you’re using that.
      Note: this parameter makes MT4 disregard the spread configured in the MT4 backtesting UI and use the spread stored in the CSV file in the form of different ask and bid prices.
    • Spread padding – if using real spread, you can pad it by a given number of pips – if you want to pad it by 0.8 pips, just specify 0.8 here.
    • Minimum spread – if any spread is encountered that is lower than the value specified for this parameter, it will be adjusted to this value. This is only applied when using real spread.
    • Commission in pips – if you want your FXT to have a commission, you can configure the desired value here. The figure is round-trip and it is expressed in pips.
    • Commission in account currency – as an alternative to having the commission in pips, you can also set the commission in money. The value is expressed in base account currency per lot round-trip. If you fill this in, any value specified for Commission in pips will be disregarded.
    • Leverage – changes the leverage of your FXT.
    • FXT GMT offset – if you want your FXT to have a GMT offset other than 0, specify it here.
    • FXT DST setting – the DST setting of your resulting FXT – simply select the DST setting that you would like the file to have. Note that the US DST setting calculates the DST according to the regulations that were applied starting with 2007.
    • CSV GMT offset – the GMT offset of the data in your CSV file. The conversion script is able to autodetect the formats of several free tick data providers and apply the correct setting here, so it’s probably safe to leave it set to “autodetect”. If you get a message in the experts log about the script not being able to identify your tick data source, you can set the CSV GMT offset here manually.
    • CSV DST setting – the DST setting of your CSV. Should be safe to leave it to “autodetect”. Otherwise, use the same guidelines as for the FXT DST setting.
    • Time shift – Enabling this parameter will shift all the generated data 28 years in the past. This is intended for use with EAs that are suspect of having hardcoded days for the purpose of cheating backtesting. The reason behind the 28 year shift is that the calendar is identical when it comes to the days of the week and leap years. This is not a foolproof method and some EAs may have legitimate reasons to yield different results when backtested with a shifted time.
    • Price multiplication factor – All the prices will be multiplied by this value. It’s typically safe to leave this parameter set to 1.0 – don’t change that if you’re converting Forex data. Some brokers use an adapted value for CFDs, indices, metals and so on – instead of the normal price (for instance 12.3456) they will have a value multiplied by a certain value (for example 1234.56); in these cases you have to figure out the multiplier by looking at the chart prices versus the CSV prices.
    • Create M1 FXT, Create M5 FXT, Create M15 FXT, Create M30 FXT, Create H1 FXT, Create H4 FXT, Create D1 FXT, Create W1 FXT, Create MN FXT – These parameters are meant to allow you to create multiple FXT files in a single run. By default, the script will create the FXT for the timeframe of the chart you are running it on, no matter if the parameter for that specific timeframe is enabled or not. Only enable these parameters if you actually need the FXT for a different timeframe.
  10. Click “Ok”. Once you do that, the data generation process will start and it will typically take half an hour to several hours, depending on the data range and volume, possibly even more if you’re using a slow machine. A progress indicator will appear in the upper left side of your chart and when the processing is finished, you will get an alert. During the conversion, some data is being printed in the experts log and if you have any problems with the script it’s probably a good idea to keep an eye on that.

Once you’re done with all the steps above and the script finishes processing, you will be asked whether you want the script to move the files to their proper locations. If you choose Yes, restart the terminal to ensure the HST files are properly synchronised and skip to the next guide (Using the tick data in your backtests). If you choose No, you will have an FXT file and a bunch of HST files in your MQL4\Files folder and before actually using them you need to copy them to the correct location. Proceed with the following steps:

  1. Exit the Metatrader 4 terminal.
  2. Move all .HST files from MQL4\Files to history\[your_server_name]\.
    Pay very close attention if you have multiple server directories in your history folder – you will have to move them into the one that’s correct for active account!
  3. Move the generated FXT file from MQL4\Files to tester\history.

At this point, you’re done with the conversion and setup! You’re now ready to proceed to backtesting, but please note that it’s not as easy as clicking Start in the backtesting user interface. You will have to use some additional tools which are described in the Using the tick data in your backtests section.

If you run into any problems, please head to the FAQ & Troubleshooting page.

  • #498 written by jollydragon June 23, 2015 (3 months ago)

    After I used the script “CSV2FXT”, the 2 issues below found and how to fix?

    1. I downloaded EurUsd.csv from
    I opened M1 chart and convert the EurUsd.csv successfully, then H1 chart also successfully.
    However after testing, the quality is always “n/a”. How can I get the quality improved to over 90%?

    2. After opening the testing chart, I found the weekend data are also in the chart.

    How to remove or hide the data that haven’t any change?

    I followed the script instruction to connect MT4 to my broker before data converting.

    • #499 written by birt June 23, 2015 (3 months ago)

      1. Most likely you were running the backtest without TDS. Make sure the MT4 title bar says “…with Tick Data Suite…”.

      2. Dukascopy doesn’t have weekend data, I’m not sure why it would be there in your backtest. Perhaps the tool that you downloaded the data with has an option to add weekend data?

      • #500 written by jollydragon June 23, 2015 (3 months ago)


        1. What is TDS? How to make the title says ” with tick data suite”? Does it say during data converting or backtesting?
        2. Is there any default settings in MT4 to show the weekend data? I just download the Dukascopy data from here: Did you ever download there too? By the way, I downloaded M1 data from that page.

        • #501 written by birt June 23, 2015 (3 months ago)

          1. TDS is the Tick Data Suite. It’s required for tick data backtesting. You can get a trial at

          2. There are no such default settings. Note that if you want to backtest with tick data, you need tick data, not M1 data. I suggest using a software that assists with the download, such as the SQ Tick Data Downloader.

          • #502 written by jollydragon June 23, 2015 (3 months ago)

            1. No, I don’t need tick data. I need the data of H1. But also need M1 data according to MT4 working way. Correct? Then why is the quality is ‘n/a’ in this case?
            2. Now that there is weekend data, how to deal?

            • #503 written by birt June 23, 2015 (3 months ago)

              If you don’t need tick data simply import the bar data as you can. I can’t help you any further than that because I do not provide MT4 support.

  • #504 written by Michael July 7, 2015 (3 months ago)

    Hi Birt,

    I know you don’t provide support outside of your products, but I’m having an issue you may have encountered/solved already, and I’d be most grateful for your thoughts.

    The .CSV files containing my tick data are huge – approximately 10GB for a year. Is this an abnormal size? The tool I’m using to download my tick data (from a broker called LMAX) struggles to create files bigger than this so I am stitching multiple .CSVs together at the moment. Is this a common problem, and if so, how do you get around it?

    Also, does the CSV2FXT tool support CSV files where the date/time variable is denoted in UNIX/Epoch time?



    • #505 written by birt July 7, 2015 (3 months ago)

      It’s normal to have such huge files with the tick density of large ECNs such as LMAX.

      CSV2FXT does not currently support unix timestamps. You could try to modify it, but the modification would be quite extensive. I will look into this matter but I would expect a few months turnaround.

  • #506 written by Adrian July 23, 2015 (2 months ago)


    If my CSV files have some prices to 3 decimal places, some to 4, and some to 5, how will this be handled by MT4/CSV2FXT?

    So I mean, if EURUSD was at 1.178 at some point, that how it’s printed in my CSV rather than as 1.17800.

    And if it was at 1.1784 at some point, that’s how it’s printed instead of 1.17840.

    Does this affect data quality/reliability in anyway?


    • #507 written by Adrian July 24, 2015 (2 months ago)

      Hi Birt,

      Do you have any advice regarding this issue?



      • #508 written by birt July 24, 2015 (2 months ago)

        Actually I replied yesterday but I must’ve forgot to hit Post Comment or something.

        Long story short, it doesn’t matter, the script reads the price from the CSV and the number of digits from the chart that you ran it on and it’s able to handle everything like that nicely.

        • #509 written by Adrian July 30, 2015 (2 months ago)

          Thanks for that info.

          Another question:

          Do the ticks in your CSV file have to be ordered in linear time fashion?

          So theoretical Tick 1 at time t must be in row A and Tick 2 at time t+1 must be in row B?

          Or does CSV2FXT not care?



          • #510 written by birt July 30, 2015 (2 months ago)

            If it finds a timestamp in the past of the previous timestamp it makes a note in the log and discards it.

            Basically if we have:
            22:05:05 tick1
            22:05:04 tick2

            tick2 will get dropped.

  • #511 written by Alex July 24, 2015 (2 months ago)

    Hi Birt,
    I tried using your TDS and although it works perfectly with the instructions that you have provided I run in a problem and was wondering if you could help.
    When I run a normal backtest with all goes well, but when I run optimization for lets say 8 different values of an input it doesn’t always return Optimization results. To make sure that the values I used gave any positive profit results to be even considered Optimal results I run them manually one by one (without the optimization box checked) and found that 1 of them was actually profitable.
    Because I need to use the optimization option a lot to valuate the EAs I make I wanted to know if I can do something before I buy your program.


    • #512 written by birt July 24, 2015 (2 months ago)

      The first thing you should do is right click the optimization results pane and uncheck “Skip useless results”. This will show even non-profitable optimization runs. You can then use the result that you thought would be profitable, run the same params in a regular backtest and compare the outcome – they should be identical. If they aren’t, make sure that you have slippage disabled.

  • #513 written by Steve August 6, 2015 (2 months ago)

    Dear Birt’s
    How can I prepare the FXT file with BRENTCMDUSD & LIGHTCMDUSD from dukascopy?
    thank you!

    • #514 written by birt August 6, 2015 (2 months ago)

      Find an MT4 broker that has these symbols and convert the data using CSV2FXT.

      • #515 written by STEVE August 7, 2015 (2 months ago)

        Sorry Birts
        I mean when I use the CSV2FXT done, the FXT I testing always stop and in my journal it show the “exchange rate cannot be calculated”.
        thank you!

  • #516 written by Mike September 8, 2015 (1 month ago)

    Hi Birt,

    I’m testing with a broker that charges commission (ECN broker). Even though I don’t specify anything in the commission section of CSV2FXT, the backtester is subtracting $7 per lot from each trade.

    Is there a way of overriding this when creating the FXT/HST files?



  • #517 written by Vinisius September 12, 2015 (3 weeks ago)

    Hello Birt.

    I see what CSV Dukas historical’s files of CFD’s DAX30 is with 0 or 1 or 2 or 3 decimals:

    … 10186.5,10188.27 ..,.
    … 10185.691,10186.692 …

    My 2 brokers:

    ActivTrades with 1 decimal …. 10176.5
    and FXCM with 2 decimals …. 10186.00

    which I put in the settings in CSV2FXT script …. extern double PriceFactor ???.


    • #518 written by birt September 13, 2015 (3 weeks ago)

      You don’t need to specify anything, it will automatically get adjusted to the number of digits on the broker that you are connected to when converting. E.g. on ActivTrades 10185.691 will become 10185.7 while on FXCM it will become 10185.69

  • #519 written by Vinisius September 13, 2015 (3 weeks ago)

    Ok Birt.

    Then …when should be used ?.

    You could give an example with any product in which should set different default of PriceFactor ?.


    • #520 written by birt September 13, 2015 (3 weeks ago)

      If your CSV had 10185.691 and the same price on your broker would be 1018.56, you would use a PriceFactor of 0.1. I’ve only seen such a scenario once or twice, though.

  • #521 written by Vinisius September 13, 2015 (3 weeks ago)



  • #522 written by Vinisius September 19, 2015 (2 weeks ago)

    Hello Birt

    In the CSV2FXT script I can see the following code from the line 2373 to 2379.

    bool HasExtraDigit() {
    // add code here if you’re backtesting a symbol with strange particularities, such as a misc CFD or e.g. XAGJPY

    if (Digits % 2 == 1) {
    return (true);
    return (false);

    Does this code mean the same as this one? :

    if(Digits==3 || Digits==5){
    else pt=Point;

    Also if your function returns false not do anything?.


    • #523 written by birt September 19, 2015 (2 weeks ago)

      More or less, yes. The function does not only act on the point. My form is equivalent to if (Digits == 1 || Digits == 3 || Digits == 5 || Digits == 7…). The function only works properly for Forex symbols and should be modified for CFDs and metals.

  • #524 written by Vinisius September 19, 2015 (2 weeks ago)

    Then the CSV2FXT script does not work well for XAUUSD or CFDs?.

    But if on the web you say that the script too works on these products.

    I don’t understand.

    • #525 written by birt September 20, 2015 (2 weeks ago)

      It does, but they are not as standardized as Forex. Most of the time it will just work but in some particular cases you have to make some adjustments to make them work properly.

  • #526 written by Vinisius September 20, 2015 (2 weeks ago)

    XAUUSD (Gold) o Dax30 CFD need some adjustaments to make them work properly ?.


    • #527 written by birt September 20, 2015 (2 weeks ago)

      It depends on your broker and on your data source. If you have any further support questions, please address them via email.

  • You may use these HTML tags: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <s> <strike> <strong>


  • Comment Feed for this Post
Go to Top