fix复盘交易记录改回真盈亏A,期权历史仅记期权腿不含现货。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+2
-2
@@ -32,8 +32,8 @@ USDT(交易户)
|
|||||||
▼
|
▼
|
||||||
卖光可卖标的币(禁止按开仓权利金封顶)→ 快照 trading_usdt_after
|
卖光可卖标的币(禁止按开仓权利金封顶)→ 快照 trading_usdt_after
|
||||||
▼
|
▼
|
||||||
口径 A(复盘): realized_pnl_usdt = after − before,pnl_settled=1
|
口径 A(复盘交易记录真盈亏): after − before,pnl_settled=1
|
||||||
口径 B(数据统计): 历史币盈亏 × 平仓卖回价(与 A 独立)
|
口径 B(期权历史/数据统计): 仅期权腿币盈亏(×卖回价折 U);不含现货
|
||||||
```
|
```
|
||||||
|
|
||||||
### 0.3 启动装配
|
### 0.3 启动装配
|
||||||
|
|||||||
+18
-14
@@ -31,36 +31,39 @@
|
|||||||
|
|
||||||
## 2. 双口径定义
|
## 2. 双口径定义
|
||||||
|
|
||||||
### 2.1 口径 A — 交易账户对账(内部冻结)
|
### 2.1 口径 A — 真盈亏(交易账户 / 复盘交易记录)
|
||||||
|
|
||||||
```
|
```
|
||||||
本单已实现盈亏(U) = trading_usdt_after − trading_usdt_before
|
本单真盈亏(U) = trading_usdt_after − trading_usdt_before
|
||||||
```
|
```
|
||||||
|
|
||||||
- **用途**:交易账户对账、卖回后冻结(`pnl_settled`)
|
等价理解:平仓后卖光标的币收回的 USDT,相对开仓前(买币前)交易账户的变化。
|
||||||
- **刻意含多买缓冲 / 滑点 / 现货侧成本**
|
|
||||||
- **门禁**:全部期权仓位已平 **且** 标的币无可卖量(粉尘可忽略)后才拍 `after` 并冻结
|
|
||||||
- **不**作为复盘「期权交易记录」列表盈亏展示
|
|
||||||
|
|
||||||
### 2.2 口径 B — 数据统计 / 复盘交易记录(历史 × 卖回价)
|
- **消费者**:期权复盘「期权交易记录」盈亏列、复盘 KPI、账户冻结(`pnl_settled`)
|
||||||
|
- **含**:多买缓冲、现货滑点、期权/现货摩擦(整笔钱进出)
|
||||||
|
- **门禁**:全部期权仓位已平 **且** 标的币无可卖量后才拍 `after` 并冻结
|
||||||
|
- 未结算:列表显示「待结算」,不写币×价假 U
|
||||||
|
|
||||||
|
### 2.2 口径 B — 期权历史 / 数据统计(仅期权腿)
|
||||||
|
|
||||||
```
|
```
|
||||||
展示已实现盈亏(U) = 期权历史.realized_pnl(币) × 平仓卖回价
|
期权腿盈亏(币) = 收回权利金 − 已付权利金 − 期权开/平手续费
|
||||||
|
统计用 U ≈ 期权腿盈亏(币) × 平仓卖回价
|
||||||
```
|
```
|
||||||
|
|
||||||
- **平仓卖回价**:优先卖回成交均价 / 冻结的 `close_index_px`;缺失时再用当时指数一次性冻结
|
- **消费者**:期权面板「期权历史」(币)、数据统计 / 顶栏窗口统计(折 U)
|
||||||
- **消费者**:期权面板「数据统计」、顶栏窗口统计、**期权复盘「期权交易记录」盈亏列**(与数据统计同数)
|
- **不含**现货买币/卖回;**不**用现货贵贱改写权利金腿
|
||||||
- **不含**账户多买缓冲差分
|
- 与复盘真盈亏 A **独立**,禁止混用
|
||||||
|
|
||||||
### 2.3 初始权利金、盈利率、期权手续费
|
### 2.3 初始权利金、盈利率、期权手续费
|
||||||
|
|
||||||
| 字段 | 定义 |
|
| 字段 | 定义 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| 初始权利金(U) | `open_index_px × premium_paid`(不含 `budget_usdt` 多买) |
|
| 初始权利金(U) | `open_index_px × premium_paid`(不含 `budget_usdt` 多买) |
|
||||||
| 盈利率 | `口径B盈亏 / initial_premium_usdt` |
|
| 盈利率(复盘) | `真盈亏A / initial_premium_usdt` |
|
||||||
| 期权手续费(U) | 仅期权开/平手续费:`open_fee×开仓指数 + close_fee×卖回价`(**不含**现货买币/卖回手续费) |
|
| 期权手续费(U) | 仅期权开/平:`open_fee×开仓指数 + close_fee×卖回价`(不含现货) |
|
||||||
|
|
||||||
复盘「期权交易记录」须展示:初始权利金(U)、盈亏(B)、盈利率、期权手续费(U)。
|
复盘「期权交易记录」须展示:初始权利金(U)、真盈亏(A)、盈利率、期权手续费(U)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -263,3 +266,4 @@ IDLE
|
|||||||
| 2026-10-09 | 初版:交易账户快照差分 + 一次一仓 + 持仓禁划转 + 卖回后冻结 |
|
| 2026-10-09 | 初版:交易账户快照差分 + 一次一仓 + 持仓禁划转 + 卖回后冻结 |
|
||||||
| 2026-10-13 | 修订:双口径 A/B;卖光再结算;初始权利金/盈利率;状态机;历史修复脚本 |
|
| 2026-10-13 | 修订:双口径 A/B;卖光再结算;初始权利金/盈利率;状态机;历史修复脚本 |
|
||||||
| 2026-10-13 | 复盘「期权交易记录」盈亏与数据统计同口径 B;增加仅期权手续费展示 |
|
| 2026-10-13 | 复盘「期权交易记录」盈亏与数据统计同口径 B;增加仅期权手续费展示 |
|
||||||
|
| 2026-10-13 | 交易记录改回真盈亏 A;期权历史/统计仅期权腿 B,不含现货 |
|
||||||
|
|||||||
@@ -555,9 +555,16 @@ def sync_options_from_local_trades(
|
|||||||
ccy = str(r["premium_ccy"] or "").strip().upper()
|
ccy = str(r["premium_ccy"] or "").strip().upper()
|
||||||
if not ccy:
|
if not ccy:
|
||||||
ccy = premium_ccy_for_mode(margin_mode_from_inst_id(inst), underly)
|
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"])
|
close_idx = _safe_float(r["close_index_px"])
|
||||||
open_idx = _safe_float(r["open_index_px"])
|
open_idx = _safe_float(r["open_index_px"])
|
||||||
# 折算指数:平仓卖回价 > 开仓 > 实时(仅无冻结时兜底)
|
# 折算指数:仅用于初始权利金/期权手续费展示,不用于真盈亏
|
||||||
idx = None
|
idx = None
|
||||||
if close_idx is not None and close_idx > 0:
|
if close_idx is not None and close_idx > 0:
|
||||||
idx = close_idx
|
idx = close_idx
|
||||||
@@ -565,23 +572,21 @@ def sync_options_from_local_trades(
|
|||||||
idx = open_idx
|
idx = open_idx
|
||||||
else:
|
else:
|
||||||
idx = idx_cache.get(underly)
|
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"])
|
prem = _safe_float(r["premium_paid"])
|
||||||
# 期权交易记录盈亏与数据统计同口径 B:币盈亏 × 平仓卖回价(不用账户差分 A)
|
# 交易记录真盈亏=口径 A(卖光币后账户差分);未结算不写假 U
|
||||||
pnl_u = _to_usdt(pnl, ccy=ccy, idx=idx)
|
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)=开仓指数×权利金币量;不含多买
|
# 初始权利金(U)=开仓指数×权利金币量;不含多买
|
||||||
stored_initial = _safe_float(r["initial_premium_usdt"])
|
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
|
open_idx_for_prem = open_idx if (open_idx is not None and open_idx > 0) else idx
|
||||||
prem_u = stored_initial
|
prem_u = stored_initial
|
||||||
if prem_u is None:
|
if prem_u is None:
|
||||||
prem_u = _to_usdt(prem, ccy=ccy, idx=open_idx_for_prem)
|
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:
|
if ccy in ("ETH", "BTC") and prem_u is None:
|
||||||
prem_u = prem
|
prem_u = prem
|
||||||
# 仅期权开/平手续费折 U(不含现货)
|
# 仅期权开/平手续费折 U(不含现货)
|
||||||
@@ -635,7 +640,7 @@ def sync_options_from_local_trades(
|
|||||||
"option_fee_usdt": fee_u,
|
"option_fee_usdt": fee_u,
|
||||||
"created_at": opened_at,
|
"created_at": opened_at,
|
||||||
"closed_at": closed_at,
|
"closed_at": closed_at,
|
||||||
"status_label": "已平",
|
"status_label": "待结算" if acct_pending else "已平",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if action == "inserted":
|
if action == "inserted":
|
||||||
|
|||||||
@@ -345,7 +345,7 @@
|
|||||||
<th>张数</th>
|
<th>张数</th>
|
||||||
<th>权利金</th>
|
<th>权利金</th>
|
||||||
<th>状态</th>
|
<th>状态</th>
|
||||||
<th>盈亏</th>
|
<th title="仅期权腿币收益,不含现货买/卖回">盈亏</th>
|
||||||
<th>时间</th>
|
<th>时间</th>
|
||||||
<th>操作</th>
|
<th>操作</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -229,7 +229,7 @@
|
|||||||
<span class="or-step" aria-hidden="true">1</span>
|
<span class="or-step" aria-hidden="true">1</span>
|
||||||
<div>
|
<div>
|
||||||
<div class="or-section-title" id="or-list-title">期权交易记录</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>
|
</div>
|
||||||
<div class="options-strike-table-wrap or-trades-table-wrap" id="or-trades-wrap">
|
<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>初始权利金</th>
|
<th>初始权利金</th>
|
||||||
<th>盈亏</th>
|
<th title="卖回完成后交易账户 USDT 差分">真盈亏</th>
|
||||||
<th>盈利率</th>
|
<th>盈利率</th>
|
||||||
<th>手续费</th>
|
<th title="仅期权开/平手续费">手续费</th>
|
||||||
<th>开仓时间</th>
|
<th>开仓时间</th>
|
||||||
<th>平仓时间</th>
|
<th>平仓时间</th>
|
||||||
<th>持有</th>
|
<th>持有</th>
|
||||||
|
|||||||
Reference in New Issue
Block a user