fix复盘交易记录改回真盈亏A,期权历史仅记期权腿不含现货。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-13 09:55:34 +08:00
parent 78f18e731a
commit 09989d2709
5 changed files with 41 additions and 32 deletions
+2 -2
View File
@@ -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 启动装配
+18 -14
View File
@@ -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,不含现货 |
+17 -12
View File
@@ -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":
+1 -1
View File
@@ -345,7 +345,7 @@
<th>张数</th>
<th>权利金</th>
<th>状态</th>
<th>盈亏</th>
<th title="仅期权腿币收益,不含现货买/卖回">盈亏</th>
<th>时间</th>
<th>操作</th>
</tr>
@@ -229,7 +229,7 @@
<span class="or-step" aria-hidden="true">1</span>
<div>
<div class="or-section-title" id="or-list-title">期权交易记录</div>
<p class="or-section-desc">点「复盘」填写表单;已复盘仍保留在此,也可在下方查看详情。</p>
<p class="or-section-desc">盈亏为卖光币后的账户真盈亏;点「复盘」填写表单。期权历史仅记期权腿币收益,不含现货。</p>
</div>
</div>
<div class="options-strike-table-wrap or-trades-table-wrap" id="or-trades-wrap">
@@ -239,9 +239,9 @@
<th>类型</th>
<th>标的/合约</th>
<th>初始权利金</th>
<th>盈亏</th>
<th title="卖回完成后交易账户 USDT 差分">真盈亏</th>
<th>盈利率</th>
<th>手续费</th>
<th title="仅期权开/平手续费">手续费</th>
<th>开仓时间</th>
<th>平仓时间</th>
<th>持有</th>