Every result page opens with the honesty panel: three tiles, one sentence, and a cost line. This note says exactly how those are produced, because a verdict is only worth something if the rule for it is public and the same for everyone. It was revised on 3 November 2026 after seven months of demo trading showed what the earlier version hid; both the old and the new figures for the same rule are at the end.
The split
A run covers a window of broker M5 data. By default the last 30 percent of the window is held out of sample: the rule is evaluated on the first 70 percent and then, with nothing changed, on the remaining 30 percent that it never saw. The share can be set between 10 and 50 percent. The split is chronological, never random, because a rule that leaks tomorrow into today is the easiest way to produce a curve that goes up.
On top of that, the last 30 calendar days before today are locked for every account. No window can end inside them. The holdout is enforced by the engine, not by the user.
The three tiles
Each tile shows total R, the number of trades, the win rate, the mean R per trade, the t-statistic of that mean against zero (the mean divided by its standard error), the spread paid per trade, and the trades it would take to confirm that mean.
- In sample. The part of the window the rule was built on. Shown first, judged last.
- Out of sample. The held-out part. This tile carries the verdict.
- Last quarter. The final 91 days of the window, whichever split they fall in. A staleness check, not a second test: did the rule still trade, and was it still net positive, recently.
R is the risk on one trade: a stop hit is about minus 1 R, a target at 2.5 to 1 is about plus 2.5 R, with the costs below charged at the fill. +0.1 R per trade means the same thing on US100 and on EURGBP.
What a fill costs
The engine was extracted from the backtester behind a rule-mining bot. In October 2026 the bot project replayed 1,471 live demo trades through that backtester's own fill model: the regenerated entries read +0.119 R per trade at the modelled fill and -0.013 R live for the same trades. The difference was the fill model and the spread, and it was the size of the edge the miner had been selecting on. Two things changed as a result; the legacy behaviour is kept behind an option so the extraction stays provable, and the product never runs it.
The fill offset. A pending entry used to fill at the level the moment a five-minute bar touched it. Live pending fills sit worse than the level by a per-symbol amount. The amount was measured by regenerating the entries of twenty control rules over June to October 2026 and matching them to about 5,650 live demo fills within an hour; the offset is the median of (live fill minus level) divided by the stop distance D. A negative median (USDJPY) is noise around zero and is applied as zero. Every entry now fills that many stop distances past the level, against the direction, with the stop and the target left on the level, so R falls by the offset on every trade.
| Symbol | Offset (D) | Matched fills | Symbol | Offset (D) | Matched fills |
|---|---|---|---|---|---|
| DJI30 | 0.14 | 931 | GOLD | 0.08 | 732 |
| US100 | 0.09 | 1,037 | XAUEUR | 0.14 | 430 |
| SP500 | 0.17 | 161 | COPPER | 0.30 | 130 |
| FTSE100 | 0.26 | 306 | USDJPY | -0.01 | 473 |
| CAC40 | 0.12 | 182 | EURJPY | 0.24 | 560 |
| GERMANY40 | 0.12 | 73 | GBPJPY | 0.40 | 126 |
| JP225 | 0.11 | 138 | AEX25 | 0.26 | 48 |
| ASX200 | 0.10 | 204 | SMI20 | 0.31 | 123 |
In pips, every symbol except USDJPY filled between one and five typical spreads past the level,
with or without a confirmation move; the median over the twenty measured sides is 2.8 spreads.
A symbol that was not measured is assumed to fill 2.8 typical spreads past the level, converted
to a fraction of each trade's own stop at run time, and the panel says so ("assumed, median of 20
measured sides"). The whole table, with quartiles and both sides, is in the repository as
content/fill_offsets.yaml, with the script that made it.
The spread factor. The spread field of an MT5 bar is the bar's minimum spread. Eight weeks
of demo ticks (7,773 hour starts) showed fills paying about 1.25 times it: entries 1.22 to 1.33,
stop-outs 1.20 to 1.27. The engine now charges 1.25 times the bar's spread at the fill. Some hours
are far worse, and for a long entry in one of them the hour's own measured ratio applies instead:
the first minute of 09:00 server on CAC40 (3.9 times), 01:00 server on EURUSD, USDJPY, GOLD and
XAUEUR (2.9 to 4.3 times, the post-rollover minute), and JP225's 03:00 and 11:00 (1.8 to 2.0
times). The cost line under the tiles prints the spread paid in R per trade and its share of the
gross, and a disclosure shows the judged split at the stress factor of 1.5.
The spread field of a bar is in points of the precision the symbol was quoted with when the bar was written. GOLD moved from three decimals to two on 4 August 2025; the engine converts each era with its own point, so a 0.18-dollar spread in 2024 is 1.8 pips, not 18, and the panel says so when a symbol's precision changed. No commission is modelled, because the Admirals CFD accounts the data comes from carry none on these instruments. Swap is charged per night when a rule holds overnight, including the triple-swap day.
The trigger
A rule has two ways to fire. State, the default and what the research engine always did, takes an entry on every bar the conditions hold while the rule is flat, and re-enters after a stop-out as long as they still hold. On a slow feature, a daily RSI say, the condition can stay true for days, so a state rule becomes a re-entry machine: the demo fleet's 54 EURJPY trades on one daily-RSI rule were all re-entries into the same episode. Onset gives one entry per episode: the episode arms on the bar the conditions become true, fires on the first bar the rule can act on (a no-trade hour or a wide-spread bar only delays it), and is spent by that entry; an episode that begins while a trade or a pending order is open is spent without one. The panel prints how many signals the onset trigger skipped; the same rule run both ways is the comparison that shows what the re-entries were worth.
The order
How the order gets in is three settings. Order type. A stop order, the default and what the research engine always did, is a pending placed the distance past the signal bar's close (above it for a long), filled the moment a bar touches it, with the fill offset above applied. A market order fills at the first one-minute open after the signal bar closes, plus the fill offset; it does not wait, so every signal that passes the filters becomes a trade. A limit order is a pending placed the distance back from the close (below it for a long) and fills only when a one-minute bar trades through the level by a point, a tenth of a pip: a touch is not a fill, because a limit that fills on a touch is the classic optimistic backtest. It fills at its level, with no offset, and the spread is charged as on every entry. Distance. Fixed pips (the engine's 2-pip buffer) or a fraction of the M5 ATR, which makes the same rule mean the same thing on US100 and on EURGBP. Expiry. A pending not filled within this many M5 bars after the signal bar is cancelled: 1 to 48, default 4, the twenty minutes the live bots gave a pending. The panel prints the signals placed, filled and expired. The M1 confirmation applies to stop entries only, because it places the pending at the confirmation level.
Two more switches sit last in the chain, after every other filter. A cooldown takes no new order for N bars after a losing exit; a daily cap takes no more than N fills in a broker day. The research behind the tool found no skill in either on the demo fleet, which is exactly why they are here: a tester can see that for their own rule. Because they sit last, what they remove is an order every other filter had let through, and the panel prints that count.
The stop and the target
The stop goes in one of three places. ATR, the default and the research engine's: a multiple of the signal bar's M5 ATR(14), 1 to 6. Pips: a fixed distance. Swing: the lowest low for a long, the highest high for a short, of the last N M5 bars ending at the signal bar, 3 to 100, measured from the pending level and floored at the broker's minimum stop distance. Every stop is then floored at 10 pips, the research engine's minimum (one index point on the index CFDs), and the panel says how many stops the floor raised. The target is a multiple of the stop distance (R, the default), a fixed number of pips, or a multiple of the ATR. R stays the risk on one trade whatever the stop type, so a swing stop that happens to be wide turns a target in pips into a small target in R; the panel prints the mean stop in pips and in ATR units so that is visible. Trailing starts at the trigger as before. After it the stop either locks once at (trigger minus 1) R, the research engine's rule, or trails a multiple of the previous bar's ATR behind the trade's extreme (the high so far for a long, the low for a short), or moves to the previous bar's low (long) or high (short); a trailed stop only ever tightens, and the previous bar's values are used so the stop a bar can hit was known at its open.
The days and the hours
A rule fires on the weekdays it is allowed to, all five by default, judged in broker time, and outside its no-trade hours. The session presets set those hours to everything outside the session: Asia 02:00 to 10:00, London 10:00 to 18:00, New York 16:00 to 23:00, all broker time. Broker time is Eastern European time, two hours ahead of UTC in winter and three in summer. London keeps its broker hours all year because the UK and the EU change their clocks together; New York is an hour off for the two or three weeks a year when the US and EU changes differ; and Asia drifts by an hour between summer and winter because the Asian centres do not change their clocks at all. The panel's filters line prints the days, the hours and the spread cap, and how many signals or bars each one removed, so a filter that does most of the work is visible.
The verdict
The out-of-sample tile is judged in this order:
- Fewer than 100 trades: no edge shown, whatever the t-statistic. The per-trade R of rules like these has a standard deviation of about 1.8 R, measured on 9,733 demo trades. At 20 trades the standard error is 0.40 R; a +0.2 R per trade edge needs about 310 trades to reach t = 2. A user trying ten variants on one symbol sees t of 2 on chance regularly. Below 100 trades the number is not evidence of anything yet.
- A positive mean with the t-statistic below 2: net positive, not yet distinguishable from chance. The tile says how many trades it would take to confirm that rate at t = 2, which is (2 times the standard deviation divided by the mean) squared, next to how many have been shown. There is no "weak evidence" level: at these counts a rule with no edge lands here most of the time.
- A positive mean of less than 0.05 R per trade, however consistent: the same verdict, with the reason "below the edge floor".
- The t-statistic of 2 or more with a mean of at least 0.05 R: edge shown. The sentence then adds the last quarter: positive last quarter or dormant last quarter.
- A negative mean: no edge shown unless the t-statistic is -2 or below, which is active, net negative: the rule has an edge, the wrong way round for the direction it was run in. The trades-needed line reads the same way for a loss: it says how many trades would confirm this mean, at t = -2, not an edge.
A rule with no real edge lands on "no edge shown" or "net positive, not yet distinguishable from chance" most of the time, and that is the point. More out-of-sample trades come from a longer window or a larger held-out share, not from re-running.
Runs that compare
Two kinds of submission run as a pair. A mirror runs the long and the short of the same conditions and shows the two panels side by side. A compare takes an earlier run, lets you change one knob, and shows the two next to each other with what differs between the specs and the figures of each as plain numbers: trades, R, R per trade, the out-of-sample split and its t-statistic, the spread paid per trade. "Pending versus market", "state versus onset", "two ATR versus the swing" are comparisons, not single runs, and the comparison is the lesson. Each run is judged on its own and nothing on the page ranks them; both count against the daily quota and both count as variants of their symbol and direction.
Variants
The panel counts how many variants of the same symbol and direction an account ran in the last 24 hours. Past ten, it says so. Thirty features at ten thresholds each is three hundred rules, and pure noise clears t = 2 in roughly seven of them. The more variants tried, the more likely one of them looks good by chance, and the verdict cannot know which.
The same rule, before and after
The rule on the front page: DJI30 long when the daily RSI is below 56.4, stop 2.5 ATR, target 3 to 1, a 0.2 ATR confirmation on one-minute bars, flat at day end, three years to 3 October 2026, the last 30 percent held out. The two columns differ only in the fill model and the spread.
| Legacy fill model (to 2 November 2026) | Measured fill model (from 3 November 2026) | |
|---|---|---|
| In sample, 1,464 trades | +21.7 R, +0.015 R per trade, t = 0.3 | -201.6 R, -0.138 R per trade, t = -3.1 |
| Out of sample, 729 trades | +56.8 R, +0.078 R per trade, t = 1.2 | -54.0 R, -0.074 R per trade, t = -1.2 |
| Last quarter, 305 trades | +3.0 R | -44.3 R |
| Spread per trade | 0.050 R at the bar minimum | 0.062 R at 1.25 times it |
| Fill offset | none | 0.14 D on every entry, measured on 931 demo fills |
| Verdict | weak evidence of a positive edge | no edge shown |
The difference between the columns is 0.15 R per trade, a tenth of a stop plus a quarter of the spread, taken before each trade starts. That is what the demo fleet paid and the old backtester did not see.
What the panel cannot tell you
That the next quarter will look like the last one. In the research behind the tool, chance alone accounted for 87 to 96 percent of the rules that survived a year out of sample, and a rule's backtest R per trade had no relation to its live R per trade (rank correlation -0.13). The panel reports what happened on unseen data, with the costs the fleet measured. It does not promise it again.