Fix backtest tab: match API field names pnl_pct, max_dd

This commit is contained in:
ramseshk
2026-08-04 06:42:47 +00:00
parent cc2b7df740
commit 1c83fd378e
2 changed files with 3618 additions and 3 deletions
File diff suppressed because it is too large Load Diff
+13 -3
View File
@@ -208,8 +208,18 @@ function openDetail(name,tab){
trades=(lastPaper.per_strategy_trades||{})[name]||[]; trades=(lastPaper.per_strategy_trades||{})[name]||[];
} else if(tab==='live'&&lastData){ } else if(tab==='live'&&lastData){
ss=lastData.strategies||{}; ss=lastData.strategies||{};
} else if(tab==='backtest'&&lastBT){ } else if(tab==='backtest'&&lastBT&&lastBT[name]){
ss={}; ss[name]=lastBT; var b=lastBT[name];
document.getElementById('det-desc').textContent=(b.strategy||'')+' — 30-day backtest, Sharpe '+(b.sharpe||0).toFixed(2)+', max DD '+(b.max_dd*100).toFixed(1)+'%.';
document.getElementById('det-stats').innerHTML='<div class="stat"><div class="lbl">PnL</div><div class="val '+(b.pnl_pct>=0?'up':'dn')+'">'+(b.pnl_pct>=0?'+':'')+(b.pnl_pct||0).toFixed(2)+'%</div></div>'+
'<div class="stat"><div class="lbl">Sharpe</div><div class="val">'+(b.sharpe||0).toFixed(2)+'</div></div>'+
'<div class="stat"><div class="lbl">Max DD</div><div class="val dn">'+(b.max_dd*100).toFixed(2)+'%</div></div>'+
'<div class="stat"><div class="lbl">Win Rate</div><div class="val">'+Math.round((b.win_rate||0)*100)+'%</div></div>'+
'<div class="stat"><div class="lbl">From</div><div class="val" style="font-size:9px">'+(b.start||'').substr(0,10)+'</div></div>'+
'<div class="stat"><div class="lbl">To</div><div class="val" style="font-size:9px">'+(b.end||'').substr(0,10)+'</div></div>';
if(detSer)detSer.setData([]);
document.getElementById('det-trades').innerHTML='<tr><td colspan="7" style="text-align:center;color:var(--tx);padding:20px">Full trade data not in summary — run with --strategy to regenerate</td></tr>';
return;
} }
var s=ss?ss[name]:null; var s=ss?ss[name]:null;
if(!s){closeDetail();return} if(!s){closeDetail();return}
@@ -268,7 +278,7 @@ function renPaper(d){if(!d)return;var p=d.total_pnl||0;document.getElementById('
// ═══════════ Backtests ═══════════ // ═══════════ Backtests ═══════════
function loadBT(){ function loadBT(){
fetch('/cv/api/backtests').then(function(r){return r.json()}).then(function(data){ fetch('/cv/api/backtests').then(function(r){return r.json()}).then(function(data){
var h='';for(var i=0;i<data.length;i++){var b=data[i];h+='<div class="scard" onclick="openDetail(\''+b.strategy+'\',\'backtest\')\"><div class="sh"><div><div class="sname">'+b.strategy+'</div><div class="salloc">30-day &middot; $'+b.allocation+'</div></div><span class="stag run">BACKTEST</span></div><div class="spnl '+(b.pnl>=0?'up':'dn')+'">'+(b.pnl>=0?'+':'')+b.pnl.toFixed(2)+'%</div><div class="smeta"><span>Sharpe: <b>'+b.sharpe.toFixed(2)+'</b></span><span>DD: <b class="red">'+b.max_dd_pct.toFixed(2)+'%</b></span><span>Win: <b>'+Math.round(b.win_rate*100)+'%</b></span></div></div>';lastBT=b} var h='';lastBT={};for(var i=0;i<data.length;i++){var b=data[i];var pnl=b.pnl_pct||0;lastBT[b.strategy]=b;h+='<div class="scard" onclick="openDetail(\''+b.strategy+'\',\'backtest\')\"><div class="sh"><div><div class="sname">'+b.strategy+'</div><div class="salloc">30-day &middot; $100</div></div><span class="stag run">BACKTEST</span></div><div class="spnl '+(pnl>=0?'up':'dn')+'">'+(pnl>=0?'+':'')+pnl.toFixed(2)+'%</div><div class="smeta"><span>Sharpe: <b>'+b.sharpe.toFixed(2)+'</b></span><span>DD: <b class="red">'+(b.max_dd*100).toFixed(2)+'%</b></span><span>Win: <b>'+Math.round(b.win_rate*100)+'%</b></span></div></div>';}
document.getElementById('bt-sgrid').innerHTML=h||'<div style="padding:20px;color:var(--tx)">No backtests.</div>'; document.getElementById('bt-sgrid').innerHTML=h||'<div style="padding:20px;color:var(--tx)">No backtests.</div>';
}) })
} }