fix卖回VWAP必须落库并覆盖指数占位价,禁止预算反推开仓价。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-13 11:55:42 +08:00
parent dd979d9dd0
commit 11a083470d
7 changed files with 378 additions and 37 deletions
+55 -1
View File
@@ -7,7 +7,7 @@ import unittest
class ReviewLocalSyncFreezeTests(unittest.TestCase):
def test_refresh_recomputes_u_keeps_frozen_qty_px(self):
"""刷新按公式重算U;权利金币/币盈亏/开仓卖回价不变."""
"""刷新按公式重算U;权利金币/币盈亏不变."""
from lib.options.options_db import init_options_tables
from lib.options.options_review_lib import sync_options_from_local_trades
from lib.sim.mode_lib import MODE_SIM, TRADING_MODE_KEY
@@ -55,6 +55,60 @@ class ReviewLocalSyncFreezeTests(unittest.TestCase):
self.assertAlmostEqual(float(row["realized_pnl_total"]), 700.0, places=2)
conn.close()
def test_refresh_prefers_bridge_sell_vwap_over_wrong_index(self):
"""库内卖回价若是指数占位,刷新须用桥上卖回 VWAP 纠正."""
from lib.options.options_db import init_options_tables
from lib.options.options_review_lib import sync_options_from_local_trades
from lib.options.options_spot_bridge_lib import (
BRIDGE_CLOSED,
add_bridge_buy_fill,
add_bridge_close_sell_fill,
ensure_bridge_table,
insert_bridge,
update_bridge,
)
from lib.sim.mode_lib import MODE_SIM, TRADING_MODE_KEY
from lib.instance.runtime_settings_lib import ensure_runtime_settings_table, runtime_set
conn = sqlite3.connect(":memory:")
conn.row_factory = sqlite3.Row
init_options_tables(conn)
ensure_bridge_table(conn)
ensure_runtime_settings_table(conn)
runtime_set(conn, TRADING_MODE_KEY, MODE_SIM)
bid = insert_bridge(conn, underlying="BTC", status="holding", budget_usdt=990.0)
add_bridge_buy_fill(conn, bid, usdt_spent=840.10, coin_bought=0.01)
add_bridge_close_sell_fill(conn, bid, usdt_recovered=814.18, coin_sold=0.01)
update_bridge(conn, bid, status=BRIDGE_CLOSED, close=True)
conn.execute(
"""
INSERT INTO options_trades(
inst_id, underlying, opt_type, sheets, eth_amount,
premium_paid, premium_received, realized_pnl, premium_ccy,
open_fee, close_fee, status, realized_pnl_usdt,
open_index_px, close_index_px, pnl_settled, bridge_id,
created_at, closed_at
) VALUES (
'BTC-USD-261015-84000-P', 'BTC', 'P', 1, 0.01,
0.01, 0.02, 0.01, 'BTC',
0, 0, 'closed', 1544.0,
88086.0, 85400.0, 1, ?,
'2026-10-12 01:46:50', '2026-10-13 08:07:35'
)
""",
(bid,),
)
conn.commit()
sync_options_from_local_trades(conn, None)
trade = conn.execute(
"SELECT realized_pnl_usdt, open_index_px, close_index_px FROM options_trades WHERE id=1"
).fetchone()
self.assertAlmostEqual(float(trade["open_index_px"]), 84010.0, places=2)
self.assertAlmostEqual(float(trade["close_index_px"]), 81418.0, places=2)
# A = 0.01*81418 - 0.01*(84010-81418) = 814.18 - 25.92 = 788.26
self.assertAlmostEqual(float(trade["realized_pnl_usdt"]), 788.26, places=2)
conn.close()
def test_premium_usdt_move_formula(self):
from lib.options.options_db import init_options_tables
from lib.options.options_review_lib import sync_options_from_local_trades