fix: 中控持仓卡合并最新风险与保证金展示

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-02 22:19:07 +08:00
parent 687a34474d
commit 0b8f410fbe
2 changed files with 172 additions and 66 deletions
+60 -10
View File
@@ -706,11 +706,17 @@
return null;
}
function resolveTrendSizingFooter(mo, trendPlan, isTrend) {
function resolveTrendSizingFooter(mo, trendPlan, isTrend, pos) {
const m = mo || {};
const p = pos || {};
if (!isTrend || !trendPlan || !trendPlan.id) {
return {
margin: m.exchange_initial_margin ?? m.plan_margin ?? null,
margin:
m.exchange_initial_margin ??
p.exchange_initial_margin ??
m.plan_margin ??
p.plan_margin ??
null,
leverage: m.leverage,
planBase: m.margin_capital,
positionRatio: m.position_ratio,
@@ -788,15 +794,59 @@
hubHoldDurationTimer = setInterval(tickHubHoldDurations, 1000);
}
function formatLatestRiskMeta(mo, trendPlan) {
function estimateLatestRiskUsdt(side, entry, sl, pos, mo) {
const e = Number(entry);
const s = Number(sl);
if (!Number.isFinite(e) || !Number.isFinite(s) || e <= 0) return null;
const sd = (side || "long").toLowerCase();
const rf = sd === "short" ? (s - e) / e : (e - s) / e;
if (!Number.isFinite(rf)) return null;
if (rf <= 0) return 0;
const m = mo || {};
const p = pos || {};
let notional = Number(p.notional_usdt);
if (!Number.isFinite(notional) || notional <= 0) {
notional = Number(m.exchange_notional);
}
if (!Number.isFinite(notional) || notional <= 0) {
const mc = Number(m.margin_capital);
const lev = Number(m.leverage);
if (Number.isFinite(mc) && mc > 0 && Number.isFinite(lev) && lev > 0) {
notional = mc * lev;
}
}
if (!Number.isFinite(notional) || notional <= 0) {
const c = Math.abs(Number(p.contracts));
const cs = Number(p.contract_size);
const mult = Number.isFinite(cs) && cs > 0 ? cs : 1;
const px = Number(p.mark_price);
const mark = Number.isFinite(px) && px > 0 ? px : e;
if (Number.isFinite(c) && c > 0) notional = c * mult * mark;
}
if (!Number.isFinite(notional) || notional <= 0) return null;
return Math.round(notional * rf * 100) / 100;
}
function formatLatestRiskMeta(mo, trendPlan, pos, tpsl) {
const m = mo || {};
const t = trendPlan || {};
const v =
let v =
m.latest_risk_amount != null && m.latest_risk_amount !== ""
? Number(m.latest_risk_amount)
: t.latest_risk_amount != null && t.latest_risk_amount !== ""
? Number(t.latest_risk_amount)
: null;
: pos && pos.latest_risk_amount != null && pos.latest_risk_amount !== ""
? Number(pos.latest_risk_amount)
: t.latest_risk_amount != null && t.latest_risk_amount !== ""
? Number(t.latest_risk_amount)
: null;
if ((v == null || !Number.isFinite(v)) && tpsl && pos) {
v = estimateLatestRiskUsdt(
pos.side || m.direction,
tpsl.entry,
tpsl.sl,
pos,
m
);
}
if (v != null && Number.isFinite(v)) {
return `最新风险: ${fmt(v, 2)}U`;
}
@@ -2837,7 +2887,7 @@
const upnl = resolveTrendFloatingPnl(pos, trendPlan);
const pnlFmt = formatFloatingPnlText(upnl, pos.notional_usdt);
const pnlText = pnlFmt.text;
const sizingFoot = resolveTrendSizingFooter(mo, trendPlan, isTrend);
const sizingFoot = resolveTrendSizingFooter(mo, trendPlan, isTrend, pos);
const openMeta = resolvePositionOpenMeta(mo, trendPlan, isTrend);
const marginText =
sizingFoot.margin != null && sizingFoot.margin !== "" && Number.isFinite(Number(sizingFoot.margin))
@@ -2855,7 +2905,7 @@
meta.push(monitorOrderSourceHtml(mo, trendPlan));
const riskLine = formatMonitorRiskMeta(mo, trendPlan);
if (riskLine) meta.push(riskLine);
const latestRiskLine = formatLatestRiskMeta(mo, trendPlan);
const latestRiskLine = formatLatestRiskMeta(mo, trendPlan, pos, tpsl);
if (latestRiskLine) meta.push(latestRiskLine);
if (trendPlan && trendPlan.id) {
const zone =
@@ -2875,7 +2925,7 @@
else meta.push("风格: —");
const riskLine = formatMonitorRiskMeta(mo, trendPlan);
if (riskLine) meta.push(riskLine);
const latestRiskLine = formatLatestRiskMeta(mo, trendPlan);
const latestRiskLine = formatLatestRiskMeta(mo, trendPlan, pos, tpsl);
if (latestRiskLine) meta.push(latestRiskLine);
const beOn = mo.breakeven_enabled === 1 || mo.breakeven_enabled === true;
meta.push(