When a run finishes, the Backtest page switches to the results view: one surface that reads from top to bottom, from what ran to what it produced to every single trade.
At the top:
Right under the bar, the recipe that produced these numbers, in plain words: Structure (the legs as a small table: side, type, quantity and criterion; a leg placed at an offset from another leg sits indented under it, with its signed distance, +35 pt above that leg's strike and −30 pt below; an offset from spot says from spot), Period, Sizing, Entry, Exit and Costs. Each cell is a shortcut: clicking it reopens the recipe with this run's parameters and the matching settings of the plan open (Period opens the period, Sizing With, Entry the entry time, Exit the target, Costs the costs; Structure takes you to the legs). It always describes the run on screen, not what you may be editing.
The first band describes the whole run, whatever period the charts show.
Positions, not rows
Every per-trade figure counts positions. A position closed in three pieces (partial exits, leg groups) is one trade with the sum of its P&L. Adjustments opened by a Tactic are not trades of their own: their P&L is in the equity and in the net P&L, but not in win rate, profit factor or the per-lot averages.
When at least one filter excluded something, a thin bar under the KPIs answers the first question of every backtest: why so few trades? It reads N of M days traded, and the bar shows how the days of the period were spent. The ⓘ gives the full cascade:
When no day traded at all, the most restrictive step is shown in plain text. If the days were lost to refused entries, it names the reason that refused the most attempts (for example no entry: premium out of range).
Two charts share the time axis: the equity (starting capital + cumulative daily P&L, with a dashed reference at the starting capital) and the drawdown in dollars below it.
The period selector (1M · 3M · 6M · YTD · 1Y · ALL) zooms both. On a window, the equity keeps its level (it continues from the cumulative P&L before the window) while the drawdown is re-anchored to the start of the window: the peak is reset there, so you read the drawdowns within that window. The KPIs keep describing the whole run, as the note under the selector reminds you.
The page remembers your last 6 runs of this browser tab. The Run history button in the results bar shows how many there are; click it to open a panel with one row per run. The panel stays open while you pin runs, and closes when you click outside it, press Esc, scroll the page or open a run. From the keyboard, focus moves into the panel when it opens and leaving it closes it:
The runs overlaid on the chart are listed right above the equity, each with its dash and colour; the × next to a name takes it off the chart without reopening the history.
The history survives moving to other pages of the app, not a reload: what matters, you save.
A second band of compact figures:
If the engine had to approximate or skip something, the Warnings box lists it before the detail (up to eight lines, each aggregated by type with the dates involved). The full list of what can appear is in How the engine trades.
One row per calendar year: the return on the capital at the start of that year (the equity carries over from year to year) and the worst drawdown within the year. Both columns share one scale, so a year's return can be weighed against the dip it cost. The first and last years may be partial.
The full metrics ledger of Analysis, computed by the same engine as the Metrics module on the daily series of the backtest, with the backtest's starting capital: capital (initial, final, net profit, %, plus the average per trade), ratios (CAGR, Sharpe, Sortino, Calmar, K-ratio), drawdown and risk (max drawdown % and $, longest and average drawdown duration, annual volatility, VaR and CVaR 95%, the risk-free rate used) and the daily distribution (win rate, profit factor, best and worst day, 5th percentile day, average and median daily win and loss, longest winning and losing streaks).
The average per trade is the one row on a per-trade basis: net P/L ÷ number of trades, the average result of a whole position with all its contracts (the per-lot average is the one under Net P/L in the headline KPIs).
The other rows are, to the cent, the numbers you will read in Analysis after saving the backtest. Their basis is the day, while the headline KPIs other than Sharpe and Sortino are per position: with several entries per day, win rate and profit factor can differ between the two, by construction. Backtests saved before this tab existed show a note asking to re-run them.
Every position, partial exit and adjustment, one row each:
Above the table: Sort (opened, P/L, premium, P/L %) and direction, an Outcome filter (all, settlement, target, stop, time exit: early exit, minutes in trade and the close before an economic release; stop also keeps the per-leg stops; target and stop appear only when the recipe can close that way: its own profit target or stop loss, its per-leg stop, a leg group's, or one set by a profit or timed action), Columns (show, hide and reorder, remembered by the browser) and Export CSV (see The exported CSV). A timeline scrubber under the toolbar moves through the trades over time; the table pages 25 rows at a time.
The ▶ button on each row opens that trade in Rewind: from a saved backtest through a permanent link, otherwise by handing the trade over directly (same fills, same costs, no need to save first). Rewind keeps the log at hand: it steps to the previous or next trade in the log's current sort and filter, and Trade log brings you back here (Moving through the list).
Export CSV always writes the standard options trade log layout: the same 28 columns, in the same order and units, as the trade logs that Import reads. A backtest can therefore be compared row by row with a log from another backtester, or imported into Analysis as a strategy with its legs (replayable in Rewind). The rows follow the log's current sort and Outcome filter; the Columns choice only affects the table on screen.
Backtests saved before these columns existed leave the commission split, ratios, VIX, gap, movement and Max Profit/Loss empty: run them again to fill them in.
The page remembers where you were while you move around the app (not across a reload): the open tab, the log's sort, direction, Outcome filter and page. Coming back from Rewind, the results reopen on the run you were reviewing, on the page of the last trade you viewed, with its row marked and scrolled into view.
An analysis not everyone needs, so it sits in the More menu at the end of the tabs, not in a tab of its own. It answers the question to ask before adding an economic event rule: does this strategy really behave differently on those sessions? It is computed when you open it, on the run on screen, with the event calendar of the day.
At the top choose the sessions to look at: Day before, Event day or Day after (the choice is remembered). For every event type, against the other sessions of the backtest:
The verdict and the If skipped column answer two different questions. The Sharpe here is computed on the daily P&L (annualized, without the risk-free rate), and skipping ordinary sessions moves it too (for a profitable strategy it drops a little, because fewer days trade): a small negative change doesn't mean those sessions are good. Read the verdict to know whether the sessions differ, and If skipped to see what a rule would do.
Above the table, a check for chance. With eighteen event types tried at once, one always looks different. A White Reality Check (the empirical max test also used by the Study) measures how often luck alone would produce a difference as large as the most different type's from the strategy's average session (over the dates known for that type), given how many types were compared: below 5% it says the difference goes beyond chance, otherwise it reminds you to read the single verdicts with care.
Save backtest stores the run (recipe, dataset version, daily P&L, trade log, statistics, warnings) under the run name. Inside a shared space it is saved in the space; the "Saved as" note only appears while you are in the scope where it was saved.
Names in the archive are unique: two backtests never share one. Names are compared ignoring letter case and extra spaces, so "Iron Fly 30" and "iron fly 30" count as the same name. If the run name already belongs to a saved backtest, saving asks what to do:
Saving again a run that is already saved under that name does nothing: its results can't have changed. Backtests saved before this rule may still share a name: rename one with Edit name, note & tags.
A saved backtest is reopened without re-running (the historical data doesn't change): from the archive, from the ⌘K palette (Backtests), from the Overview, or from a link. Its recipe is loaded into the composer, so it can be varied and re-run like any run, or used as the starting recipe of a study.
Backtest archive lists every saved backtest. Open it from the Research sidebar or from Archive, next to the Compose · Study · Results switch at the top of the Backtest page (the runs of the tab are still there when you come back). It shows them as cards or as a dense list (the toggle on the right of the toolbar; the choice is remembered on this device). On a phone the archive always shows cards. A header above the toolbar counts the backtests (filtered/total while a filter is on). Each item shows its name with the Veeman mark (the same sign the backtest carries wherever it appears in Analysis), the period of its data, the number of trades, when it was saved, its tags, its note and the key figures of its run. Cards add a sparkline of the equity. In the list the figures sit right next to the name and the actions line up on the right: Open, Rewind, Save as strategy and the ⋯ menu. When the list is too narrow for their labels they become icons, and hovering one names it.
The figures are the run's own statistics, the same ones its results page shows (Sharpe and Sortino included, with the same risk-free rate). By default you see P/L, CAGR, Max DD, Sharpe, Win rate and Profit F.; the Metrics picker in the toolbar lets you choose between two and six of P/L, MAR, CAGR, Max DD, Sortino, Profit factor, Sharpe, Win rate and Volatility. Backtests saved before a figure existed show a dash for it.
The toolbar works like the Analysis library toolbar:
Clear filters, next to the count and in the "no matches" message, resets the search and every filter at once.
A note is free text attached to a saved backtest: why you kept it, what it showed, what to try next. Up to 1,000 characters, line breaks included. Cards show the first three lines (hover for the rest); the list shows the first line under the name. Click a note to edit it, or use Add a note (on a card, or in the ⋯ menu). The note travels with the backtest in a shared space, but not into the strategy copy made by Save as strategy.
In the edit form, ⌘↵ (Ctrl+Enter) saves from any field and Esc cancels; if you changed something, Esc asks before discarding it.
Tags are free labels (0dte, iron condor, live…), normalized like the library's: lowercase,
up to 24 characters each and 12 per backtest. They share one vocabulary with the Analysis library,
and the tag field suggests the ones you already use (see
Tag suggestions). Each item offers:
In a shared space the ⋯ menu also offers versions, comments and copying, and an edit made while someone else saved the same backtest is stopped with a conflict instead of overwriting their change.
A saved backtest is a strategy for Analysis, through two doors:
The metrics never change across the bridge: Analysis recomputes them with the same engine and the same capital the detailed metrics tab used. From a library strategy born from a backtest, Reopen in Research loads its frozen recipe into the Backtest console and runs it again.
When a portfolio holds several backtests that trade the same strike at the same time, the strike guard asks what each strategy should do (shift the structure, shift the leg, or skip the entry) and the portfolio uses the backtests re-run with that rule. The archived backtest is never changed by it.
A saved backtest stops at the last day of market data that existed when it ran. From a portfolio, Update data re-runs its Veeman backtests on today's data, and each new run replaces the backtest in the archive the way Overwrite does: same name, tags, note and hidden mark, the earlier run removed. A recipe that ran to the end of the data has its end date moved to the latest day; a recipe with no end date keeps none; a recipe that ends on a date chosen before the data did (an in-sample, a study period) is extended only if you ask.
Every run records the last day of market data available when it ran. That is how an update tells a recipe that follows the data from one that stops on purpose. The new run also remembers which run it replaced, so a portfolio still on the earlier run finds it the next time it is updated, and a strategy saved from the backtest with Save as strategy follows it onto the new run.
A backtest with economic event rules (or a close before economic events) also records the version of the event calendar it was resolved on, and every update resolves the rules again on the calendar of the day: a release added or rescheduled since the earlier run is taken into account. A backtest that is already at the latest day but was resolved on an older calendar is run again too; if its trades don't change, only the record of the calendar is refreshed.