Proof
The verdict is only worth something if the test is honest.
Four rules we found the hard way, now enforced by the engine on every run.
1. No lookahead. Three specific bugs, regression-tested.
Most published backtests are wrong for a handful of mechanical reasons, and every one of them flatters the strategy. We shipped three of them ourselves and found them the hard way:
Fill-bar management lookahead
The engine checks the stop and the target on the bar the order filled using that bar’s full high and low — price that printed before the fill. It fabricates winners on wide bars. ProofBench manages a trade strictly from the fill onward and awards a target on the fill bar only when the close confirms it.
Signal-bar fills
A limit order gets filled on the low or high of the very bar that generated the signal — a price that existed before the signal was knowable. Those phantom “touch-and-run” fills are the wins a real order can never catch. In ProofBench an order exists only from the signal bar’s close; the earliest fill is the next bar.
Trail-ratchet lookahead
A trailing stop is only real where price has not already gone past it. Ours moved to levels the bar had already closed beyond, then paid out there — an exit the live strategy can never take. Two code audits and a full test suite missed it. The first complete day of live trading found it in an afternoon, and correcting it took our own headline result down by an order of magnitude. That is the part of this page we would most like you to remember.
All three are permanent regression tests. An engine change that reintroduces any of them fails the build.
2. Holdout first. The verdict is the comparison.
A setup runs on declared training months and on holdout months it never influenced. The stamp is decided by how the holdout behaves relative to training — rate, shape, sample size — not by the size of the training number. The same rules on unseen data, behaving the same way: that is the whole test.
Because the holdout is enforced, the usual failure mode — tuning until the curve looks good, then discovering it was noise — shows up as a WEAK or REJECTED stamp before any money moves.
3. Parity with NinjaTrader, measured rather than assumed.
The procedure is fixed: the engine’s trade ledger for a day is published in advance, then reconciled against NinjaTrader playback — trade by trade, exit by exit, to the dollar. Divergence classes are declared before the run (marginal touches, trail-path differences, time-stop fills, session close) so that what remains is a bug, not an excuse.
Interpretation is settled separately and continuously: switch on the diary and the Bridge writes down what it decided on every bar — each condition, each direction, the trigger and its level — and that log is compared against the engine’s, bar for bar. The last run disagreed on nothing, across five setups, four of them written to be awkward rather than flattering.
That covers which trades are proposed, not what they are worth. Fill-level reconciliation — trade by trade, to the dollar — has so far been completed on the fair-value-gap path. The signals added most recently have a probe written for them and have not been through a playback yet. We would rather tell you which half of the promise you are standing on than let one word cover both.
This procedure found real defects that no unit test or code review caught — order-quota behavior, stale order references at the historical-to-realtime transition, a data export that silently disabled part of the feature set. Each became a permanent check.
4. Bars decide. Ticks fill.
The rules are evaluated on three-minute bars — the same ones on your chart. The fills are resolved on NinjaTrader’s own ticks, read through NinjaTrader’s own API rather than a third-party feed. And before a day’s ticks may price a single trade, they have to rebuild that day’s bars — open, high, low, close — exactly. Days that fail are thrown out, not patched. Ten of the first seventy were.
Where ambiguity still remains, it is resolved against the trade and never for it:
- If a stop and a target could both have printed inside one bar, the stop is assumed.
- A target on the fill bar counts only when the close confirms it.
- A limit order needs a one-tick penetration and never fills on the bar that produced the signal.
- Exits that fire “at the close” fill a tick later in reality; costs are charged per leg.
And a run that could not reach the ticks does not get to call itself a verdict. Every result records how its fills were decided; one that resolved them from bars alone is stampedBAR-FILLED and its grade is demoted to a provisional figure. We added that check after quoting a bar-filled number as a verdict ourselves — on the same trades, the honest fills turned a passing grade into a rejection.
Every verdict screen states these limits next to the numbers, together with the size of the gap as measured trade by trade against NinjaTrader playback. A backtest that will not tell you what it cannot see is asking you to find out with money.
What this means for you
- You can be wrong quickly and cheaply, before a live chart is involved.
- A VALIDATED stamp means the rules held on data they did not shape — not that they will hold forever. Setups are re-run as each new month of data arrives.
- The chart runs the setup you built, not a summary of it — and shows you its reading bar by bar, so a decision you disagree with is one you can see.