# 比特骆驼自动化对冲系统 — 更新说明

> 每次发版 / 合并重要改动后，在本文档顶部追加一条（日期新→旧）。  
> 关联审计结论写在同条「审计」小节。

---

## 2026-07-30 — 中控文档与设置增强

### 变更

1. 完善 `docs/中控Fleet说明.md`；README / 代码结构 / 开发方案增加中控入口与目录说明。  
2. 中控设置改为 Tab（登录账户 / 添加策略机 / 策略机列表）；改密后隐藏默认账号提示；局域网免登录开关。  
3. 监控卡片运行中绿色、详情弹层持仓、更新二次确认、浮盈颜色加粗等（见中控说明 §5）。

---

## 2026-07-30 — 中控 Fleet Control（同仓 / Token 运维）

### 变更

1. 策略机新增 `/api/fleet/*`（status/start/pause/update/issue-login）与设置页 Token 保存；免密登录 `/fleet-login` + `/api/auth/fleet-exchange`。  
2. 同仓新增 `control/` 中控：监控卡片、系统设置、启停/更新/免密登录代理；Token 中控加密存储。  
3. 策略机远程更新走 Fleet Token 调本机 `deploy/lib/update.sh`；中控本机一键部署 `scripts/deploy_control.py` + `control/deploy/update.sh`。  
4. 说明见 `docs/中控Fleet说明.md`。

---

## 2026-07-30 — 策略 SoT 加固：资金门 fail-closed / 统一开仓管道

### 变更

1. 资金门 fail-closed（`None`/异常拒绝开仓）；选约后用选中腿 ask。  
2. 等待选约只预览兑 USDC、不落库定仓；落库仅在选约成功后。  
3. 自动/手动开仓共用 `open_pipeline.size_and_gate`；兑汇冷却不可 force 绕过。  
4. 持仓禁止改出场/名义/以损参数；热切 LIVE 强制 pause + 非默认 AUTH_SECRET。  
5. 划转刷新余额缓存；HTTP 备份下载剥离 `.env`。  
6. 基线：无交易所人工开平、运行中无人工手动平仓。

### 审计

见 `docs/审计说明-2026-07-30-策略SoT与资金门.md`（三轮）。

---

## 2026-07-30 — 自动兑 USDC：不等待选约，USDC 不够即兑

### 变更

1. 策略空仓循环在选约**之前**先刷新以损定仓名义并检测交易账户 USDC；不够则市价兑换（不再因「无合格期权」跳过）。  
2. 兑换失败/不足时错误提示会带上需/有 USDC；成功兑换有 45s 冷却防砸单。

---

## 2026-07-30 — 手动兑换改走交易账户

### 变更

1. `/api/funds/convert`（SIM）改为 `account=trading`；LIVE 本就现货交易账户，兑换后清余额缓存。  
2. 设置页文案改为「交易账户」兑换。

---

## 2026-07-30 — 持仓锁定出场目标 / 暂停以损定仓重算

### 变更

1. 开仓成交后将出场目标写入 `groups`/`positions.exit_target_usdt`，盯盘优先用锁定值。  
2. 持仓期间计划页不再用盘口实时以损定仓覆盖名义 / k / 目标；平仓后再自动计算。  
3. `apply_risk_sizing_to_ledger` 在有活跃仓时拒绝改写。

---

## 2026-07-30 — OKX 交易账户自动兑 USDC（开仓前）

### 变更

1. 仅 **OKX**（SIM + LIVE）：开仓前若交易账户 USDC **不够**当前期权开仓所需，则在交易账户内市价 `USDT→USDC`。  
2. 目标持仓 = 期权所需 × **2**；已够开仓则不兑换；预留永续保证金，避免兑光 USDT。  
3. 不走资金账户、不做 funding↔trading 划转；币安不生效。

### 审计

- 钩子：以损定仓写名义之后、资金门之前（自动 + 手动开一组）。  
- SIM `convert(account=trading)`；LIVE 沿用现货 `USDC-USDT` cash 市价单。

