QuantKit

Sample report: what a VerifyEA report contains

A report has four parts: a header, a parameters table, a results table and a findings list. This sample shows all four with the client’s figures removed, so that you can judge the checks rather than the numbers.

Sample report · structure v1.0 · metrics withheld

Request a report The 12-check checklist

  • Report structureVersion 1.0
  • Performance figuresWithheld
  • Findings shown3, as examples
  • StatusSample, not a client report

The findings are examples of faults the checks are built to catch. They are not findings about any real expert advisor.

1. Report header

Copied from the MT5 report that was checked. The report states each field so that the run can be identified and repeated.

FieldValueWhy the report states it
EA nameredactedIdentifies the file whose hash is recorded in the package.
Test datewithheldTies the run to a build of the terminal and the data.
Broker / accountredactedSpread, commission and symbol properties are the broker’s.
InstrumentredactedSets the value of one price unit per lot, used in the lot-size check.
ModelEvery tickThe tick model decides how entries are priced.
PeriodwithheldThe independent run must cover exactly the same dates.
History qualitywithheldHow much of the period was modelled from real ticks. It limits every other check.
Ticks processedwithheldA plausibility check against the period and the instrument.
BarswithheldA plausibility check against the period and the timeframe.

“Redacted” hides an identity. “Withheld” hides a figure. A real report shows both.

2. Parameters

The inputs from the .set file, one row each, with the check that depends on them. Names here are generic and values are redacted.

ParameterValueCheck that uses it
Period filterredactedBoth runs must cover the same dates.
Risk per trade (%)redactedLot-size recomputation on the first trade (finding 3).
Stop-loss ruleredactedStop distance used in the lot-size recomputation.
Take-profit ruleredactedExit prices on the first trades are compared with the MT5 report.
Position-count limitredactedTrade-count parity between the two runs (finding 2).

3. Results

Every figure the MT5 report states, set beside the same figure from the independent run, with the arithmetic that links them.

ResultValueHow it is checked
Total tradeswithheldCounted in both runs over the same dates; the gap is shown against the stated tolerance.
Headline return figurewithheldRebuilt from the closed trades as gross result less commission and swap.
Gain-to-loss ratiowithheldRecomputed from the trade list; a large gap from the MT5 figure is a finding.
Hit ratewithheldRecomputed from the trade list.
Largest drawdownwithheldClosed-trade basis only; intraday floating equity is not certified without its own evidence.
Risk-adjusted ratiowithheldMethod and inputs stated, then recomputed.
Commission paidwithheldCompared with the broker’s stated round-turn rate (finding 3).
Swap paidwithheldChecked on trades held overnight.

4. Findings

Each finding names its severity, the check that detects it and the evidence the report would show. These three come from faults in our own earlier backtest engine; the check for each is written down in advance.

Severity scale. Critical: the result cannot be trusted at all. High: a material distortion. Medium: signals match, cost or size does not. Low: cosmetic or documentation.

Bar-indexing off-by-one Critical

  • What goes wrong

    The expert advisor decides on the last completed bar, which MT5 stores at series index 1. A port that reads the forming bar instead, or is off by one the other way, prices every entry on the wrong candle.

  • Symptom

    Entries priced on the wrong bar. The signal logic is right and the result is still not the MT5 result.

  • The check

    Take the first ten trades and compare each open time with the open time in the MT5 report.

  • Evidence shown

    A ten-row table: MT5 open time, independent open time, and the bars between them. Any non-zero row is listed. A constant shift across all rows points to indexing rather than noise.

Position-lifecycle filter High

  • What goes wrong

    An in_position guard blocks any new signal while a trade is open. The expert advisor allows concurrent positions, so the guard suppresses entries it would take. In our own history it removed a large share of the trades.

  • Symptom

    Fewer trades than MT5 and an inflated gain-to-loss ratio.

  • The check

    Trade-count parity: count the trades in the independent run and in the MT5 report over the same dates, and compare.

  • Evidence shown

    Both counts, the difference, the tolerance applied, and the position-count limit from the .set file. A gap together with a limit above one is where the guard is found.

Lot-sizing and commission parity Medium

  • What goes wrong

    The two engines value a price unit differently, or account for round-turn commission differently, so identical signals produce different position sizes or different costs.

  • Symptom

    Identical signals, different P&L.

  • The check

    Recompute the first trade’s lot size and compare it with the lot in the MT5 report. Then compare the commission charged on that trade with the broker’s stated rate.

  • Evidence shown

    The arithmetic in full, so you can repeat it:

lots = (balance × risk %) ÷ (|entry − stop-loss| × value per price unit per lot)The value per price unit comes from the broker’s symbol specification, not from an assumption.

Why the checks exist

We built a Python backtest engine to do our own research. When its output was checked against MT5, the research results for versions 1.0.0 through 1.0.5 were invalidated, because the backtest behind them was wrong. That failure is why this service exists. The three findings above are drawn from it.

Full case file

A full reproducible case file (open-licensed EA, .set, MT5 report, hashes) ships with the launch case-study article in December 2026.

Orders are not open. To hear when they are, join the founding list. Method and grading rules for the figures on this site: methodology.