Fix backtest tab: match API field names pnl_pct, max_dd
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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 · $'+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>';
|
document.getElementById('bt-sgrid').innerHTML=h||'<div style="padding:20px;color:var(--tx)">No backtests.</div>';
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user