---

## 2026-07-29 — 以损定仓：预览两位小数 / 比例与出场可配 / 计划页标识

### 变更

1. 预览「预算」「估亏」统一保留两位小数。  
2. 以损定仓可设永续/期权比例与出场基数（k=1）；改出场后按比例联动名义。  
3. 对冲计划选约条件显示「以损定仓」及比例。

---

## 2026-07-29 — 以损定仓（智能调仓）

### 变更

1. 设置页仓位模式二选一：**手动** / **以损定仓**；互斥手填名义与出场。  
2. 以损定仓：亏损幅度（交易账户总资金或单独本金）或亏损值；每次开仓前按 ATM 卖一+指数粗估手续费反推 `k`（一位小数向下），写出永续 `1k` / 期权 `2k` / 出场 `15k`。  
3. 估算最大亏损 = 权利金(`ask×2k`) + 手续费(`指数×fee_rate×3×k`)，保证 ≤ 预算。

### 审计

见同日推送前两轮自审（公式边界、开仓钩子、设置互斥、回归测试）。

---

## 2026-07-29 — 部署：半截 .venv 必须重建（缺 activate）

### 变更

1. 判定 venv 可用改为同时检查 `bin/activate` + `bin/python3`（仅有目录或仅有 python 仍会删掉重建）。

---

## 2026-07-29 — 部署：自动安装 python3-venv（ensurepip）

### 变更

1. Python 就绪判定改为检测 `ensurepip`（避免仅有 python3 却误报 OK）。  
2. 一键部署自动安装 `python3-venv` / `python3.X-venv`；pull 后二次检测；损坏的 `.venv` 自动重建。

---

## 2026-07-29 — 部署：等待 apt 锁（unattended-upgrades）

### 变更

1. 一键部署装 Node/系统包前等待 `dpkg`/`apt` 锁释放，避免新机撞上自动升级报错退出。

---

## 2026-07-29 — 文档：云服务器配置选择说明

### 变更

1. [`docs/开发方案.md`](./开发方案.md) 增加 **§6.0 云服务器配置选择说明**（最低/推荐/余量规格、地域网络、选型速查）。  
2. [`docs/商业化与授权方案.md`](./商业化与授权方案.md)、[`README.md`](../README.md) 同步交付速查与链接。

---

## 2026-07-29 — 第四轮：查仓失败≠空仓；回滚/账本幂等

### 变更

1. 平仓查仓 `None` 与 `0` 分离：查失败禁止空仓 finalize（防幽灵平仓）。  
2. 永续开仓异常且查仓失败时禁止回滚期权（保留 opening）。  
3. `half_open` / promote 权利金入账幂等（按 group 已有 `open_option` 跳过）。  
4. `opening` 未 stamp 时仍扫任意期权残留；OKX 开仓改用 `perp_open_contracts_okx`；opening 恢复成功后同 tick 继续 manage。

### 审计

详见 [`docs/审计说明-2026-07-29-开平仓与实盘安全.md`](./审计说明-2026-07-29-开平仓与实盘安全.md)。

---

## 2026-07-29 — 第三轮：opening 恢复 / 期权对账 / 平仓兜底

### 变更

1. 开仓意图 `stamp_opening_intent`：崩溃后仍带 `option_inst_id` 可恢复。  
2. `recover_opening`：空仓清槽 / 仅期权→half_open+repair / 双边→提升 open；启动与 tick / 紧急全平触发。  
3. 开仓前对账增加期权仓（含 flat 时任意期权残留）。  
4. 平仓：期权已空跳过再卖；有 close fill 不二次入账；pending 且永续已空不下单。  
5. 永续开仓异常先查仓再决定是否回滚期权；币安错误带 `orderId=`；币安保证金模式落库并 `set_margin_type`。

### 审计

详见 [`docs/审计说明-2026-07-29-开平仓与实盘安全.md`](./审计说明-2026-07-29-开平仓与实盘安全.md)。

---

