Make risk guard symbol aware

This commit is contained in:
Codex
2026-06-24 05:30:12 +03:00
parent 4112a17bc5
commit a6c94b1555
4 changed files with 168 additions and 12 deletions
+15
View File
@@ -741,6 +741,7 @@ HTML = r"""
${panel('Risk guard', kvTable([
['Block entries', risk.block_new_entries ? 'yes' : 'no'],
['Size multiplier', num(risk.position_size_multiplier, 4)],
['Blocked symbols', (risk.blocked_symbols || []).join(', ') || 'none'],
['Consecutive losses', String(risk.consecutive_losses ?? 0)],
['Today PnL', money(risk.today_pnl)],
['Recent PF', num(risk.recent?.profit_factor, 3)],
@@ -753,6 +754,7 @@ HTML = r"""
['Remote equity', money(reconciliation?.account?.total_equity)]
]) + discrepanciesHtml(reconciliation?.discrepancies || []))}
</div>
${panel('Risk by symbol', symbolRiskTable(risk.symbols || []))}
${panel('Data quality by symbol', qualityTable(quality.symbols || []))}
${panel('Probability calibration', calibrationTable(analytics?.probability_calibration?.buckets || []))}
${panel('Failed checks', simpleTable(Object.entries(drift.failed_checks || {}).map(([key, value]) => ({ check: key, count: value })), ['check', 'count']))}
@@ -876,6 +878,19 @@ HTML = r"""
})), ['symbol', 'status', 'score', 'candles', 'issues']);
}
function symbolRiskTable(rows) {
return simpleTable(rows.map(row => ({
symbol: row.symbol,
block: row.block_new_entries ? 'yes' : 'no',
trades: row.trades,
win: num((row.win_rate || 0) * 100, 1) + '%',
avg: signed(row.avg_net_percent, 3) + '%',
pf: num(row.profit_factor, 3),
losses: row.consecutive_losses,
reasons: (row.reasons || []).join(', ') || 'none'
})), ['symbol', 'block', 'trades', 'win', 'avg', 'pf', 'losses', 'reasons']);
}
function calibrationTable(rows) {
return simpleTable(rows.map(row => ({
bucket: row.bucket,