Backtesting & verification intermediate 13 min read

Reading an MT5 Backtest Report: 23 Reports, and What Each Headline Leaves Out

An MT5 backtest report is a claim about one set of trades on one price history, and both halves move the numbers. We read all 23 reports published here: 14 of the 20 that publish both slices flatter the period the EA was selected on, one report covers only 303 of its own 315 trades, and the same EA re-run on a different data source went from 1.35 and a pass to 1.13 and a fail.

Published · Reviewed

An MT5 backtest report is a claim about one specific set of trades produced on one specific price history. Almost every misreading comes from dropping half of that sentence. The headline profit factor gets read as a property of the expert advisor. It is a property of two other things: the population of trades the report covered, and the ticks the tester was fed.

This article is the reading order that produces a decision. What the report assumed before it printed anything, which metric answers which question, where each number lies to you, and what each reading tells you to change. The procedure for producing a report is a separate job — run a backtest covers that end to end.

Test conditions
Experiment IDEXP-REPORT-READING-001
Parent experimentEXP-BACKTEST-RUNBOOK-001
Sourcedata/run-manifests/*.jsonresults, ledger_recomputed, shadow_runs
Populationall 23 runs published on mt5depot at the time of derivation
MT5 build6090 and 6140
ModelEvery tick generated from M1 bars (Model 0) and Every tick based on real ticks (Model 4)
Account10,000 USD deposit on all 23 runs
Last verified2026-08-26

Every figure below is a backtest, and all 23 runs carry a PASS verdict — they are the runs that cleared the listing gate. That makes this a survivor set, so nothing here says how often a backtest passes. It says what a passing report looks like from the inside.

Setup: what the report assumed before it printed a number

The Settings block at the top of an MT5 report is not preamble. It is the list of assumptions every number underneath inherits, and six of them decide whether the rest is worth reading. The broker name and build sit in the report’s own title line — ours read Exness-MT5Trial5 (Build 6090).

Settings fieldWhat it actually fixesWhat ours record
Symbol: / Period:The regimes the result is a sample of22 runs start in January 2019; cairn starts in June 2021
Model (tick generation)How ticks inside each bar were producedModel 0 (generated from M1 bars) on 12 runs, Model 4 (real ticks) on 11
Initial Deposit:The denominator for every percentage on the page10,000 USD on all 23
SpreadThe cost taken out of every legMeasured on exactly 1 of 23 — the rest inherit whatever the price history carried
CommissionA cost the tester applies only if you set it0 on all 23
Inputs:The settings that produced this, in fullVerified against the report on every run

The Inputs: list is the row people skip, and it is the one that makes a report reproducible at all: it is the complete set of values you would have to re-enter to get the same page back.

Two of those rows deserve a moment. A zero commission line does not mean commission was ignored. It means none was charged on the tested symbol. Those are different statements, and only the run record tells you which applies. And an unmeasured spread is not a zero spread: in 22 of our 23 runs that field is empty because no recorder ran alongside the test. Every leg simply took whatever spread the M1 history carried. Only tidewell-slack can state its own mean, at 19.14 points.

One naming trap belongs here. The field older guides call modelling quality is printed by MT5 as History Quality:, in the Results block next to Bars:, Ticks: and Symbols:. Searching a Build 6090 report for “modelling quality” finds nothing. In our own records the figure is present on only 2 of the 23 manifests, because it is kept when the source report stated one — that is a property of these records, not a measurement of how often MetaTrader prints it. Practically it means you cannot use it as a filter for reports you did not generate. The tick data source is the question underneath it, and that one is always answerable: ask which history the run used.

Reading the report, metric by metric

Read the page in this order. It is deliberately not the order MetaTrader prints it in, because the two cheapest disqualifiers sit at the bottom of the report.

  1. Read Settings first. Model, Initial Deposit:, spread and commission. Every percentage below inherits them, and a run with an unmeasured spread is not a run with no spread.
  2. Read Total Trades: before any ratio. A ratio and its sample size are one fact, not two. Write the count down next to the ratio.
  3. Ask which trades the headline covers. If a trade ledger is published alongside, check that its total matches Total Trades:. One of our own 23 reports does not.
  4. Read Equity Drawdown Maximal:, not the balance line, and note whether you took the Maximal or the Relative figure — they are separate rows.
  5. Find the price history. Which broker, which source, which period. This is the field that moved a verdict in our records; the tick model was not.

Here is the whole reading in one table, using the labels the report actually prints. The “in our set” column is what each metric did across 23 published runs. That beats a textbook range, because it was measured on the same kind of report you are holding.

Report labelThe question it answersIn our setRed flag
Total Trades:How much evidence there is108 to 4,725 per runUnder ~100; a ratio on 20 trades is a rumour
Profit Factor:Gross profit divided by gross loss (profit factor)1.22 to 1.59 across all 23Above ~2.0 on a short window; check Total Trades: first
Profit Trades (% of total):The win rate — the shape of the distribution, not its sign30.80% to 82.27%, all profitableQuoted on its own, with no profit factor beside it
Total Net Profit:Currency won, before context386.05 to 28,687.43 USD on the same 10,000 USD depositQuoted without Initial Deposit: and the number of years
Balance Drawdown Maximal:Worst dip on closed trades (max drawdown)0.67% to 18.24%Quoted while an equity line sits on the same page
Equity Drawdown Maximal:Worst dip including open positionsDeeper than balance in 23 of 23Ignored — it is the figure your margin lives on
Expected Payoff:Average result per trade, in currencyNot carried in our manifestsRead as a forecast rather than an average
Recovery Factor: / Sharpe Ratio:Return per unit of pain, two waysNot carried in our manifestsCompared across reports with different trade counts
History Quality:Whether the tick stream can resolve your stopStated on 2 of 23Absent and the data source is unknown

Two conventions in that block catch people out before any interpretation starts.

Total Trades: and Total Deals: are different counts. In MetaTrader 5 a round turn is two deals — one in, one out — so a report showing Total Trades: 50 shows Total Deals: 100 beside it, and partial closes add deals without adding trades. Read the ratios against trades, never against deals.

There are six drawdown lines, not one. The report prints Absolute, Maximal and Relative for both balance and equity. Worse, the money and the percentage swap places between two of them: Balance Drawdown Maximal: 36.84 (0.37%) puts the currency first, and Balance Drawdown Relative: 0.37% (36.84) puts the percentage first. Two reports can quote “0.37%” and “36.84” from adjacent lines and mean the same event — or different ones.

The rest of the Results block — Z-Score:, AHPR:, GHPR:, LR Correlation:, LR Standard Error:, Margin Level: and the MFE/MAE correlations — describes the shape of the equity curve rather than its size. None of it rescues a report whose trade count is too small, and none of it survives a change of price history any better than the profit factor does. Read it after the five steps above, or not at all.

Two of the metric rows do most of the damage in practice, so read them together rather than in sequence.

Net profit needs its denominator and its calendar. All 23 of our runs start from the same 10,000 USD, which makes them unusually comparable. They still span 0.51% to 57.38% per year. The low end is instructive. orrery reads a profit factor of 1.46 with a maximum drawdown of 0.67% — the best-looking pair of numbers in the catalogue. It earned 386.05 USD over 7.58 years. Nothing about that report is dishonest. It is answering a different question from the one most readers think they are asking.

Win rate and profit factor are close to independent here. Across the 23 published runs the correlation between them is 0.37. Most of what decides whether an EA makes money is therefore invisible to the win-rate line. nautical wins 30.80% of its trades and returns a profit factor of 1.22; gyre wins 82.27% and returns 1.59. Both are profitable, and the win rates are 51 points apart.

The profit factor your report is not showing you

This is the part no report shows you, and it is why we could write this article from our own data. Every published run keeps its complete closed-trade ledger, so each report splits in two. There is the slice the EA was selected on — the development window the listing was gated against. Then there are the trades that happened after it went live, which nothing was selected on. Twenty of our 23 runs publish both slices; the other three publish no post-listing slice at all.

EADevelopment slicePost-listing sliceHeadline
orrery1.28 (195 trades)6.43 (15 trades)1.46 (210 trades)
windrose1.31 (101 trades)3.58 (7 trades)1.38 (108 trades)
cairn1.48 (4,583 trades)1.64 (142 trades)1.48 (4,725 trades)
gyre1.55 (136 trades)— (5 trades, zero losers)1.59 (141 trades)
tessera1.28 (624 trades)0.88 (21 trades)1.27 (645 trades)
zerqon1.53 (232 trades)0.72 (21 trades)1.43 (253 trades)

Read the first and last columns of the orrery row together. The headline says 1.46; the period the EA was actually chosen on says 1.28; the difference is 15 trades — 7% of the record — running at a profit factor of 6.43. Read the zerqon row the same way and it runs the other direction: 1.53 on the development slice, 0.72 on the 21 trades since, and a headline of 1.43 that hides both.

Across the 20 runs that publish both slices, the headline reads better than the development slice in 14 and worse in 6. The other three are left out on purpose: with only one slice, their headline and their development figure cover exactly the same trades, so the difference between them is not a population effect at all — it is the report’s own two-decimal rounding against the recomputed ledger. almanac prints 1.52 where the ledger recomputes 1.5153. Apply that same rounding floor to the 20 and 13 of them still show a gap the rounding cannot explain, 8 of those in the flattering direction.

That asymmetry is not a scandal. A headline spanning two periods gets dragged toward whichever one was luckier. It does mean the headline is never the number to compare against a claim about future behaviour.

Pitfalls: how these numbers mislead

The failure mode underneath all five is the same: a report is a measurement of a population, and every metric on the page silently inherits whichever population the tester was pointed at.

Improve: what each reading tells you to change

One change per iteration, and re-read the same three figures each time: the trade count, the profit factor and the equity drawdown. The order below is by cost — the cheap checks first, because two of them regularly end the investigation.

  1. If the trade count is small, extend the period — do not touch the parameters. A profit factor built on fewer than about 100 trades moves more from a longer window than from any setting you could adjust. Our smallest published run has 108 trades, and it is the one whose ratios we quote most carefully.
  2. If the headline and the development slice disagree, re-read on the development slice only. That is the figure the settings were chosen against. It is the one to compare against any other candidate.
  3. If equity drawdown sits well above balance drawdown, size on the equity figure. The gap tells you how many positions the EA holds into the same move. The chrysalis run states it outright: up to seven at once.
  4. If the report came from someone else’s data, re-run it on a second source before anything else. This check has the largest measured effect in our whole set, and it is the last one people run.

What actually moved the numbers: data source, not tick model

One of our EAs was re-run deliberately to separate those two variables, and the run record labels each shadow with what it isolates.

tidewell-slack runWhat changedTradesProfit factorMax drawdownHistory qualityVerdict
PublishedExness M1 history, Model 03031.359.92%99%PASS
Shadow — isolates data sourceDukascopy history, Model 03511.1318.18%99%FAIL
Shadow — isolates real ticksDukascopy history, Model 43451.1118.20%100%FAIL

Read it as two separate experiments. Changing only the price history — row one to row two, same tick model — took the profit factor from 1.35 to 1.13, nearly doubled the drawdown, and flipped the verdict from pass to fail. Changing only the tick model on that new history — row two to row three — moved the profit factor by 0.02 and the drawdown by 0.02 points. And the history quality reads 99% and 100% on the two runs that failed, so the field most people screen on was excellent throughout.

A second EA points the same way from a different angle. kestrel-hover is published on Dukascopy real ticks at a profit factor of 1.33 with a 7.11% drawdown, and its shadow run on Exness M1 history at Model 0 reads 1.30 and 6.76% — both source and model changed at once, and the result barely moved. Stability across data sources is possible. It just is not something a single report can demonstrate.

The practical rule: a report is portable evidence only to the extent its price history is. Re-running on a second source costs one evening. In our records it is the only check in this article that has changed a decision.

Next steps: from a report to a decision

Reading a report well is the second of four steps. The sequence is backtest → read → walk-forward analysis → demo, and each one removes a different way of being wrong. A report that survives all four has earned a small position; one that survives the first two has earned another test.

  • Practise on records that are complete. The published EAs each ship their full closed-trade list and run manifest, so you can recompute a headline yourself and see exactly which trades produced it. That is the one exercise that makes the reading stick.
  • If a number sends you back to the strategy rather than the test, the Builder is where the rule itself changes. A search over settings is a different job again, covered in parameter optimisation.
  • Before you size anything on a drawdown figure you have just read, risk management for EA traders turns it into a deposit and a lot size.
  • How we produce, score and record all of this is set out in our testing methodology.

Past results in a tester are not a forecast, and none of the runs above is a promise about the next 12 months. The point of reading a report properly is smaller and more useful than a prediction. It tells you what has been demonstrated, and what has merely been printed.

Frequently asked questions

What is a good profit factor in an MT5 backtest report?
Ask which trades it covers before you judge the number. Every one of the 23 reports published on this site sits between 1.22 and 1.59, and the spread inside a single report is wider than the spread across the catalogue: orrery reads 1.28 over the 195 trades it was selected on and 1.46 once 15 later trades are included. A profit factor becomes meaningful when you can say how many trades produced it and whether those trades were used to choose the settings. Below about 25 trades it is close to uninformative — 16 of our 20 post-listing slices are that small, and their profit factors run from 0.72 to 6.43.
Why does my MT5 report show two different drawdown figures?
Because MetaTrader measures the balance curve and the equity curve separately, and equity carries open positions. Equity drawdown is the deeper of the two in all 23 of our reports; the largest gap is cairn at 14.52% on balance against 25.62% on equity, which is 11 points of pain that a balance-only quote hides. The gap is a property of how the EA holds positions — the chrysalis run records the reason plainly, that the EA can hold up to seven positions into the same move. There is a second axis too: MetaTrader reports both Maximal and Relative definitions, and 16 of our runs record the Maximal pair while 5 record the Relative pair. Quote the equity line, and say which definition it came from.
Does a high win rate mean the EA is good?
No, and our own set is the counter-example. Win rate across the 23 published reports correlates with profit factor at 0.37, which leaves most of the variation unexplained. nautical wins 30.80% of its trades and still returns a profit factor of 1.22; zerqon wins 78.26% and reads 1.43. The clearest case is what happened to zerqon afterwards: in the 21 trades since it was listed it kept winning 76.19% of the time and made a profit factor of 0.72, losing 61.47 USD. A win rate tells you the shape of the trade distribution, not its sign.
Can I trust a backtest report from someone else's data?
Treat it as a claim about their price history, not about the EA. We have one EA measured both ways, with the tick model held constant: tidewell-slack publishes 303 trades at a profit factor of 1.35 with a 9.92% drawdown on Exness M1 history, and the same EA over the same period on Dukascopy history produced 351 trades at 1.13 with an 18.18% drawdown — a fail under the same gate. Switching that Dukascopy run from generated ticks to real ticks then moved it by 0.02, to 1.11. The data source moved the verdict; the tick model did not. Ask which price history a report came from before you ask anything else.