## 2026-07-29 — 第二轮审计：abandon residual / 部分成交 / residual 账本

### 变更

1. OKX 弃期权：双腿已卖掉期权并落 `option_closed_perp_pending` 时，续平永续，不再误记 residual（防期权双计）。  
2. OKX 等成交超时仅接受 `filled`，不再把部分成交当全成。  
3. LIVE residual 到期结算 `allow_negative`，避免本地拒记卡 pending。  
4. 币安开期权保留 opening 仅匹配 `orderId=`；紧急全平对 stuck `opening` 明确告警。

### 审计

详见 [`docs/审计说明-2026-07-29-开平仓与实盘安全.md`](./审计说明-2026-07-29-开平仓与实盘安全.md)。

---

## 2026-07-29 — 开平仓/实盘安全审计修复

### 变更

1. **Critical**：到期双平不再二次入账期权（`skip_option_cash` 跟 `pending_perp_only`）。  
2. **Critical**：弃期权平永续后本地账本强制 `allow_negative`，避免交易所已平、本地卡仓。  
3. 开仓写入 `groups.perp_margin_mode`；平仓用开仓时模式；持仓中禁止改保证金模式。  
4. 手动开/平仓走策略引擎锁，避免与自动 tick 竞态。  
5. OKX 等成交加长并超时有成交则回填；含 `ordId` 的未确认失败保留 `opening`。  
6. 修复 positions-history 盈亏查询未带时间过滤；LIVE 拒绝默认 `AUTH_SECRET`；币安可开不再误调 OKX 资金。

### 审计

详见 [`docs/审计说明-2026-07-29-开平仓与实盘安全.md`](./审计说明-2026-07-29-开平仓与实盘安全.md)。

---

## 2026-07-29 — 实盘资金读交易所；永续全仓/逐仓

### 变更

1. 选择 LIVE 时立即隐藏「模拟资金」（跟表单模式，不必等保存后的 runtime）。  
2. LIVE 资金条总资金/资金账户/交易账户读 OKX；总资金按 USDT 等值（USDC×汇率）；划转/兑换后立即刷新顶栏。  
3. 策略仓位增加「永续保证金模式」：全仓（默认）/ 逐仓；仅永续；OKX 期权仍固定 cash。

---

## 2026-07-29 — 顶栏名称/导航去背景

### 变更

1. 标题区与顶部导航去掉底色/描边块，改为透明文字导航；选中项仅用强调色。

---

## 2026-07-29 — 期权标题去掉指数（指数只在永续行情）

### 变更

1. 期权 ATM / 持仓期权标题不再附带指数；指数仍在「永续行情」卡片显示。

---

## 2026-07-29 — 永续市价；期权标题带指数；ETH 大写

### 变更

1. 选约条件数量单位改为 `ETH`。  
2. 永续行情增加「市价」（标记价，缺则买卖一中间价）。  
3. 期权标题在 `@ 行权价` 后显示当前指数。

---

## 2026-07-29 — 策略卡：浮盈合并；选约显示仓位数量

### 变更

1. 策略卡「永续浮盈 / 期权浮盈」合并为一行「永续/期权浮盈」。  
2. 选约条件增加 `永续Neth/期权Meth`（读 `perp_qty_eth` / `option_qty_eth`）。

---

## 2026-07-29 — 桌面端：备份规则说明、交易记录表格翻页

### 变更

1. 备份恢复：说明文字收入「规则说明」；服务器备份列表一行一项，桌面最多显示约 5 行（可滚动）。  
2. 运行模式：企业微信说明收入「规则说明」。  
3. 交易记录（仅电脑端）：表格列（序号/组名/方向/持仓状态/开平时间/时长/盈亏/平仓方式）+ 每页 10 行翻页；手机端列表不变。  
4. 手机端继续隐藏顶部资金条。

---

## 2026-07-24 — 策略设置：固定方向开关

### 变更

