Mean holding time per trade, minutes.
Mean trade PnL, percent.
Calmar ratio: total PnL annualized over the shared daily bucket window (x 365/days) divided by maxSeriesDrawdownPercent. Infinity when the curve has no drawdown and PnL is positive (JSON-serializes to null, same as profitFactor/sortino).
Trade counts per exit reason.
Maximum drawdown of the cumulative trade PnL curve, percent.
95th percentile of holding time, minutes — spots eternal holds.
99th percentile of holding time, minutes — spots eternal holds.
The grid point these metrics belong to.
Gross profit divided by gross loss; Infinity when no losses.
Recovery factor: total PnL divided by maxSeriesDrawdownPercent. Infinity when the curve has no drawdown and PnL is positive (JSON-serializes to null, same as profitFactor/sortino).
Time-based Sharpe: mean/std * sqrt(days) over DAILY equity increments of the whole simulated range (idle days included, realized PnL booked on the exit day). Penalizes dead holding time — frozen capital is not free.
Ideas skipped because their author's own slot was busy (absorbed).
Time-based Sortino: like sharpe but deviation is computed over negative daily increments only. Infinity when the series has no losing day (consistent with profitFactor; a finite sentinel would mislead — real values can exceed any constant). NB: Infinity JSON-serializes to null in saved artifacts.
Sum of trade PnL percents over the range.
The point's trades in full — the SAME list for every point, winner or not, so any point is traceable ("why this pnl") by jq over the artifact without a re-run. The trade count is tradesList.length; best[].report.tradesList is the winner's copy. The per-author track is NOT here — it depends only on the grading rule (hold/lock/stop/trailing), not the whole point, so it lives deduplicated in tracks[] (far smaller than repeating it on every point).
Share of profitable trades, 0..1.
Aggregated metrics of one grid point (production slot semantics).