diff --git a/modules/web/static/css/dashboard.css b/modules/web/static/css/dashboard.css index f78a149..c0151f0 100644 --- a/modules/web/static/css/dashboard.css +++ b/modules/web/static/css/dashboard.css @@ -337,6 +337,26 @@ white-space: nowrap; } +.dashboard-risk-item--daily-loss { + flex: 1.4 1 8.75rem; + min-width: 8.75rem; +} + +.dashboard-risk-item--daily-loss .dashboard-risk-value { + white-space: normal; + line-height: 1.35; + font-size: 0.86rem; +} + +.dashboard-risk-sub { + margin-top: 0.14rem; + font-size: 0.68rem; + font-weight: 500; + line-height: 1.3; + color: var(--text-muted); + white-space: normal; +} + .dashboard-risk-value.risk-switch-on { color: var(--profit); } diff --git a/modules/web/static/js/dashboard.js b/modules/web/static/js/dashboard.js index 6e96b87..f025b75 100644 --- a/modules/web/static/js/dashboard.js +++ b/modules/web/static/js/dashboard.js @@ -367,8 +367,9 @@ riskGridEl.innerHTML = items.map(function (it) { var val = it.valueHtml != null ? it.valueHtml : escHtml(it.value); var cls = 'dashboard-risk-value' + (it.valueClass ? ' ' + it.valueClass : ''); + var itemCls = 'dashboard-risk-item' + (it.itemClass ? ' ' + it.itemClass : ''); return ( - '
' + + '
' + '
' + escHtml(it.label) + '
' + '
' + val + '
' + '
' @@ -376,6 +377,30 @@ }).join(''); } + function buildDailyRiskItem(used, lim, slipBuf, cap) { + var main = used != null ? fmtNum(used) + '%' : '—'; + if (lim != null) { + main += ' / ' + fmtNum(lim) + '%'; + } + var item = { + label: '日亏损风控', + itemClass: 'dashboard-risk-item--daily-loss', + }; + var sub = ''; + if (slipBuf != null && cap != null) { + sub = '滑点 ' + fmtNum(slipBuf) + '% · 合计≤' + fmtNum(cap) + '%'; + } else if (slipBuf != null) { + sub = '滑点 ' + fmtNum(slipBuf) + '%'; + } + if (sub) { + item.valueHtml = escHtml(main) + + '
' + escHtml(sub) + '
'; + } else { + item.value = main; + } + return item; + } + function fmtHours(h) { if (h == null) return '—'; var n = Number(h); @@ -459,19 +484,9 @@ var dailyRiskCap = lim.daily_loss_total_cap_pct != null ? lim.daily_loss_total_cap_pct : st.daily_loss_total_cap_pct; - var dailyRiskText = dailyRiskUsed != null ? fmtNum(dailyRiskUsed) + '%' : '—'; - if (dailyRiskLim != null && dailyRiskUsed != null) { - dailyRiskText += ' / ' + fmtNum(dailyRiskLim) + '%'; - if (slipBuf != null) { - dailyRiskText += '(+滑点' + fmtNum(slipBuf) + '%'; - if (dailyRiskCap != null) { - dailyRiskText += ',合计≤' + fmtNum(dailyRiskCap) + '%'; - } - dailyRiskText += ')'; - } - } else if (dailyRiskLim != null) { - dailyRiskText += ' / ' + fmtNum(dailyRiskLim) + '%'; - } + var dailyRiskItem = buildDailyRiskItem( + dailyRiskUsed, dailyRiskLim, slipBuf, dailyRiskCap, + ); var marginPct = risk.margin_pct_used; var maxMarginPct = lim.max_margin_pct; var rollMaxPct = lim.roll_max_margin_pct; @@ -502,7 +517,7 @@ }, { label: '持仓限制', value: active + ' / ' + (maxPos != null ? maxPos : '—') }, { label: '日持仓限制', value: dailyOpens + ' / ' + (dailyPosLim != null ? dailyPosLim : '—') }, - { label: '日亏损风控', value: dailyRiskText }, + dailyRiskItem, { label: '手动平仓次数', value: manualCnt + ' / ' + (manualLim != null ? manualLim : '—') }, { label: '综合保证金占比',