1. 选约增加 **固定方向**（默认关）：开则固定永续多→买 Put，或永续空→买 Call。  
2. 固定方向开启时，期权只选 **实值或平值**（Call：K≤标的；Put：K≥标的），不买虚值；ATM 偏差限制不适用。  
3. 关闭时仍按现有 ATM / 卖一比价规则开仓。

---

## 2026-07-29 — 企微不标模拟盘；已完成组数按已平仓统计

### 变更

1. 企业微信：SIM 不再显示「模拟盘」；LIVE 显示「实盘·OKX/币安」。  
2. 「已完成 N 组」改为按 `groups.status=closed` 计数，与实际平仓组一致（修正漂移显示 6 实为 5）。

---

## 2026-07-29 — 规则说明展示策略数值；导航加大；不可开才通知

### 变更

1. 能开不通知；不能开才企业微信提醒一次（恢复后再次不足才再推）。  
2. 导航字号加大；规则说明正文字号缩小。  
3. 规则说明按当前策略设置展示开仓/平仓/节奏参数。

---

## 2026-07-29 — 可开判定只看交易账户；不足只通知一次；去重标题

### 变更

1. 权益/杠杆可开判定仅看**交易账户** USDT/USDC（不再回退资金账户）。  
2. 资金不足企业微信：**不足期间只推一次**，恢复后再次不足才再推；计划页轮询不再触发推送。  
3. 去掉计划页「自动对冲计划」标题（与导航重复）。

---

## 2026-07-29 — 资金条：USDT/USDC 两行 + 居中对齐

### 变更

1. 资金账户 / 交易账户改为 USDT、USDC 上下两行显示。  
2. 资金条各列文字居中；字号对齐 crypto_monitor 统计条（标签约 0.72rem，数值约 0.95rem）。

---

## 2026-07-29 — 资金口径对齐 OKX：仅资金↔交易

### 变更

1. 去掉「期权资金 / 期权交易」账户；顶栏只显示资金账户、交易账户（各含 USDT+USDC）。  
2. 划转仅支持资金账户 ↔ 交易账户；兑换在资金账户内 USDT↔USDC。  
3. 资金页说明收入折叠「规则说明」；划转控件单行排列；设置卡片与资金条同宽。

---

## 2026-07-29 — 权益杠杆可开判定 + 资金不足微信推送

### 变更

1. 计划页「权益 / 杠杆」改为 **永续Nx 可开 / 期权可开**（绿）或 **不可开**（红）；按保证金与权利金估算对比可用资金。  
2. 资金不足时企业微信推送（10 分钟去重）；策略开仓前拦截并进入 `wait_funds`。  
3. 「规则说明」移到启动策略按钮上方；顶栏资金数字加大显示。

---

## 2026-07-29 — 顶栏对齐 crypto_monitor：标题在上、资金卡同宽

### 变更

1. 「比特骆驼自动化对冲系统」移到导航上方（参照 OKX 实例页：标题 → top-nav → 资金卡）。  
2. 页面统一 `max-width: min(1440px, 94vw)`，资金卡片与下方内容同宽对齐。  
3. 资金条改为圆角边框卡片样式（`.funds-bar-inner`）。

---

## 2026-07-29 — 资金条与内容区同宽；规则说明折叠

### 变更

1. 资金横条内容区与下方页面同宽（带鱼屏不再拉满全屏）。  
2. 原计划页说明文案收入资金条下方「规则说明」折叠。

---

## 2026-07-29 — 资金条 + USDT/USDC 兑换划转（SIM/LIVE）

### 变更

1. 顶栏增加资金统计条（交易所/交易日/胜率/总资金/资金·交易·期权账户/实时盈亏），**不标注模拟盘**。  
2. SIM：多账户钱包（USDT 资金/交易 + USDC 期权资金/交易）；设置页可兑换、划转。  
3. LIVE（OKX）：拉交易所余额；现货市价兑换 USDC-USDT；资金↔交易划转（对齐 crypto_monitor）。  
4. USDC 计入总资金按 1:1。

---

## 2026-07-29 — 统计拆分手续费；LIVE 不展示/不计滑点

