From 09989d2709b85635c8010ea10768acee675ff44a Mon Sep 17 00:00:00 2001 From: dekun Date: Tue, 13 Oct 2026 09:55:34 +0800 Subject: [PATCH] =?UTF-8?q?fix=E5=A4=8D=E7=9B=98=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=94=B9=E5=9B=9E=E7=9C=9F=E7=9B=88=E4=BA=8F?= =?UTF-8?q?A=EF=BC=8C=E6=9C=9F=E6=9D=83=E5=8E=86=E5=8F=B2=E4=BB=85?= =?UTF-8?q?=E8=AE=B0=E6=9C=9F=E6=9D=83=E8=85=BF=E4=B8=8D=E5=90=AB=E7=8E=B0?= =?UTF-8?q?=E8=B4=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- docs/系统分析-期权主链条.md | 4 +-- docs/规格-期权交易账户盈亏结算.md | 32 +++++++++++-------- lib/options/options_review_lib.py | 29 ++++++++++------- lib/options/templates/options_panel.html | 2 +- .../templates/options_review_panel.html | 6 ++-- 5 files changed, 41 insertions(+), 32 deletions(-) diff --git a/docs/系统分析-期权主链条.md b/docs/系统分析-期权主链条.md index 0f6b1a4..1e1e8f0 100644 --- a/docs/系统分析-期权主链条.md +++ b/docs/系统分析-期权主链条.md @@ -32,8 +32,8 @@ USDT(交易户) ▼ 卖光可卖标的币(禁止按开仓权利金封顶)→ 快照 trading_usdt_after ▼ -口径 A(复盘): realized_pnl_usdt = after − before,pnl_settled=1 -口径 B(数据统计): 历史币盈亏 × 平仓卖回价(与 A 独立) +口径 A(复盘交易记录真盈亏): after − before,pnl_settled=1 +口径 B(期权历史/数据统计): 仅期权腿币盈亏(×卖回价折 U);不含现货 ``` ### 0.3 启动装配 diff --git a/docs/规格-期权交易账户盈亏结算.md b/docs/规格-期权交易账户盈亏结算.md index 1a59a46..7ff1d65 100644 --- a/docs/规格-期权交易账户盈亏结算.md +++ b/docs/规格-期权交易账户盈亏结算.md @@ -31,36 +31,39 @@ ## 2. 双口径定义 -### 2.1 口径 A — 交易账户对账(内部冻结) +### 2.1 口径 A — 真盈亏(交易账户 / 复盘交易记录) ``` -本单已实现盈亏(U) = trading_usdt_after − trading_usdt_before +本单真盈亏(U) = trading_usdt_after − trading_usdt_before ``` -- **用途**:交易账户对账、卖回后冻结(`pnl_settled`) -- **刻意含多买缓冲 / 滑点 / 现货侧成本** -- **门禁**:全部期权仓位已平 **且** 标的币无可卖量(粉尘可忽略)后才拍 `after` 并冻结 -- **不**作为复盘「期权交易记录」列表盈亏展示 +等价理解:平仓后卖光标的币收回的 USDT,相对开仓前(买币前)交易账户的变化。 -### 2.2 口径 B — 数据统计 / 复盘交易记录(历史 × 卖回价) +- **消费者**:期权复盘「期权交易记录」盈亏列、复盘 KPI、账户冻结(`pnl_settled`) +- **含**:多买缓冲、现货滑点、期权/现货摩擦(整笔钱进出) +- **门禁**:全部期权仓位已平 **且** 标的币无可卖量后才拍 `after` 并冻结 +- 未结算:列表显示「待结算」,不写币×价假 U + +### 2.2 口径 B — 期权历史 / 数据统计(仅期权腿) ``` -展示已实现盈亏(U) = 期权历史.realized_pnl(币) × 平仓卖回价 +期权腿盈亏(币) = 收回权利金 − 已付权利金 − 期权开/平手续费 +统计用 U ≈ 期权腿盈亏(币) × 平仓卖回价 ``` -- **平仓卖回价**:优先卖回成交均价 / 冻结的 `close_index_px`;缺失时再用当时指数一次性冻结 -- **消费者**:期权面板「数据统计」、顶栏窗口统计、**期权复盘「期权交易记录」盈亏列**(与数据统计同数) -- **不含**账户多买缓冲差分 +- **消费者**:期权面板「期权历史」(币)、数据统计 / 顶栏窗口统计(折 U) +- **不含**现货买币/卖回;**不**用现货贵贱改写权利金腿 +- 与复盘真盈亏 A **独立**,禁止混用 ### 2.3 初始权利金、盈利率、期权手续费 | 字段 | 定义 | |------|------| | 初始权利金(U) | `open_index_px × premium_paid`(不含 `budget_usdt` 多买) | -| 盈利率 | `口径B盈亏 / initial_premium_usdt` | -| 期权手续费(U) | 仅期权开/平手续费:`open_fee×开仓指数 + close_fee×卖回价`(**不含**现货买币/卖回手续费) | +| 盈利率(复盘) | `真盈亏A / initial_premium_usdt` | +| 期权手续费(U) | 仅期权开/平:`open_fee×开仓指数 + close_fee×卖回价`(不含现货) | -复盘「期权交易记录」须展示:初始权利金(U)、盈亏(B)、盈利率、期权手续费(U)。 +复盘「期权交易记录」须展示:初始权利金(U)、真盈亏(A)、盈利率、期权手续费(U)。 --- @@ -263,3 +266,4 @@ IDLE | 2026-10-09 | 初版:交易账户快照差分 + 一次一仓 + 持仓禁划转 + 卖回后冻结 | | 2026-10-13 | 修订:双口径 A/B;卖光再结算;初始权利金/盈利率;状态机;历史修复脚本 | | 2026-10-13 | 复盘「期权交易记录」盈亏与数据统计同口径 B;增加仅期权手续费展示 | +| 2026-10-13 | 交易记录改回真盈亏 A;期权历史/统计仅期权腿 B,不含现货 | diff --git a/lib/options/options_review_lib.py b/lib/options/options_review_lib.py index fd4c742..b8b236d 100644 --- a/lib/options/options_review_lib.py +++ b/lib/options/options_review_lib.py @@ -555,9 +555,16 @@ def sync_options_from_local_trades( ccy = str(r["premium_ccy"] or "").strip().upper() if not ccy: ccy = premium_ccy_for_mode(margin_mode_from_inst_id(inst), underly) + frozen_usdt = _safe_float(r["realized_pnl_usdt"]) + try: + settled = int(r["pnl_settled"] or 0) == 1 + except Exception: + settled = False + # 有账户快照未结算:交易记录显示待结算(真盈亏=卖回后 after−before) + acct_pending = _safe_float(r["trading_usdt_before"]) is not None and not settled close_idx = _safe_float(r["close_index_px"]) open_idx = _safe_float(r["open_index_px"]) - # 折算指数:平仓卖回价 > 开仓 > 实时(仅无冻结时兜底) + # 折算指数:仅用于初始权利金/期权手续费展示,不用于真盈亏 idx = None if close_idx is not None and close_idx > 0: idx = close_idx @@ -565,23 +572,21 @@ def sync_options_from_local_trades( idx = open_idx else: idx = idx_cache.get(underly) - pnl = _safe_float(r["realized_pnl"]) - if pnl is None: - paid0 = _safe_float(r["premium_paid"]) - recv0 = _safe_float(r["premium_received"]) - if paid0 is not None and recv0 is not None: - pnl = recv0 - paid0 prem = _safe_float(r["premium_paid"]) - # 期权交易记录盈亏与数据统计同口径 B:币盈亏 × 平仓卖回价(不用账户差分 A) - pnl_u = _to_usdt(pnl, ccy=ccy, idx=idx) + # 交易记录真盈亏=口径 A(卖光币后账户差分);未结算不写假 U + if acct_pending: + pnl_u = None + elif frozen_usdt is not None and (settled or _safe_float(r["trading_usdt_before"]) is None): + pnl_u = round(float(frozen_usdt), 4) + else: + # 旧单无账户快照:不回退币×价冒充真盈亏 + pnl_u = None # 初始权利金(U)=开仓指数×权利金币量;不含多买 stored_initial = _safe_float(r["initial_premium_usdt"]) open_idx_for_prem = open_idx if (open_idx is not None and open_idx > 0) else idx prem_u = stored_initial if prem_u is None: prem_u = _to_usdt(prem, ccy=ccy, idx=open_idx_for_prem) - if ccy in ("ETH", "BTC") and pnl_u is None: - pnl_u = None if ccy in ("ETH", "BTC") and prem_u is None: prem_u = prem # 仅期权开/平手续费折 U(不含现货) @@ -635,7 +640,7 @@ def sync_options_from_local_trades( "option_fee_usdt": fee_u, "created_at": opened_at, "closed_at": closed_at, - "status_label": "已平", + "status_label": "待结算" if acct_pending else "已平", }, ) if action == "inserted": diff --git a/lib/options/templates/options_panel.html b/lib/options/templates/options_panel.html index e3f43bf..47ea9c3 100644 --- a/lib/options/templates/options_panel.html +++ b/lib/options/templates/options_panel.html @@ -345,7 +345,7 @@ 张数 权利金 状态 - 盈亏 + 盈亏 时间 操作 diff --git a/lib/options/templates/options_review_panel.html b/lib/options/templates/options_review_panel.html index 7d56e14..f59a6e2 100644 --- a/lib/options/templates/options_review_panel.html +++ b/lib/options/templates/options_review_panel.html @@ -229,7 +229,7 @@
期权交易记录
-

点「复盘」填写表单;已复盘仍保留在此,也可在下方查看详情。

+

盈亏为卖光币后的账户真盈亏;点「复盘」填写表单。期权历史仅记期权腿币收益,不含现货。

@@ -239,9 +239,9 @@ 类型 标的/合约 初始权利金 - 盈亏 + 真盈亏 盈利率 - 手续费 + 手续费 开仓时间 平仓时间 持有