Show risk sizing as a dedicated Plan mode row (比例 / k / 预算).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-29 23:59:29 +08:00
parent 5eb169a636
commit f0b0b91f1b
2 changed files with 39 additions and 26 deletions
+38 -25
View File
@@ -158,11 +158,27 @@ export default function PlanPage() {
const exitRuleLabel =
exitMode === "premium_multiple"
? `权利金×${fmt(plan?.premium_exit_multiple ?? 1, 2)}`
: plan?.risk_based || plan?.sizing_mode === "risk_based"
: riskBased
? exitTarget != null
? `以损定仓 · 固定 ${fmt(exitTarget)} U(基数${fmt(plan?.risk_exit_unit ?? 15)}`
: `以损定仓 · 待估算(基数${fmt(plan?.risk_exit_unit ?? 15)}`
? `固定 ${fmt(exitTarget)} U(基数${fmt(plan?.risk_exit_unit ?? 15)}`
: `待估算(基数${fmt(plan?.risk_exit_unit ?? 15)}`
: `固定 ${fmt(plan?.net_profit_target ?? 15)} U`;
const riskRatioLabel = `比例${Number(plan?.risk_perp_unit ?? 1)}${Number(plan?.risk_option_unit ?? 2)}`;
const sizingModeLabel = riskBased
? [
"以损定仓",
riskRatioLabel,
plan?.risk_last_k != null ? `k=${fmt(plan.risk_last_k, 1)}` : null,
plan?.risk_sizing_preview?.budget != null
? `预算${fmt(plan.risk_sizing_preview.budget, 2)}U`
: null,
plan?.risk_sizing_preview?.ok === false
? String(plan.risk_sizing_preview.detail || "预览失败")
: null,
]
.filter(Boolean)
.join(" ")
: "手动仓位";
const phaseLabel = PHASE_ZH[plan?.phase || ""] || plan?.phase || "—";
const atmRule = plan?.fixed_direction_enabled
? plan?.fixed_perp_side === "short"
@@ -246,6 +262,10 @@ export default function PlanPage() {
<span className="plan-rules-k"></span>
{String(plan?.exchange || "okx").toUpperCase()} · ETH-USDT-SWAP
</p>
<p>
<span className="plan-rules-k"></span>
{sizingModeLabel}
</p>
<p>
<span className="plan-rules-k"></span>
{" "}
@@ -253,7 +273,11 @@ export default function PlanPage() {
? `${fmt(displayPerpQty, 2)} ETH`
: "—"}{" "}
/ {fmt(plan?.leverage, 0)}x
· {fmt(plan?.option_qty_eth ?? 2, 2)} ETH ·
· {" "}
{displayOptQty != null
? `${fmt(displayOptQty, 2)} ETH`
: "—"}{" "}
·
{fmt(plan?.min_option_hours, 0)}h ·
{fmt(plan?.min_option_leverage, 0)}x · {atmRule}
{plan?.skip_weekends ? " · 周末跳过开仓" : ""}
@@ -357,30 +381,19 @@ export default function PlanPage() {
</span>
</span>
</div>
<div className="kv">
<span></span>
<span className="mono">
{riskBased ? (
<span className="status-running">{sizingModeLabel}</span>
) : (
sizingModeLabel
)}
</span>
</div>
<div className="kv">
<span></span>
<span className="mono">
{plan?.risk_based || plan?.sizing_mode === "risk_based" ? (
<>
<span className="status-running"></span>
{" · "}
{fmt(plan?.risk_perp_unit ?? 1, 2)}:
{fmt(plan?.risk_option_unit ?? 2, 2)}
{plan?.risk_last_k
? ` · k=${fmt(plan.risk_last_k, 1)}`
: ""}
{plan?.risk_sizing_preview?.budget != null
? ` · 预算${fmt(plan.risk_sizing_preview.budget, 2)}U`
: ""}
{plan?.risk_sizing_preview?.max_loss != null
? ` · 估亏${fmt(plan.risk_sizing_preview.max_loss, 2)}U`
: ""}
{plan?.risk_sizing_preview?.ok === false
? ` · ${String(plan.risk_sizing_preview.detail || "预览失败")}`
: ""}
{" · "}
</>
) : null}
{displayPerpQty != null
? `${fmt(displayPerpQty, 2)}ETH`
+1 -1
View File
@@ -639,7 +639,7 @@ export default function SettingsPage() {
</select>
</div>
<div className="field">
<label htmlFor="sizingMode"></label>
<label htmlFor="sizingMode"></label>
<select
id="sizingMode"
className="mono"