No lookahead
A rule evaluated on a bar can see that bar and the ones before it, never the ones after. The order it raises fills at the next bar’s open. Deciding on a close and filling at that same close is the most common way a backtest invents money that was never available.
An ambiguous bar is a loss, and it is counted
When one bar’s range spans both the stop and the target, OHLC cannot say which was touched first. Assuming the target is the single biggest source of fantasy in retail backtesting, so every ambiguous bar resolves as a loss — and the number of them is reported with the result. If that number is large, the result rests on the assumption rather than on the strategy, and you can see that it does.
Gaps fill at the open, not at the level
A stop at 1900 on a bar that opens at 1880 fills at 1880. Filling at the price you asked for silently deletes gap risk, which is the risk stops exist for.
Costs are charged, not assumed away
Spread on the way in and on the way out, commission per lot, swap per lot for every night a position is held. The total paid is reported beside the profit, so the two are never confused.
Money
13- Net profit
- Return
- Trades
- Win rate
- Profit factor
- Expectancy
- Max drawdown
- Avg win / loss
- Largest win / loss
- Longest losing run
- Avg bars held
- Costs paid
- CAGR
Risk-relative (R)
7- Total
- Expectancy
- Avg win / loss
- Avg worst excursion
- Avg best excursion
- Winners went against you
- Losers went your way
Free3 runs, and 3 scripts of your own kept in the library.
LicenceRuns without a cap, and no limit on the strategies you keep.
See pricing →Strategies you write yourself
Three worked examples ship with it — EMA cross, RSI reversal, Donchian breakout — written against the same public API your own strategies use. Runs happen in a worker, so a slow rule costs a frame rather than the chart.
Trades drawn where they happened
Every fill is placed on the chart at the bar it filled on, with an equity curve in its own pane underneath. A row in a results table cannot tell you the entry was on a wick; the chart can.
An open position is not a trade
A position still running when the data ran out was closed artificially, so it is excluded from the win rate and reported separately. Counting an unfinished bet would flatter every figure above it.