From 82c72b2c69ed0d76f9d41261860a36eb59d60329 Mon Sep 17 00:00:00 2001 From: jaxperro Date: Wed, 22 Jul 2026 17:05:07 -0400 Subject: [PATCH] portfolio: per-wallet missed totals in wallets[] (missed_n, missed_pnl) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The feed's missed[] is a 60-row window of 1,388 — cards need lifetime numbers server-side (same lesson as the copybot dash's wallet_pnl). Co-Authored-By: Claude Fable 5 --- live/portfolio.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/live/portfolio.py b/live/portfolio.py index 804d1584..4e25c88b 100644 --- a/live/portfolio.py +++ b/live/portfolio.py @@ -599,7 +599,14 @@ def main(): "won": v["won"], "lost": v["lost"], "ref": v.get("ref", 0), "sold": v.get("sold", 0), "class": v.get("class", "volume"), "invested": round(v["invested"], 2), "realized": round(v["realized"], 2), - "conv_thr": conv_thr.get(v["wallet"], 1e12)} + "conv_thr": conv_thr.get(v["wallet"], 1e12), + # per-wallet missed totals over the FULL missed list — + # the feed's missed[] is a 60-row window, so the cards + # must get lifetime numbers server-side (2026-07-22, + # same lesson as the copybot dash's wallet_pnl) + "missed_n": sum(1 for m in missed if m["name"] == v["name"]), + "missed_pnl": round(sum(hypo_pnl(m) for m in missed + if m["name"] == v["name"]), 2)} for v in perW.values()], "current": [{"title": c.get("title", ""), "name": c["name"], "outcome": c.get("outcome", ""), "stake": c.get("stake"), "val": round(c["val"], 2), "pnl": round(c["pnl"], 2),