### 变更

1. 统计页：`永续手续费` / `期权手续费` / `手续费合计`；SIM 另列 `滑点合计`。  
2. 交易明细同步拆分手续费；SIM 显示滑点，LIVE 不显示。  
3. LIVE 成交滑点字段强制为 0，不把模拟滑点计入实盘盈亏。

---

## 2026-07-29 — 到期结算展示：指数 / 行权价 / 内在价值

### 变更

1. 到期平仓期权价本就是 **内在价值**（`max(指数−K,0)` / Put 对称），不是盘口；详情页补 **结算指数、行权价、内在价值**。  
2. 成交行标注「期权到期结算」；组表落库 `settle_index_px`。  
3. 说明：永续到期时仍按市价平（与策略文档一致）。

---

## 2026-07-29 — 持仓卡显示开仓时间 / 持仓时长

### 变更

1. 监控页永续、期权持仓卡增加 **开仓时间**（上海时区）与 **持仓时长**（每秒刷新）。  
2. 接口 `position.open_at_ms` 取自当前组成交组开仓时刻。

---

## 2026-07-27 — 残留期权一行一条

### 变更

1. 监控页「残留期权(待到期)」由用 `·` 拼成一行，改为**每条期权单独一行**（手机端卡片式）。

---

## 2026-07-27 — 交易记录详情改为弹窗

### 变更

1. 点击成交组弹出对话框查看开平仓时间、持仓周期、成交明细与盈亏。  
2. 支持点遮罩 / 关闭按钮 / Esc 关闭；手机端底部抽屉式布局。

---

## 2026-07-27 — 修复交易记录 500（记录未丢）

### 变更

1. `/api/trades/groups` 因 `sqlite3.Row` 无 `.get` 抛错导致「Internal Server Error / 暂无成交组」假象。  
2. 持仓周期计算改为兼容 Row；库内成交组仍在。

---

## 2026-07-27 — 交易记录：开仓/平仓时间与持仓周期

### 变更

1. 交易记录列表与明细展示：**开仓时间、平仓时间、持仓周期**（上海时区）。  
2. **持仓周期按目标平仓计时**：净盈利达标（含默认 15U）出场为准。  
3. **只平永续 / 期权残留**：平仓时间与周期以**永续平仓**时刻为准，不含期权拖到到期。  
4. 只平永续时写入 `close_at_ms`；残留期权到期结算不再覆盖该策略平仓时间。

---

## 2026-07-27 — 安卓竖屏：全屏后系统锁定

### 变更

1. 说明：安卓 **Chrome 普通标签页** 不允许网页直接锁方向，必须先全屏再 `orientation.lock`（你以前能锁的，多半是 App/WebView/已装桌面，或点过全屏）。  
2. 安卓首次点击 / 「点击锁定竖屏」：进入全屏并系统锁竖屏。  
3. 已「添加到主屏幕」的应用走 manifest `orientation: portrait`，一般无需全屏。  
4. 补充 X5/UC 竖屏 meta；锁失败时仍强制竖屏布局。

---

## 2026-07-27 — 手机端真·竖屏（禁横屏布局）

### 变更

1. 去掉「请竖屏使用」遮罩：那只是提示，不是锁定。  
2. **能锁系统方向时**（常见：安卓安装到主屏幕的 PWA）调用 `orientation.lock`。  
3. **锁不住时**（多数浏览器页 / iOS）：设备横放也不进入横屏 UI，界面仍按竖屏坐标系渲染。  
4. Manifest：`orientation` 改为 `portrait-primary`。

---

## 2026-07-27 — 手机端竖屏锁定

### 变更

1. **PWA**：`manifest.webmanifest` 的 `orientation` 改为 `portrait`（安装到主屏幕后系统侧竖屏）。  
2. **浏览器**：手机横屏时全屏提示「请竖屏使用」；支持时尝试 `screen.orientation.lock`。

---

## 2026-07-27 — 手机端期权卡 / 交易记录排版

### 变更

