Interface ISweepPointReport

Aggregated metrics of one grid point (production slot semantics).

interface ISweepPointReport {
    avgHoldMinutes: number;
    avgPnlPercent: number;
    calmarRatio: number;
    exitReasons: Record<SweepExitReason, number>;
    maxSeriesDrawdownPercent: number;
    p95HoldMinutes: number;
    p99HoldMinutes: number;
    point: ISweepGridPoint;
    profitFactor: number;
    recoveryFactor: number;
    sharpe: number;
    skippedBusy: number;
    sortino: number;
    totalPnlPercent: number;
    tradesList: ISweepTrade[];
    winRate: number;
}

Properties

avgHoldMinutes: number

Mean holding time per trade, minutes.

avgPnlPercent: number

Mean trade PnL, 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).

exitReasons: Record<SweepExitReason, number>

Trade counts per exit reason.

maxSeriesDrawdownPercent: number

Maximum drawdown of the cumulative trade PnL curve, percent.

p95HoldMinutes: number

95th percentile of holding time, minutes — spots eternal holds.

p99HoldMinutes: number

99th percentile of holding time, minutes — spots eternal holds.

The grid point these metrics belong to.

profitFactor: number

Gross profit divided by gross loss; Infinity when no losses.

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).

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.

skippedBusy: number

Ideas skipped because their author's own slot was busy (absorbed).

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.

totalPnlPercent: number

Sum of trade PnL percents over the range.

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).

winRate: number

Share of profitable trades, 0..1.