Add Binance live trading, anti-stuck open/close recovery, and configurable rate limits.

OKX/Binance LIVE share half_open and option_closed_perp_pending repair paths; private REST throttles default to 1s and are tunable in settings.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-26 21:35:10 +08:00
parent e666230d0b
commit dbc86a1ce6
23 changed files with 2381 additions and 385 deletions
+1
View File
@@ -203,6 +203,7 @@ export type StrategySettings = {
net_profit_target: number;
premium_exit_multiple: number;
rest_seconds: number;
live_order_interval_sec?: number;
skip_weekends: boolean;
initial_equity: number;
leverage: number;
+27 -4
View File
@@ -28,6 +28,7 @@ export default function SettingsPage() {
const [netTarget, setNetTarget] = useState(15);
const [premMult, setPremMult] = useState(1);
const [rest, setRest] = useState(300);
const [orderInterval, setOrderInterval] = useState(1);
const [skipWeekends, setSkipWeekends] = useState(true);
const [leverage, setLeverage] = useState(3);
const [minHours, setMinHours] = useState(12);
@@ -67,6 +68,7 @@ export default function SettingsPage() {
setNetTarget(s.net_profit_target ?? 15);
setPremMult(s.premium_exit_multiple ?? 1);
setRest(s.rest_seconds);
setOrderInterval(s.live_order_interval_sec ?? 1);
setSkipWeekends(s.skip_weekends !== false);
setLeverage(s.leverage ?? 3);
setMinHours(s.min_option_hours ?? 12);
@@ -127,6 +129,7 @@ export default function SettingsPage() {
net_profit_target: netTarget,
premium_exit_multiple: premMult,
rest_seconds: rest,
live_order_interval_sec: orderInterval,
skip_weekends: skipWeekends,
leverage,
min_option_hours: minHours,
@@ -446,6 +449,23 @@ export default function SettingsPage() {
onChange={(e) => setRest(Number(e.target.value))}
/>
</div>
<div className="field">
<label htmlFor="orderInterval">实盘下单最小间隔(秒)</label>
<input
id="orderInterval"
className="mono"
type="number"
step="0.1"
min="0.2"
max="30"
value={orderInterval}
onChange={(e) => setOrderInterval(Number(e.target.value))}
/>
<p className="settings-hint">
LIVE 私有下单/查单间隔,默认 1s(非高频建议 ≥1)。范围
0.2–30。保存后立即生效。
</p>
</div>
<div className="field">
<label htmlFor="skipWe">周六日跳过开仓(上海时区)</label>
<select
@@ -484,8 +504,8 @@ export default function SettingsPage() {
{tab === "runtime" ? (
<div className="card settings-card">
<p className="settings-lead">
SIM = 本地撮合;LIVE = 交易所真下单(当前 OKX 已接,币安仅存密钥)。密钥只写入服务器{" "}
<span className="mono">.env</span>,接口不回传明文。
SIM = 本地撮合;LIVE = 当前所选交易所真下单(OKX / 币安均已接入)。密钥只写入服务器{" "}
<span className="mono">.env</span>,接口不回传明文。OKX 期权常需账户有 USDC;币安多为 USDT。
</p>
{runtimeOk ? <div className="settings-ok">{runtimeOk}</div> : null}
{err && tab === "runtime" ? <div className="err">{err}</div> : null}
@@ -574,7 +594,7 @@ export default function SettingsPage() {
</section>
<section className="settings-section">
<h3>币安 API(仅落盘)</h3>
<h3>币安 API</h3>
<div className="settings-fields">
<div className="field">
<label htmlFor="bnKey">API Key</label>
@@ -608,7 +628,10 @@ export default function SettingsPage() {
onChange={(e) => setBnSecret(e.target.value)}
/>
</div>
<p className="settings-hint">留空保存=不覆盖已有密钥。币安真下单后续接入。</p>
<p className="settings-hint">
留空保存=不覆盖已有密钥。交易所选币安且 LIVE 时用此密钥真下单(无
Passphrase)。
</p>
</div>
</section>