1. **期权持仓卡**：合约名与到期倒计时改为上下排，避免长 `inst_id` 被挤成竖排字。  
2. **交易记录**：列表项上下堆叠（组号/状态一行，净盈亏/平仓原因一行），明细成交行窄屏同样竖排。

---

## 2026-07-27 — 手机端监控布局

### 变更

1. **底部导航**：窄屏隐藏顶栏菜单，改用底栏「监控 / 记录 / 统计 / 设置」（含安全区）。  
2. **监控首页卡**：一屏看状态（启动/暂停/已停）、盘口、阶段、净盈利 vs 目标、到期倒计时、最近错误。  
3. **操作区**：启动 / 暂停 / 紧急全平触摸友好；紧急全平通栏；桌面布局不变。

---

## 2026-07-26 — 企业微信通知 + 暂停盯目标

### 变更

1. **企业微信**：独立模块 `backend/app/notify/wecom.py`；系统设置「运行模式」可配 Webhook / 开关 / 测试推送。  
2. **推送事件**：开仓、平仓、策略启动、暂停、故障（同类 5 分钟去重）。Markdown + 标识 `OPEN/CLOSE/START/PAUSE/FAULT`。  
3. **标题盘口**：模拟盘 →「模拟盘」；实盘 →「实盘·OKX」或「实盘·币安」。  
4. **暂停策略**：仍执行目标平仓 + 到期平仓，**不新开仓**（策略说明已同步）。

---

## 2026-07-26 — 一键部署环境检测 / 卸载删目录

### 变更

1. **一键部署 / 更新**：检测 Python3+venv、Node/npm、PM2；**已有则跳过**，缺失才 apt/npm 安装。  
2. **一键卸载**：备份 `.env` 与数据库后，**直接删除** `/opt/eth_hedge_sim`（并清理历史 `.removed` / `.old` 残留）；不卸载系统级 Python/Node/PM2。

---

## 2026-07-26 — 自动备份 / 下载 / 上传恢复

### 变更

1. **自动备份**：默认开启，间隔 24h，保留 14 份；落盘目录优先 `/root/eth_hedge_backups`（可用 `BACKUP_DIR` 覆盖）。内容含 `hedge.db` + `.env`。  
2. **系统设置 → 备份恢复**：立即备份、服务器列表下载、上传 zip 恢复（确认串 `RESTORE`）。  
3. **新服务器迁移**：新机部署后上传旧机备份即可覆盖库与环境变量；恢复后进程退出由 PM2 拉起。有持仓时禁止恢复。

### 测试

- `pytest`：含 `test_backup` 等全量

---

## 2026-07-26 — LIVE 达标含估平仓费；手动/紧急全平进休息

### 变更

1. **LIVE 达标口径**：盯盘净利继续扣预估平仓手续费（与策略说明 / SIM 一致）；实盘索引改为「含估平仓费」。  
2. **组间休息**：手动全平成功后调用 `enter_rest_after_close()`；紧急全平成功路径同样进入休息（与自动全平共用）。

### 测试

- `pytest` 全量

---

## 2026-07-26 — LIVE 对账 / 手动开仓 UI / Token 自动换发

### 变更

1. **开仓幂等与对账**：`opening` 占槽；LIVE 开仓前核对交易所永续（双侧）；启动写 mismatch 日志。  
2. **平仓张数**：OKX/币安平永续优先读交易所持仓，失败才回退本地账本。  
3. **杠杆**：LIVE 开永续前 `set_leverage`（失败仅告警）。  
4. **自动运行禁手动开仓**：`running=1` 时 `/api/sim/open-group` 返回 409；计划页按钮禁用。  
5. **手动开仓显示**：策略设置「节奏」→「显示手动开仓」，**默认不显示**；关闭时 API 亦拒绝手动开/手动全平。紧急全平始终可用且为**红色**。  
6. **启动态**：策略运行中主按钮文案为「启动中」，绿色样式。  
7. **Token 自动换发**：HMAC Bearer（非 Flask）。新增 `POST /api/auth/refresh`；前端登录后定时/切回前台/临近过期静默换发。默认口令未改。

