Steven Imrich

HomeTrading platforms → How do I get a 99% modelling quality backtest in MT4?

How do I get a 99% modelling quality backtest in MT4?

Updated August 27, 2026

Short answer

You can't get past 90% with MetaTrader's own history, because 90% is the ceiling the formula allows when M1 bars are the finest data you have. To go higher you feed MT4 a tick-level .fxt file built outside the platform, normally with Tickstory using Dukascopy tick data, then run the tester in Every tick mode against the exported symbol. The important part: modelling quality only measures how dense the input data was. A 99.9% backtest of a badly written EA is still a badly written EA, just with more decimal places.

What the number actually measures

Modelling quality is not an accuracy score. It’s a data density score, and MetaQuotes published the formula years ago:

ModellingQuality = ((0.25*(StartGen-StartBar) +
                     0.5*(StartGenM1-StartGen) +
                     0.9*(HistoryTotal-StartGenM1)) / (HistoryTotal-StartBar))*100%

Three weights. Bars modelled from a nearby timeframe get 0.25. Bars modelled from something finer get 0.5. Bars modelled from M1 get 0.9. Look at the top weight for a second. It’s 0.9. There is no term in that formula that can produce more than 90%, no matter how perfect your M1 history is.

So 90% doesn’t mean “pretty good”. It means “MT4 had complete one minute bars for the whole test period”. That’s all. Inside every one of those minutes MT4 still made up the price path, because it has no idea what happened between the open and the close of an M1 bar. It interpolates. If your EA has a stop and a target sitting inside the same minute, the tester decides which one hit first using a rule rather than using history.

That’s the actual problem, and it’s why people chase 99%.

Why 99.9% is even possible

The .fxt file the tester reads has a modelling quality value in its header. When you build that file outside MT4 from real tick data, the tool writes 99.90 into it. MT4 reads it and prints it. That’s the whole mechanism.

Which is worth knowing, because it means the number is a label attached by the exporter, not a measurement MT4 performed. What genuinely changed is the data: instead of one OHLC row per minute, the file now holds every recorded tick, so the tester walks the price path rather than inventing it.

The procedure

You’ll want a second MT4 installation for this, kept separate from the one you trade on. MT4 re-downloads history from the broker whenever it feels like it, and it will happily overwrite what you just imported.

1. Get the data. Tickstory is the usual route and the Lite version is free. It pulls tick history from Dukascopy, which goes back a long way for the majors. First download for a pair takes a while, so start it and go do something else.

2. Point Tickstory at the right MT4. It needs to know which terminal folder to write into. Do this before exporting, not after, or you’ll generate a file into a copy of MT4 you’re not testing in.

3. Raise the bar limits in MT4 first. Tools > Options > Charts, and set Max bars in history and Max bars in chart to something enormous. Leave them at the default and MT4 quietly truncates your imported history, and your modelling quality drops or your test starts later than you asked.

4. Export. In Tickstory, select the instrument, then Export to MT4. Pick your date range and the timeframes you want, and set the spread here (see below). Let it finish.

5. Launch MT4 from Tickstory. Tools > Launch MT4, or F8. This matters more than it looks. Launching from Tickstory is what keeps the terminal from clobbering the exported history.

6. Run the test. In MT4, View > Strategy Tester or Ctrl+R. Pick the EA, pick the symbol you exported, set the period to a timeframe you exported, and set Model to Every tick. Anything else and the whole exercise was pointless.

7. Read the header. The Report tab prints Modelling quality near the top. You want 99.90%. Right under it is Mismatched charts errors, and you want that at 0. A non-zero mismatch count means the M1 bars in your imported file disagree with the higher timeframe bars, usually because you exported over the top of existing broker history instead of replacing it.

The spread, which is where most people leave money on the table

Stock MT4’s tester applies a single spread for the entire run. That’s it. Whatever Tickstory writes into the file, or whatever you type into the Spread box, gets used at 3am on a Tuesday and thirty seconds after a rate decision alike.

The tick data itself records the real bid and ask, so the variable spread genuinely exists in the source. Using it inside MT4’s tester needs a patched terminal, and in practice that means Tick Data Suite, which is a paid product (a subscription, roughly $40 a month or a few hundred for a year when I checked) that adds variable spread, configurable slippage and a commission field to the tester.

If you’re not paying for that, do the honest version instead. Run the test three times: at your broker’s typical spread, at double it, and at triple. If the result only exists at the tightest number, you’ve learned something more useful than a modelling quality percentage.

The part that matters

99.9% modelling quality means the input data was dense. It does not mean:

  • the fills were realistic, because there’s still no slippage, no requotes and no rejected orders
  • commission was charged, because MT4’s tester has no field for it
  • the swap was right, because that comes from your broker’s symbol settings
  • the strategy isn’t curve fitted, because tick data doesn’t care how many parameters you optimised
  • the tick data matches your broker’s feed, because it’s Dukascopy’s, and your broker’s prices are their own

That last one gets missed a lot. You’ve built a very precise simulation of trading at a different firm.

I’ve seen plenty of 99.9% reports that fall apart live, and the reasons are almost never data density. They’re on the backtest versus live page, and honestly that’s the page to read next if the reason you’re here is that an EA disappointed you.

MT5, briefly

MT5 doesn’t need any of this. Its Model dropdown includes Every tick based on real ticks, which pulls the broker’s own recorded tick history straight from their server. Better in two ways: it’s real ticks, and they’re your broker’s ticks rather than someone else’s.

One caveat from MetaQuotes’ own documentation, worth quoting because it’s easy to miss. Where real ticks are absent for some interval, the tester simulates that stretch exactly as it would in plain Every tick mode. So a real-tick MT5 run can contain invented sections, and nothing in the report tells you where they are or how much of the test they cover.

If your modelling quality still says 90%

Check the tester is on Every tick, check the symbol name matches what you exported exactly (broker suffixes like EURUSD.m are a classic), and check the test start date isn’t earlier than the data you downloaded. Failing all that, delete the .fxt files in the tester’s history folder and export again, because a stale one will be reused without complaint.

Related questions