Fix backtest tab: match API field names pnl_pct, max_dd
This commit is contained in:
@@ -208,8 +208,18 @@ function openDetail(name,tab){
|
||||
trades=(lastPaper.per_strategy_trades||{})[name]||[];
|
||||
} else if(tab==='live'&&lastData){
|
||||
ss=lastData.strategies||{};
|
||||
} else if(tab==='backtest'&&lastBT){
|
||||
ss={}; ss[name]=lastBT;
|
||||
} else if(tab==='backtest'&&lastBT&&lastBT[name]){
|
||||
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;
|
||||
if(!s){closeDetail();return}
|
||||
@@ -268,7 +278,7 @@ function renPaper(d){if(!d)return;var p=d.total_pnl||0;document.getElementById('
|
||||
// ═══════════ Backtests ═══════════
|
||||
function loadBT(){
|
||||
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 · $'+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 · $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>';
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user