diff --git a/control/frontend/src/pages/Monitor.tsx b/control/frontend/src/pages/Monitor.tsx index 56e26ef..a2f5ec3 100644 --- a/control/frontend/src/pages/Monitor.tsx +++ b/control/frontend/src/pages/Monitor.tsx @@ -1,9 +1,4 @@ -import { - useCallback, - useEffect, - useState, - type ReactNode, -} from "react"; +import { useCallback, useEffect, useState } from "react"; import { apiFetch, clearSession, getToken, type NodeCard } from "../api"; function pickStrategy(n: NodeCard) { @@ -635,168 +630,143 @@ export default function MonitorPage() { -
| {row.k} | -{row.v} | -
|---|
正在从策略机拉取统计…
- ) : null} - {detailStatsErr ? ( -{detailStatsErr}
- ) : null} - {detailStats ? ( -| 定仓 | + {r.lossPct != null ?风险比例 | : null} +出场 | + {r.openRatio ?开仓比例 | : null} +杠杆 | +状态 | +模式/交易所 | +轮次 | +组 ID | +保证金 | +名义永续/期权 | +出场目标 | +指数 | +合约对 | +
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 组数 / 胜率 | -- {detailStats.groups} /{" "} - {(detailStats.win_rate * 100).toFixed(1)}% + | {r.sizing} | + {r.lossPct != null ?{r.lossPct} | : null} +{r.exit} | + {r.openRatio ?{r.openRatio} | : null} +{r.leverage} | ++ {detailRunning ? "运行中" : "已停"} · {detail.phase} | -||||||
| 总盈亏 | -- {fmt(detailStats.total_pnl, 2)} USDT + | + {detail.mode} / {detail.exchange} | -|||||||||||
| 永续手续费 | +{detail.rounds ?? "—"} | - {fmt(detailStats.fees_perp ?? 0, 4)} + {String( + detail.strat.group_id || + detail.position.group_id || + "—", + )} | -|||||||||||
| 期权手续费 | -- {fmt(detailStats.fees_option ?? 0, 4)} + | {String(detail.strat.perp_margin_mode || "—")} | ++ {fmt(detail.strat.perp_qty_eth, 4)} /{" "} + {fmt(detail.strat.option_qty_eth, 4)} ETH | -||||||||||
| 手续费合计 | +{fmt(detail.strat.exit_target_usdt, 2)} USDT | +{fmt(detail.index_px, 2)} | - {fmt(detailStats.total_fees, 4)} - | -||||||||||
| 滑点合计 | -- {fmt(detailStats.total_slip ?? 0, 4)} - | -||||||||||||
| 平仓原因 | -
- {Object.keys(detailStats.close_reasons || {})
- .length === 0
- ? "—"
- : Object.entries(detailStats.close_reasons)
- .sort((a, b) => b[1] - a[1])
- .map(([k, n]) => (
-
- {closeReasonZh(k)} × {n}
-
- ))}
+ {detail.pair
+ ? `${detail.pair.expiry_ymd || "?"} @ ${detail.pair.strike ?? "?"}`
+ : "—"}
|
暂无统计
- ) : null} -+ 最近错误:{String(detail.strat.last_error)} +
+ ) : null} + + +正在从策略机拉取统计…
+ ) : null} + {detailStatsErr ? ( +{detailStatsErr}
+ ) : null} + {detailStats ? ( +| 组数/胜率 | +总盈亏 | +永续手续费 | +期权手续费 | +手续费合计 | + {(detailStats.show_slip ?? + detailStats.mode !== "LIVE") ? ( +滑点合计 | + ) : null} +平仓原因 | +
|---|---|---|---|---|---|---|
| + {detailStats.groups} /{" "} + {(detailStats.win_rate * 100).toFixed(1)}% + | ++ {fmt(detailStats.total_pnl, 2)} USDT + | ++ {fmt(detailStats.fees_perp ?? 0, 4)} + | ++ {fmt(detailStats.fees_option ?? 0, 4)} + | ++ {fmt(detailStats.total_fees, 4)} + | + {(detailStats.show_slip ?? + detailStats.mode !== "LIVE") ? ( ++ {fmt(detailStats.total_slip ?? 0, 4)} + | + ) : null} ++ {Object.keys(detailStats.close_reasons || {}) + .length === 0 + ? "—" + : Object.entries(detailStats.close_reasons) + .sort((a, b) => b[1] - a[1]) + .map(([k, n]) => `${closeReasonZh(k)}×${n}`) + .join(" · ")} + | +
暂无统计
+ ) : null} +