🏆
-
Polymarket Arena
10 agents · strategies, copycats & whales
Broad signal engine · v22
+
Polymarket Arena
10 agents · strategies, copycats & whales
Broad signal engine · v23
@@ -362,7 +362,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
Personal research mode. This copy is for your own analysis, paper tracking, and manual trade research only. It does not pool money, onboard investors, custody funds, bypass eligibility rules, or place orders without your manual approval.
-
Build v22 active: agents scan the 500 most active markets and separate strict EV entries, trend probes, and a much broader set of tiny exploration trades while keeping settlement, spread, category, and drawdown limits.
+
Build v23 active: every agent and paper portfolio now shows a rolling 24-hour equity change alongside total return, while the broad tiered signal engine keeps its existing risk limits.
@@ -743,7 +743,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
@@ -770,7 +770,7 @@ const EXIT_STALE_DAYS = 10;
const EXIT_RESOLUTION_DAYS = 2;
const AGENTS_KEY = "pma_agents_v2";
const SUG_KEY = "pma_suggestions_v5";
-const SUGGESTION_ENGINE_VERSION = 22;
+const SUGGESTION_ENGINE_VERSION = 23;
const FOCUS_KEY = "pma_focus_v1";
const VIEW_KEY = "pma_view_v1";
const PF_SORT_KEY = "pma_portfolio_sort_v1";
@@ -2209,10 +2209,35 @@ async function runDailyCycle(){
}
/* ---------- Leaderboard helpers ---------- */
+function portfolioChange24h(p,currentEquity=null){
+ const snaps=(p&&p.snapshots||[]).filter(s=>{
+ const t=new Date(s.timestamp||`${s.date}T12:00:00Z`).getTime();
+ return Number.isFinite(t)&&Number.isFinite(Number(s.equity));
+ }).sort((a,b)=>new Date(a.timestamp||`${a.date}T12:00:00Z`)-new Date(b.timestamp||`${b.date}T12:00:00Z`));
+ if(snaps.length<2)return {available:false,pct:null,delta:null,hours:0};
+ const latest=snaps[snaps.length-1],latestTime=new Date(latest.timestamp||`${latest.date}T12:00:00Z`).getTime();
+ const cutoff=latestTime-86400000;
+ let baseline=null;
+ for(const snap of snaps){
+ const t=new Date(snap.timestamp||`${snap.date}T12:00:00Z`).getTime();
+ if(t<=cutoff)baseline=snap;
+ else break;
+ }
+ if(!baseline)baseline=snaps[0];
+ const base=Number(baseline.equity),current=Number.isFinite(Number(currentEquity))?Number(currentEquity):Number(latest.equity);
+ const baseTime=new Date(baseline.timestamp||`${baseline.date}T12:00:00Z`).getTime();
+ if(!(base>0)||!Number.isFinite(current))return {available:false,pct:null,delta:null,hours:0};
+ return {available:true,pct:(current/base-1)*100,delta:current-base,hours:Math.max(0,(latestTime-baseTime)/3600000)};
+}
+function format24h(change){
+ if(!change||!change.available)return "—";
+ const value=fmtPct(change.pct);
+ return change.hours>=20?value:`${value} (${Math.max(1,Math.round(change.hours))}h)`;
+}
function board(){
const st=loadState();
return AGENTS.map(c=>{const p=st.agents[c.id]||defaultPortfolio();const eq=equity(p);
- return {c,p,eq,pnl:eq-STARTING_BALANCE,ret:(eq/STARTING_BALANCE-1)*100};})
+ return {c,p,eq,pnl:eq-STARTING_BALANCE,ret:(eq/STARTING_BALANCE-1)*100,change24h:portfolioChange24h(p,eq)};})
.sort((a,b)=>b.eq-a.eq);
}
const MEDALS=["🥇","🥈","🥉"];
@@ -2372,7 +2397,7 @@ function renderLeaderboard(){
${row.c.name}
-
${fmtPct(row.ret)} return · ${row.p.positions.length} open · ${pct.toFixed(1)}% of draft allocation
+
${fmtPct(row.ret)} return · 24h ${format24h(row.change24h)} · ${row.p.positions.length} open · ${pct.toFixed(1)}% of draft allocation
${agentExposureSummary(row.c,row.p,row.amount)}