### 审计（本包改后）

| 项 | 状态 |
|----|------|
| 交易所↔本地对账 / 开仓幂等 | **已修** |
| 平仓张数读交易所 | **已修** |
| set_leverage | **已修**（失败告警） |
| 自动运行仍可手动开仓 | **已修**（API + UI） |
| 手动开/全平默认露出 | **已修**（默认隐藏 + 设置开关） |
| 紧急全平样式 / 启动中文案 | **已修** |
| Token 长期不轮换 | **已修**（refresh + 前端自动换发） |
| 对账只查单侧漏 short | **已修**（flat 时 long+short） |
| 放弃期权残留 / 模式切换仅本地 | **未做**（非本包；紧急全平/人工核对） |

### 测试

- `pytest`：52 passed

---

## 2026-07-26 — 审计修复包（安全 / 下单 / 平仓）

### 变更

1. **LIVE 永续合约号**：开平仓统一用 `load_runtime_settings()` / 组内 `perp_inst_id`，修复 UI 切币安后仍用 env `ETH-USDT-SWAP` 的问题。  
2. **到期平仓**：期权先走交易所真实平仓（失败且仓位已空才本地结算），并在永续失败前写入 `option_closed_perp_pending`。  
3. **成交完整性**：OKX/币安仅接受完全成交；账本数量按交易所 `accFillSz`/`executedQty` 回写。  
4. **`ctVal`**：查不到合约面值时直接失败，禁止静默默认 `0.01`。  
5. **放弃期权路径**：优先交易所卖期权；仅深虚且卖不出时才残留归档。  
6. **LIVE 重启**：启动时若为 LIVE，自动暂停策略，须人工再点启动。  
7. **安全**：登录限流；切 LIVE 须服务端校验确认串 `LIVE`；生产关闭 `/docs`；改密后抬升 token 版本作废旧票；`.env` 写入后尽量 `chmod 600`；CORS 改为同源优先。  
8. **出场**：LIVE 净利加入保守平仓手续费缓冲，减少「刚达标但扣费后不够」的提前出场。

### 审计（本包改后复审）

| 项 | 状态 |
|----|------|
| 永续符号 env/DB 不一致 | **已修**（`symbols.resolve_perp_inst_id` + 开平仓全路径） |
| 到期只本地结算期权 | **已修**（先交易所卖；失败才本地结算） |
| 到期永续失败无 pending | **已修**（统一 `_mark_option_closed_perp_pending`） |
| partially_filled 当完成 | **已修**（OKX 仅 `filled`；币安仅 `FILLED`） |
| 放弃路径不卖期权 | **已缓解**（先 `close_group` 双腿；失败且深虚才残留） |
| 开仓崩溃双开 | **部分**：LIVE 启动强制 `running=0`；仍缺交易所对账 |
| ctVal 静默默认 | **已修**（查不到直接报错） |
| LIVE 出场不计平仓费 | **已修**（保守 `est_close_fees`） |
| 登录无限流 / LIVE 可 API 绕过确认 | **已修**（限流 + `confirm_live_phrase=LIVE`） |
| `/docs` 公开 / CORS `*` / mask 泄露后缀 | **已修** |
| 改密后旧 token | **已修**（`AUTH_TOKEN_VERSION`） |
| 默认口令 / 公网 TLS | **未改默认口令**（部署须改 `.env`）；TLS 仍靠反代 |
| 杠杆 set_leverage | **未做** |
| 平仓张数读交易所持仓 | **未做** |

### 残留风险（下次优先）

1. 启动时交易所↔本地仓位对账与开仓幂等键  
2. 平仓前查询交易所实际持仓张数  
3. 开仓前 `set_leverage`  
4. 可选：拒绝默认 `AUTH_*` 启动（硬开关）

### 测试

- `pytest`：46 passed（含 `test_symbols`、脱敏用例更新）

---
