Add win rate and profit-loss ratio to archive stats.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -42,6 +42,22 @@ def _fmt_pnl(v: Any) -> str:
|
||||
return f"{sign}{n:.2f}U"
|
||||
|
||||
|
||||
def _fmt_pct(v: Any) -> str:
|
||||
try:
|
||||
n = float(v)
|
||||
except (TypeError, ValueError):
|
||||
return "—"
|
||||
return f"{n:.1f}%"
|
||||
|
||||
|
||||
def _fmt_rr(v: Any) -> str:
|
||||
try:
|
||||
n = float(v)
|
||||
except (TypeError, ValueError):
|
||||
return "—"
|
||||
return f"{n:.2f}:1"
|
||||
|
||||
|
||||
def format_archive_trades_for_ai(payload: dict[str, Any]) -> str:
|
||||
trades = payload.get("trades") or []
|
||||
stats = payload.get("stats") or {}
|
||||
@@ -50,6 +66,7 @@ def format_archive_trades_for_ai(payload: dict[str, Any]) -> str:
|
||||
f"统计:开仓 {int(stats.get('open_count') or 0)} 笔,"
|
||||
f"盈利 {int(stats.get('win_count') or 0)} / 亏损 {int(stats.get('loss_count') or 0)},"
|
||||
f"平均盈利 {_fmt_pnl(stats.get('avg_win'))},平均亏损 {_fmt_pnl(stats.get('avg_loss'))},"
|
||||
f"胜率 {_fmt_pct(stats.get('win_rate'))},盈亏比 {_fmt_rr(stats.get('profit_loss_ratio'))},"
|
||||
f"最大盈利 {_fmt_pnl(stats.get('max_win'))},最大亏损 {_fmt_pnl(stats.get('max_loss'))},"
|
||||
f"犯病 {int(stats.get('sick_count') or 0)} 笔,"
|
||||
f"盈亏合计 {_fmt_pnl(stats.get('pnl_total'))},"
|
||||
|
||||
@@ -427,6 +427,19 @@
|
||||
return fmtPnlStat(v);
|
||||
}
|
||||
|
||||
function fmtWinRate(v, openN, winN) {
|
||||
if (v != null && v !== "") return Number(v).toFixed(1) + "%";
|
||||
if (openN) return (Math.round(((winN || 0) / openN) * 1000) / 10) + "%";
|
||||
return "—";
|
||||
}
|
||||
|
||||
function fmtProfitLossRatio(v) {
|
||||
if (v == null || v === "") return "—";
|
||||
const n = Number(v);
|
||||
if (!Number.isFinite(n)) return "—";
|
||||
return n.toFixed(2) + ":1";
|
||||
}
|
||||
|
||||
function renderStatsRow(label, e, isTotal) {
|
||||
const openN = e.open_count || 0;
|
||||
const sickN = e.sick_count || 0;
|
||||
@@ -444,10 +457,14 @@
|
||||
"</td><td>" +
|
||||
(e.loss_count || 0) +
|
||||
"</td><td>" +
|
||||
fmtWinRate(e.win_rate, openN, e.win_count) +
|
||||
"</td><td>" +
|
||||
fmtPnlStatOptional(e.avg_win) +
|
||||
"</td><td>" +
|
||||
fmtPnlStatOptional(e.avg_loss) +
|
||||
"</td><td>" +
|
||||
fmtProfitLossRatio(e.profit_loss_ratio) +
|
||||
"</td><td>" +
|
||||
fmtPnlStatOptional(e.max_win) +
|
||||
"</td><td>" +
|
||||
fmtPnlStatOptional(e.max_loss) +
|
||||
@@ -482,6 +499,8 @@
|
||||
loss_count: st.loss_count,
|
||||
avg_win: st.avg_win,
|
||||
avg_loss: st.avg_loss,
|
||||
win_rate: st.win_rate,
|
||||
profit_loss_ratio: st.profit_loss_ratio,
|
||||
max_win: st.max_win,
|
||||
max_loss: st.max_loss,
|
||||
},
|
||||
@@ -494,7 +513,7 @@
|
||||
.join("");
|
||||
elStats.innerHTML =
|
||||
'<table class="archive-stats-table"><thead><tr>' +
|
||||
"<th>范围</th><th>开仓</th><th>盈利单</th><th>亏损单</th><th>平均盈利</th><th>平均亏损</th><th>最大盈利</th><th>最大亏损</th><th>犯病</th><th>犯病占比</th><th>盈亏</th><th>剔除犯病盈亏</th>" +
|
||||
"<th>范围</th><th>开仓</th><th>盈利单</th><th>亏损单</th><th>胜率</th><th>平均盈利</th><th>平均亏损</th><th>盈亏比</th><th>最大盈利</th><th>最大亏损</th><th>犯病</th><th>犯病占比</th><th>盈亏</th><th>剔除犯病盈亏</th>" +
|
||||
"</tr></thead><tbody>" +
|
||||
rows +
|
||||
"</tbody></table>";
|
||||
|
||||
Reference in New Issue
Block a user