diff --git a/frontend/src/pages/Plan.tsx b/frontend/src/pages/Plan.tsx index 2d3600e..d94891a 100644 --- a/frontend/src/pages/Plan.tsx +++ b/frontend/src/pages/Plan.tsx @@ -915,49 +915,96 @@ export default function PlanPage() { - {(ladder.rows || []).map((r) => { - const tagZh = - r.tag === "atm" - ? "平值" - : r.tag === "itm" - ? "实值" - : "虚值"; - const hi = - (semiMny === "otm" && - r.tag === "otm" && - Math.abs(r.offset) <= Number(semiOtmOff) + 1e-9) || - (semiMny === "atm" && r.tag === "atm") || - (semiMny === "itm" && - (r.tag === "itm" || r.tag === "atm")); - return ( - - - {Math.round(r.strike)} - - {" "} - ({r.offset >= 0 ? "+" : ""} - {fmt(r.offset, 0)}) - - - {tagZh} - - {fmtTopEx("option", r.ask, r.ask_sz)} - - - {r.lev != null ? `${r.lev.toFixed(0)}x` : "—"} - - - ); - })} + {(() => { + const all = ladder.rows || []; + let shown = all; + if (semiMny === "atm") { + shown = all.filter((r) => r.tag === "atm").slice(0, 1); + } else if (semiMny === "otm") { + shown = all + .filter( + (r) => + r.tag === "otm" && + Math.abs(r.offset) <= + Number(semiOtmOff) + 1e-9, + ) + .sort( + (a, b) => + Math.abs(a.offset) - Math.abs(b.offset), + ) + .slice(0, 2); + // Call:虚值高行权在上;Put:虚值低行权在上 + shown.sort((a, b) => + semiView === "short" + ? a.strike - b.strike + : b.strike - a.strike, + ); + } else { + // 实值:最接近现价的 2 档 + shown = all + .filter((r) => r.tag === "itm") + .sort( + (a, b) => + Math.abs(a.offset) - Math.abs(b.offset), + ) + .slice(0, 2); + shown.sort((a, b) => + semiView === "short" + ? a.strike - b.strike + : b.strike - a.strike, + ); + } + if (shown.length === 0) { + return ( + + + 当前无符合「 + {semiMny === "itm" + ? "实值" + : semiMny === "atm" + ? "平值" + : "虚值"} + 」的报价档 + {semiMny === "otm" + ? `(偏离≤${fmt(semiOtmOff, 0)})` + : ""} + + + ); + } + return shown.map((r) => { + const tagZh = + r.tag === "atm" + ? "平值" + : r.tag === "itm" + ? "实值" + : "虚值"; + return ( + + + {Math.round(r.strike)} + + {" "} + ({r.offset >= 0 ? "+" : ""} + {fmt(r.offset, 0)}) + + + {tagZh} + + {fmtTopEx("option", r.ask, r.ask_sz)} + + + {r.lev != null ? `${r.lev.toFixed(0)}x` : "—"} + + + ); + }); + })()}