{"by":"direction","window":{"key":"all","requested_start":null,"requested_end":null,"observed_start":"2026-05-17T15:13:12+00:00","observed_end":"2026-10-02T20:30:00.034197+00:00","days":138.22},"basis":"ladder","min_trades":1,"groups":[{"key":"SHORT","trades":{"value":1113,"unit":"count","denominator":1634,"denominator_label":"closed gradeable trades in window (all groups)","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"COUNT(*) grouped by direction","methodology_version":"1.2.0"},"wins":{"value":684,"unit":"count","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"COUNT(*) WHERE ladder_roi_pct > 0","methodology_version":"1.2.0"},"losses":{"value":429,"unit":"count","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"COUNT(*) WHERE ladder_roi_pct <= 0","methodology_version":"1.2.0"},"win_rate_pct":{"value":61.4555,"unit":"percent","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"wins / trades * 100","methodology_version":"1.2.0"},"roi_points_sum":{"value":6847.7482,"unit":"roi_points","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"sum of per-trade ladder realised ROI percentages — NOT a portfolio return","methodology_version":"1.2.0"},"avg_roi_pct":{"value":6.1525,"unit":"percent_of_margin","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"mean ladder realised ROI per trade","methodology_version":"1.2.0"},"profit_factor":{"value":1.8749,"unit":"ratio","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"sum(positive ladder ROI) / |sum(negative ladder ROI)| — partitioned by the SIGN of realized_pnl_pct, which is not the ladder success definition","methodology_version":"1.2.0"},"compounded_return_pct":{"value":286.6391,"unit":"percent","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"geometric compounding over this group only; at allocation_pct=2 (caller-chosen sizing assumption, default 2, range 0.1-10; changing it changes this number — see equity_assumption.sizing_dependence_note)","methodology_version":"1.2.0","sizing_dependent":true,"allocation_pct":2.0},"max_drawdown_pct":{"value":-9.4536,"unit":"percent","denominator":1113,"denominator_label":"closed gradeable trades for direction=SHORT","window_start":"2026-05-17T15:13:12+00:00","window_end":"2026-10-02T20:30:00.034197+00:00","method":"peak-to-trough on this group's compounded curve; at allocation_pct=2 (caller-chosen sizing assumption, default 2, range 0.1-10; changing it changes this number — see equity_assumption.sizing_dependence_note)","methodology_version":"1.2.0","sizing_dependent":true,"allocation_pct":2.0}},{"key":"LONG","trades":{"value":521,"unit":"count","denominator":1634,"denominator_label":"closed gradeable trades in window (all groups)","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"COUNT(*) grouped by direction","methodology_version":"1.2.0"},"wins":{"value":316,"unit":"count","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"COUNT(*) WHERE ladder_roi_pct > 0","methodology_version":"1.2.0"},"losses":{"value":205,"unit":"count","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"COUNT(*) WHERE ladder_roi_pct <= 0","methodology_version":"1.2.0"},"win_rate_pct":{"value":60.6526,"unit":"percent","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"wins / trades * 100","methodology_version":"1.2.0"},"roi_points_sum":{"value":1592.6823,"unit":"roi_points","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"sum of per-trade ladder realised ROI percentages — NOT a portfolio return","methodology_version":"1.2.0"},"avg_roi_pct":{"value":3.057,"unit":"percent_of_margin","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"mean ladder realised ROI per trade","methodology_version":"1.2.0"},"profit_factor":{"value":1.3378,"unit":"ratio","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"sum(positive ladder ROI) / |sum(negative ladder ROI)| — partitioned by the SIGN of realized_pnl_pct, which is not the ladder success definition","methodology_version":"1.2.0"},"compounded_return_pct":{"value":36.2622,"unit":"percent","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"geometric compounding over this group only; at allocation_pct=2 (caller-chosen sizing assumption, default 2, range 0.1-10; changing it changes this number — see equity_assumption.sizing_dependence_note)","methodology_version":"1.2.0","sizing_dependent":true,"allocation_pct":2.0},"max_drawdown_pct":{"value":-23.1016,"unit":"percent","denominator":521,"denominator_label":"closed gradeable trades for direction=LONG","window_start":"2026-05-17T20:00:58+00:00","window_end":"2026-10-02T18:25:08+00:00","method":"peak-to-trough on this group's compounded curve; at allocation_pct=2 (caller-chosen sizing assumption, default 2, range 0.1-10; changing it changes this number — see equity_assumption.sizing_dependence_note)","methodology_version":"1.2.0","sizing_dependent":true,"allocation_pct":2.0}}],"group_count":2,"truncated":false,"sizing_dependent_metrics":["compounded_return_pct","max_drawdown_pct","sharpe_ratio","calmar_ratio","total_return_pct","final_equity","peak_equity","trough_equity","daily_returns"],"note":"Groups are ordered by trade count, not by performance. Losing groups are included; raise min_trades to judge statistical weight rather than filtering them out.","provenance":{"methodology_version":"1.2.0","methodology_url":"/api/v1/public/performance/methodology","source":"positions + signal_quality_metrics + partial_close_log + position_events","row_counts":{"positions_table_rows":1970,"closed_gradeable_trades":1634,"excluded_housekeeping_rows":336,"trades_with_telegram_message":1337,"trades_with_observed_exit_price":1484,"trades_with_nonreconciling_exit_price":1070,"trades_with_partial_fills":105,"trades_without_recorded_leverage":0,"tp_hit_events":1818,"distinct_symbols":94,"trades_with_ladder_accounting":1628,"trades_without_ladder_accounting":6,"trades_that_reached_tp1":694,"event_log_rows":155515,"event_log_rows_after_position_close":43,"event_log_rows_before_position_start":1,"positions_with_event_log_drift":41},"data_loaded_at":"2026-10-03T03:05:37.943715+00:00","cache_ttl_seconds":60.0,"snapshot_age_header":"X-Snapshot-Age-Seconds","consistency":"Every number on this surface is computed by one module, so no two endpoints can apply different definitions of a win, a window or a universe FOR THE SAME BASIS. The basis itself is a parameter — recorded, blended, ladder, default ladder — and it changes what a win measures: the final exit on recorded, the partial-fill correction on blended, the highest rung reached on ladder. A win is the sign of that basis's ROI on all three. Every payload names the basis it used and every metric restates the rule in its own method string, so two figures that differ can always be traced to the question each was answering. The data SNAPSHOT is cached per worker process for 60 seconds and the API runs several workers, so two endpoints can be answered from snapshots up to one TTL apart and differ by whatever closed in between. Compare provenance.data_loaded_at on the two responses before comparing their numbers — that field exists so the skew is measurable rather than deniable.","timestamp_policy":"Every timestamp published by this module is ISO-8601 in UTC (+00:00). Source columns are TEXT in mixed formats: positions.created_at/activated_at/closed_at and partial_close_log.executed_at always carry an explicit UTC offset; position_events.occurred_at is written naive in Asia/Tehran local time by app.trading.utils.now_sql_naive(). A naive value is therefore interpreted as Asia/Tehran and converted to UTC. There is exactly one conversion function, so no two timestamps in one payload can be in different zones.","money_figures_available":false,"money_note":"positions.pnl_usdt, positions.quantity and positions.exit_price are 100% NULL. Absolute profit in USDT is not computable from this dataset and is never published."}}