fix多笔买/卖回用VWAP计入真盈亏,卖完再结算并标记待卖回。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-13 10:38:46 +08:00
parent 42a7ee9961
commit 53a624633d
11 changed files with 451 additions and 28 deletions
+21 -6
View File
@@ -263,10 +263,13 @@ def settle_closed_trades_from_trading_account(
params.append(int(bridge_id))
else:
return 0
from lib.options.options_pnl_settle_lib import resolve_spot_vwap_prices
rows = conn.execute(
f"""
SELECT id, trading_usdt_before, premium_paid, premium_received, realized_pnl,
open_index_px, close_index_px, open_fee, close_fee, premium_ccy, fee_ccy
open_index_px, close_index_px, open_fee, close_fee, premium_ccy, fee_ccy,
bridge_id
FROM options_trades
WHERE {" AND ".join(clauses)}
""",
@@ -280,30 +283,42 @@ def settle_closed_trades_from_trading_account(
)
after_use = after
if after_use is None and before is not None:
# 无 after 读数时不编造;仍可用权利金公式冻结
after_use = None
row_bid = row["bridge_id"] if hasattr(row, "keys") else row[11]
if row_bid is None and bridge_id is not None:
row_bid = bridge_id
open_px, close_px, _gate = resolve_spot_vwap_prices(
conn,
bridge_id=row_bid,
open_index_px=row["open_index_px"] if hasattr(row, "keys") else row[5],
close_index_px=row["close_index_px"] if hasattr(row, "keys") else row[6],
)
pnl_u, src = resolve_true_pnl_usdt_from_trade(
premium_paid=row["premium_paid"] if hasattr(row, "keys") else row[2],
premium_received=row["premium_received"] if hasattr(row, "keys") else row[3],
realized_pnl=row["realized_pnl"] if hasattr(row, "keys") else row[4],
open_index_px=row["open_index_px"] if hasattr(row, "keys") else row[5],
close_index_px=row["close_index_px"] if hasattr(row, "keys") else row[6],
open_index_px=open_px,
close_index_px=close_px,
open_fee=row["open_fee"] if hasattr(row, "keys") else row[7],
close_fee=row["close_fee"] if hasattr(row, "keys") else row[8],
premium_ccy=row["premium_ccy"] if hasattr(row, "keys") else row[9],
fee_ccy=row["fee_ccy"] if hasattr(row, "keys") else row[10],
conn=conn,
bridge_id=row_bid,
)
if pnl_u is None or src == "none":
if pnl_u is None or src in ("none", "pending_sell"):
continue
conn.execute(
"""
UPDATE options_trades
SET trading_usdt_after = COALESCE(?, trading_usdt_after),
realized_pnl_usdt = ?,
open_index_px = COALESCE(?, open_index_px),
close_index_px = COALESCE(?, close_index_px),
pnl_settled = 1
WHERE id = ? AND COALESCE(pnl_settled, 0)=0
""",
(after_use, pnl_u, tid),
(after_use, pnl_u, open_px, close_px, tid),
)
updated += 1
return updated