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` : "—"}
+ |
+
+ );
+ });
+ })()}