Reading the backtest report

Every number, what it means and how it is worked out.

Everything in a report is derived from the trades the engine actually filled and the equity at each bar close, so any number can be traced back to a trade. Costs are never added or assumed: profit is the price difference (E12).

How it went

NumberWhat it means
TradesHow many trades completed. Trades still open when the test ends are closed at the last bar's close and marked “open at end” (E24).
Net profitGross profit minus gross loss.
Win rateWinning trades as a share of all trades.
Profit factorGross profit ÷ gross loss. What it made for every unit it lost.
ExpectancyThe average result per trade, in money and in R. In R it is the mean of every trade's R outcome.
PayoffAverage win ÷ average loss.

What it cost

NumberWhat it means
Max drawdownThe deepest fall from a high in equity, in money and percent, with how many bars it stayed below that high.
Recovery factorNet profit ÷ max drawdown.
SharpeMean return ÷ the deviation of returns, annualised.
SortinoThe same, counting only downside deviation.
SQN√(number of trades) × mean R ÷ deviation of R. How steady the R outcomes were.
Time in marketThe share of bars with a trade open.
CAGR, Calmar, Ulcer indexAlso calculated by the engine: compound annual growth, growth ÷ max drawdown percent, and the root mean square of drawdown percentages.

How the trades behaved

NumberWhat it means
Bars per tradeAverage length of a trade.
Average run-upThe best each trade saw while it was open (MFE).
Average drawdown in tradeThe worst each trade saw while it was open (MAE).
Streaks, largest win and lossThe longest run of wins and of losses, and the single biggest of each.
R distributionHow many trades ended in each band of R.

Breakdowns

By the rule that opened the trade, by how the trade ended, by the confirmations that agreed, by side, by tag and by month. Name your rules with as and tag your orders, and these tables become much more useful.

Labels worth noticing

  • Above requested risk: the minimum lot carried more risk than the order asked for (E11).
  • Approximate intrabar: a tick-evaluated run had no finer data for some bars, which are listed (E2).
  • Unfilled: a market order created on the last bar of the test (E1).
Read this before trusting any number. Backtests are hypothetical. They use historical data and contain no spread, commission, fees, swaps or slippage, so live results will differ. Past performance does not guarantee future results.

Try this in the Terminal. AlgoBars is free: $0 a month, no card needed.

Create my free account