# 规格:期权盈亏按交易账户结算(一次一仓) > 状态:已定稿,按本文实现 > 适用范围:币本位期权(模拟盘优先落地;实盘同规则) > 目标:复盘盈亏、数据统计盈亏与交易账户真实 USDT 变动一致,可对账、可冻结、可商用 --- ## 1. 目标与原则 ### 1.1 要解决什么 此前单笔盈亏混用多套口径(权利金×指数、卖回−买币预算、实时指数重算),导致: - 持仓「合计盈亏」与复盘单笔不一致 - 数字随行情跳动 - 后期账本无法审计 ### 1.2 原则 | 原则 | 说明 | |------|------| | 真源 | **交易账户 USDT 快照差分** 为本单已实现盈亏真源 | | 一次一仓 | 同一账户同一时间只允许一笔期权持仓 | | 卖回后结算 | 未卖回标的币前,本单不进入已实现 | | 冻结 | 结算完成后永不修改 | | 禁划转 | 持仓期间禁止资金划转(前端灰 + 后端拒) | | 双账清晰 | 顶栏余额 = 钱包;合计/复盘盈亏 = 冻结历史 +(持仓时)浮盈 | --- ## 2. 产品规则(用户可见) ### 2.1 开仓前 1. **有可卖标的币(ETH/BTC)→ 拒开仓** - 提示:先卖回 USDT(可走自动扫尾/卖回)。 - 粉尘:低于现货最小可卖量可忽略;达到可卖量一律视为有币并拒开。 2. **交易账户 USDT 快照** `trading_usdt_before` - 取开仓前(买币前)交易账户 USDT。 - 开仓前若有过多次划转:以**开仓前最后一次划转完成后**的余额为准(即开仓那一刻的余额)。 3. 通过检查后才允许买币并开期权。 ### 2.2 持仓中 1. **划转按钮灰色不可点**;API 同步拒绝。 2. **合计盈亏(动态)** = `Σ已冻结历史盈亏` + `当前持仓浮盈` 3. 本单未卖回结算前:不计入「已冻结历史」;浮盈跟盘更新。 ### 2.3 平仓与卖回 1. 期权平仓后触发**自动卖回**残留标的币。 2. **卖回未完成**:本单状态为「待结算」,已实现盈亏不写死。 3. **卖回成功后**:再拍交易账户 USDT 快照 `trading_usdt_after`。 ### 2.4 结算与冻结 ``` 本单已实现盈亏(U) = trading_usdt_after − trading_usdt_before ``` 1. 写入本单并标记已冻结。 2. **此后不得因划转、指数变动、复盘同步而修改。** 3. 期权复盘、数据统计的已实现盈亏均读此冻结值。 ### 2.5 划转与资金 | 时机 | 行为 | |------|------| | 无持仓、无待卖回 | 允许划转;顶栏资金立即刷新 | | 持仓中或待卖回 | 禁止划转 | | 划转后 | 只影响下一笔开仓前的 `usdt_before`;**不重算**已冻结历史单 | --- ## 3. 生命周期 ```text [空仓, 无残留币] │ ├─ 有可卖币? ──是──> 拒开仓「请先卖回」 │ ├─ 快照 trading_usdt_before ├─ 买币 → 开期权 │ [持仓中] 划转禁用;合计 = 冻结历史 + 浮盈 │ ├─ 平仓 │ [待卖回] 已实现未结算;划转仍禁用 │ ├─ 自动/重试卖回成功 ├─ 快照 trading_usdt_after ├─ realized = after − before → 冻结 │ [已结算] 复盘/统计只读冻结值 ``` --- ## 4. 数据字段(实现约定) 在 `options_trades` 增加(或等价持久化): | 字段 | 含义 | |------|------| | `trading_usdt_before` | 开仓前交易账户 USDT | | `trading_usdt_after` | 卖回完成后交易账户 USDT | | `realized_pnl_usdt` | 冻结已实现 = after − before(结算后写入) | | `pnl_settled` | 0/1,是否已按账户差分结算冻结 | 说明: - `budget_usdt` 仍表示本笔买币花费,**不得**当作开仓前账户快照。 - 币数量 `realized_pnl` 可保留供期权历史展示(币),与 U 冻结分离。 - 统计/复盘的 **U 盈亏** 只认 `pnl_settled=1` 时的 `realized_pnl_usdt`。 --- ## 5. 模块行为 ### 5.1 开仓 `open_coin_option_buy_full` 1. 检查一次一仓 / 未完成桥。 2. `fetch_trading_coin_available`:可卖则拒开。 3. 读取交易账户 USDT → `trading_usdt_before`。 4. 买币、下单、写库(带 before,`pnl_settled=0`)。 ### 5.2 划转 `POST /api/options/transfer` 1. 若存在 `options_trades.status='open'` 或桥状态 ∈ {bought, holding, pending_sell} → **403/业务错误**。 2. 前端:持仓或待卖回时划转按钮 `disabled` + 提示「持仓中不可划转」。 ### 5.3 卖回结算 在 `sell_residual_after_option_flat`(及 retry-sell)桥关闭成功后: 1. 读取交易账户 USDT → `trading_usdt_after`。 2. 对本桥关联且未结算的已平仓位: `realized_pnl_usdt = after - before`,`pnl_settled=1`。 3. **停止**用「权利金×指数」或「卖回−预算」覆盖已结算单。 粉尘关闭桥(无法卖出): - 仍拍 `usdt_after` 并结算(差额含粉尘损失);或 - 记 `pnl_settled` 并附 message「粉尘忽略」——实现取:拍售后余额并冻结,保证可对账。 ### 5.4 数据统计 - `net_realized_pnl` / 已平相关:仅 `pnl_settled=1` 的冻结值之和。 - `total_pnl`(持仓页合计)= `net_realized_pnl` + `open_float_pnl`。 - 待结算已平单:不计入已实现,也不重复计入浮盈(浮盈仅当前期权持仓)。 - **顶栏三项**(总交易 / 胜率 / 盈亏比):与上同一过滤口径(`header_options_stats_for_window`)。 ### 5.5 期权复盘 - 同步本地已平:优先读 `realized_pnl_usdt`(且已结算)。 - 未结算:复盘显示「待结算」或暂不导入已实现 U。 - 禁止再用实时指数改写已冻结 U。 ### 5.6 期权历史列表 - **仍按币**展示权利金/币盈亏(不强制改成 U)。 - U 口径只用于复盘与数据统计。 --- ## 6. 对账关系(商用) ``` Σ 已冻结单笔盈亏 + 当前浮盈 ≈ 合计盈亏展示 Σ 已冻结单笔盈亏 + 期间净划转 ≈ 交易账户相对「首笔 before」的累计变化 ``` 差异来源应可归因:粉尘、手续费计入方式、卖回滑点(已含在 after−before 内)。 禁止用展示公式回写钱包余额。 --- ## 7. 非目标 / 不做 - 不用买币预算 `budget_usdt` 当单笔盈利。 - 不用「净币 × 单一指数」覆盖已结算账户差分。 - 持仓中不因行情重算已冻结历史。 - 不把期权历史列表强制改为 U 展示。 --- ## 8. 验收清单 - [ ] 开仓前有可卖 BTC/ETH → 拒开并提示卖回 - [ ] 开仓写入 `trading_usdt_before` - [ ] 持仓中划转按钮灰 + API 拒绝 - [ ] 平仓未卖回前,统计已实现不含本单 - [ ] 卖回后 `realized = after − before` 并 `pnl_settled=1` - [ ] 再次同步复盘/统计,冻结值不变 - [ ] 合计盈亏 = 冻结历史 + 浮盈(有持仓时动态) - [ ] 空仓划转后顶栏资金更新,历史冻结单不变 --- ## 9. 修订记录 | 日期 | 说明 | |------|------| | 2026-10-09 | 初版定稿:交易账户快照差分 + 一次一仓 + 持仓禁划转 + 卖回后冻结 |