diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx index 3ae2b43..9fe9e50 100644 --- a/frontend/src/pages/Settings.tsx +++ b/frontend/src/pages/Settings.tsx @@ -1,4 +1,4 @@ -import { FormEvent, useEffect, useState } from "react"; +import { FormEvent, ReactNode, useEffect, useState } from "react"; import { changeCredentials, getUsername, @@ -15,9 +15,38 @@ type StratSub = | "exit" | "pace"; +function RulesFold({ + open, + onToggle, + children, +}: { + open: boolean; + onToggle: () => void; + children: ReactNode; +}) { + return ( +
+ + {open ?
{children}
: null} +
+ ); +} + export default function SettingsPage() { const [tab, setTab] = useState("strategy"); const [stratSub, setStratSub] = useState("position"); + const [stratRulesOpen, setStratRulesOpen] = useState(false); + const [runtimeRulesOpen, setRuntimeRulesOpen] = useState(false); const [newUsername, setNewUsername] = useState(getUsername() || "admin"); const [currentPassword, setCurrentPassword] = useState(""); @@ -247,11 +276,6 @@ export default function SettingsPage() { {tab === "strategy" ? (
-

- {(runtime?.mode ?? mode) === "LIVE" - ? "当前 LIVE:仓位/选约/出场影响真下单;模拟资金已隐藏。" - : "当前 SIM:本地撮合;可改模拟资金与交易所行情源。"} -

{stratOk ?
{stratOk}
: null} {err && tab === "strategy" ?
{err}
: null} @@ -301,9 +325,6 @@ export default function SettingsPage() { 币安(USDT 永续 + 欧洲期权) -

- 有持仓时不可切换。切换后套用该所合约并重连行情。 -

{(runtime?.mode ?? mode) !== "LIVE" ? (
@@ -319,9 +340,6 @@ export default function SettingsPage() { setInitialEquity(Number(e.target.value)) } /> -

- 仅 SIM 显示。保存后重置权益(须无持仓)。默认 10000。 -

) : null}
@@ -405,9 +423,6 @@ export default function SettingsPage() { -

- 关闭时不限制 |ATM − 现价|;开启后超过下方点数则不开仓。 -

@@ -421,9 +436,6 @@ export default function SettingsPage() { value={maxAtmOff} onChange={(e) => setMaxAtmOff(Number(e.target.value))} /> -

- 仅开关开启时生效。币安行权价较粗时可能长时间无开仓机会。 -

@@ -491,9 +503,6 @@ export default function SettingsPage() { value={closeDevPct} onChange={(e) => setCloseDevPct(Number(e.target.value))} /> -

- 主要用于 SIM 流动性闸门;LIVE 以交易所能否成交为准。 -

@@ -530,9 +539,6 @@ export default function SettingsPage() { setOrderInterval(Number(e.target.value)) } /> -

- LIVE 私有下单/查单间隔,默认 1s。范围 0.2–30。 -

@@ -561,6 +567,53 @@ export default function SettingsPage() { ) : null} + setStratRulesOpen((v) => !v)} + > +
    +
  • + {(runtime?.mode ?? mode) === "LIVE" + ? "当前 LIVE:仓位/选约/出场影响真下单;模拟资金已隐藏。" + : "当前 SIM:本地撮合;可改模拟资金与交易所行情源。"} +
  • + {stratSub === "position" ? ( + <> +
  • 交易所:有持仓时不可切换。切换后套用该所合约并重连行情。
  • + {(runtime?.mode ?? mode) !== "LIVE" ? ( +
  • + 模拟资金:仅 SIM 显示。保存后重置权益(须无持仓)。默认 + 10000。 +
  • + ) : null} + + ) : null} + {stratSub === "select" ? ( + <> +
  • + 开仓 ATM 偏差限制:关闭时不限制 |ATM − + 现价|;开启后超过下方点数则不开仓。 +
  • +
  • + 开仓 ATM 最大偏差:仅开关开启时生效。币安行权价较粗时可能长时间无开仓机会。 +
  • + + ) : null} + {stratSub === "exit" ? ( +
  • + 平仓买一/标记最大偏差:主要用于 SIM + 流动性闸门;LIVE 以交易所能否成交为准。 +
  • + ) : null} + {stratSub === "pace" ? ( +
  • + 实盘下单最小间隔:LIVE 私有下单/查单间隔,默认 1s。范围 + 0.2–30。 +
  • + ) : null} +
+
+
@@ -697,13 +737,37 @@ export default function SettingsPage() { onChange={(e) => setBnSecret(e.target.value)} />
-

- 留空保存=不覆盖已有密钥。交易所选币安且 LIVE 时用此密钥真下单(无 - Passphrase)。 -

+ setRuntimeRulesOpen((v) => !v)} + > +
    +
  • + SIM = 本地撮合;LIVE = + 当前所选交易所真下单(OKX / 币安均已接入)。密钥只写入服务器{" "} + .env + ,接口不回传明文。OKX 期权常需账户有 USDC;币安多为 USDT。 +
  • +
  • + 当前:{runtime?.mode || "—"} · 交易所{" "} + {runtime?.exchange || "—"} ·{" "} + {runtime?.mode === "LIVE" + ? runtime.live_ready + ? "LIVE 就绪" + : `未就绪(${runtime.live_ready_reason})` + : "SIM"} + 。有持仓时不可切换模式。 +
  • +
  • + 密钥留空保存 = 不覆盖已有配置。交易所选币安且 LIVE + 时用币安密钥真下单(无 Passphrase)。 +
  • +
+
+