diff --git a/index.html b/index.html
index 6a965f8..dca349b 100644
--- a/index.html
+++ b/index.html
@@ -739,7 +739,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
@@ -766,7 +766,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 = 13;
+const SUGGESTION_ENGINE_VERSION = 14;
const FOCUS_KEY = "pma_focus_v1";
const VIEW_KEY = "pma_view_v1";
const PF_SORT_KEY = "pma_portfolio_sort_v1";
@@ -1004,26 +1004,26 @@ function liquiditySignal(m){const vol=Math.min(1,Math.log10(m.volume+1)/6.0);con
function momentumSignal(m){const da=m.volume_1wk?m.volume_1wk/7:0;if(da<=0)return m.volume_24hr>0?0.3:0;return clamp((m.volume_24hr/da-0.5)/2.0,0,1);}
function categoryPolicy(cat){
return ({
- Politics:{minEdge:0.052,minVol:30000,minLiq:2500,minEvidence:0.58,uncertainty:0.012,label:"politics needs outside confirmation"},
- Sports:{minEdge:0.045,minVol:22000,minLiq:1800,minEvidence:0.54,uncertainty:0.008,label:"sports needs fresh event context"},
- Crypto:{minEdge:0.040,minVol:26000,minLiq:2200,minEvidence:0.52,uncertainty:0.006,label:"crypto allows faster trend reaction"},
- Economy:{minEdge:0.055,minVol:28000,minLiq:2400,minEvidence:0.58,uncertainty:0.014,label:"macro markets need stronger evidence"},
- "Pop Culture":{minEdge:0.048,minVol:18000,minLiq:1600,minEvidence:0.53,uncertainty:0.010,label:"culture markets need attention confirmation"},
- Other:{minEdge:0.060,minVol:32000,minLiq:2600,minEvidence:0.62,uncertainty:0.018,label:"uncategorized markets need the highest proof"},
- })[cat||"Other"]||({minEdge:0.060,minVol:32000,minLiq:2600,minEvidence:0.62,uncertainty:0.018,label:"uncategorized markets need the highest proof"});
+ Politics:{minEdge:0.040,minVol:22000,minLiq:1800,minEvidence:0.48,uncertainty:0.006,label:"politics needs outside confirmation"},
+ Sports:{minEdge:0.038,minVol:18000,minLiq:1400,minEvidence:0.47,uncertainty:0.004,label:"sports needs fresh event context"},
+ Crypto:{minEdge:0.035,minVol:20000,minLiq:1600,minEvidence:0.46,uncertainty:0.003,label:"crypto allows faster trend reaction"},
+ Economy:{minEdge:0.044,minVol:22000,minLiq:1800,minEvidence:0.50,uncertainty:0.007,label:"macro markets need stronger evidence"},
+ "Pop Culture":{minEdge:0.040,minVol:16000,minLiq:1300,minEvidence:0.46,uncertainty:0.005,label:"culture markets need attention confirmation"},
+ Other:{minEdge:0.048,minVol:24000,minLiq:1900,minEvidence:0.50,uncertainty:0.009,label:"uncategorized markets need the highest proof"},
+ })[cat||"Other"]||({minEdge:0.048,minVol:24000,minLiq:1900,minEvidence:0.50,uncertainty:0.009,label:"uncategorized markets need the highest proof"});
}
function frictionPenalty(m){
const liq=liquiditySignal(m);
const price=Math.min(m.yes_price,m.no_price);
- const thinPenalty=0.026*(1-liq);
- const tailPenalty=price<0.12?0.012:0;
- const lowLiqPenalty=m.liquidity=EXIT_STALE_DAYS)return `Stale exit after ${Math.floor(daysHeld(pos))} days`;
- if(analysis.side==="HOLD")return "Edge faded";
- if(analysis.side&&analysis.side!==pos.side)return `Model flipped to ${analysis.side}`;
- if(analysis.net_edge!=null&&Math.abs(analysis.net_edge)=MIN_ENTRY_EDGE)return `Model flipped to ${analysis.side}`;
const minExit=Math.max(30,(cfg&&cfg.minConv?cfg.minConv:45)-8);
- if(analysis.conviction`;
for(let i=0;i<5;i++){const v=mn+(span*i/4),yy=y(v);inner+=`${fmtUSD(v)}`;}
const w=Math.max(3,(W-padL-padR)/snaps.length*.48);
- closes.forEach((c,i)=>{const o=i?closes[i-1]:c,hi=Math.max(o,c)*(1+0.003),lo=Math.min(o,c)*(1-0.003),up=c>=o,col=up?getComputedStyle(document.documentElement).getPropertyValue("--green").trim():getComputedStyle(document.documentElement).getPropertyValue("--red").trim();const xx=x(i);
- inner+=``;});
+ closes.forEach((c,i)=>{const o=i?closes[i-1]:c,up=c>=o,col=up?"#7c8cff":"#fb7185";const xx=x(i);
+ inner+=``;});
const path=(arr)=>arr.map((v,i)=>`${i?"L":"M"}${x(i).toFixed(1)},${y(v).toFixed(1)}`).join(" ");
inner+=``;
inner+=``;
- hist.forEach((v,i)=>{const xx=x(i),yy=my(Math.max(0,v)),hh=Math.abs(my(v)-my(0));inner+=``;});
+ hist.forEach((v,i)=>{const xx=x(i),yy=my(Math.max(0,v)),hh=Math.abs(my(v)-my(0));inner+=``;});
for(const tick of chartTicks(times,4)){inner+=`${chartDateLabel(tick.t,true)}`;}
- inner+=`${cfg.name} equity candles · MA5 yellow · MA10 cyan · MACD bars`;
+ inner+=`${cfg.name} equity candles · MA5 yellow · MA10 cyan · neutral MACD bars`;
svg.innerHTML=inner;
const last=closes.length-1,trend=ma5[last]>=ma10[last]?"bullish":"bearish",mom=hist[last]>=0?"positive":"negative";
readout.innerHTML=`