Aggregated metrics of one grid point (production slot semantics).
point: ISweepGridPoint
The grid point these metrics belong to.
skippedBusy: number
Ideas skipped because their author's own slot was busy (absorbed).
totalPnlPercent: number
Sum of trade PnL percents over the range.
avgPnlPercent: number
Mean trade PnL, percent.
winRate: number
Share of profitable trades, 0..1.
profitFactor: number
Gross profit divided by gross loss; Infinity when no losses.
maxSeriesDrawdownPercent: number
Maximum drawdown of the cumulative trade PnL curve, percent.
calmarRatio: number
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).
recoveryFactor: number
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).
avgHoldMinutes: number
Mean holding time per trade, minutes.
p95HoldMinutes: number
95th percentile of holding time, minutes — spots eternal holds.
p99HoldMinutes: number
99th percentile of holding time, minutes — spots eternal holds.
sharpe: number
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.
sortino: number
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.
exitReasons: Record<SweepExitReason, number>
Trade counts per exit reason.
tradesList: ISweepTrade[]
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).