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
- 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.
| Field | Value | Why the report states it |
|---|---|---|
| EA name | redacted | Identifies the file whose hash is recorded in the package. |
| Test date | withheld | Ties the run to a build of the terminal and the data. |
| Broker / account | redacted | Spread, commission and symbol properties are the broker’s. |
| Instrument | redacted | Sets the value of one price unit per lot, used in the lot-size check. |
| Model | Every tick | The tick model decides how entries are priced. |
| Period | withheld | The independent run must cover exactly the same dates. |
| History quality | withheld | How much of the period was modelled from real ticks. It limits every other check. |
| Ticks processed | withheld | A plausibility check against the period and the instrument. |
| Bars | withheld | A 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.
| Parameter | Value | Check that uses it |
|---|---|---|
| Period filter | redacted | Both runs must cover the same dates. |
| Risk per trade (%) | redacted | Lot-size recomputation on the first trade (finding 3). |
| Stop-loss rule | redacted | Stop distance used in the lot-size recomputation. |
| Take-profit rule | redacted | Exit prices on the first trades are compared with the MT5 report. |
| Position-count limit | redacted | Trade-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.
| Result | Value | How it is checked |
|---|---|---|
| Total trades | withheld | Counted in both runs over the same dates; the gap is shown against the stated tolerance. |
| Headline return figure | withheld | Rebuilt from the closed trades as gross result less commission and swap. |
| Gain-to-loss ratio | withheld | Recomputed from the trade list; a large gap from the MT5 figure is a finding. |
| Hit rate | withheld | Recomputed from the trade list. |
| Largest drawdown | withheld | Closed-trade basis only; intraday floating equity is not certified without its own evidence. |
| Risk-adjusted ratio | withheld | Method and inputs stated, then recomputed. |
| Commission paid | withheld | Compared with the broker’s stated round-turn rate (finding 3). |
| Swap paid | withheld | Checked 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_positionguard 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:
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.