a16dd4f9cc
Co-authored-by: Cursor <cursoragent@cursor.com>
109 lines
4.1 KiB
Python
109 lines
4.1 KiB
Python
"""复盘导入须使用冻结 U,不得用实时指数改写."""
|
|
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
import unittest
|
|
|
|
|
|
class ReviewLocalSyncFreezeTests(unittest.TestCase):
|
|
def test_prefers_realized_pnl_usdt_over_live_index(self):
|
|
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
|
|
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_runtime_settings_table(conn)
|
|
runtime_set(conn, TRADING_MODE_KEY, MODE_SIM)
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO options_trades(
|
|
inst_id, underlying, opt_type, sheets, eth_amount,
|
|
premium_paid, premium_received, realized_pnl, premium_ccy,
|
|
status, realized_pnl_usdt, close_index_px,
|
|
created_at, closed_at
|
|
) VALUES (
|
|
'BTC-USD-261008-86500-P', 'BTC', 'P', 1, 0.01,
|
|
0.01, 0.02, 0.01172, 'BTC',
|
|
'closed', 1947.05, 85000.0,
|
|
'2026-10-05 05:11:30', '2026-10-07 10:03:53'
|
|
)
|
|
"""
|
|
)
|
|
conn.commit()
|
|
|
|
class _Ex:
|
|
def public_get_market_ticker(self, params):
|
|
return {"data": [{"last": "999999"}]}
|
|
|
|
out = sync_options_from_local_trades(conn, _Ex())
|
|
self.assertTrue(out.get("ok"))
|
|
row = conn.execute(
|
|
"SELECT realized_pnl_total FROM options_review_trades WHERE history_key=?",
|
|
("local_opt:1",),
|
|
).fetchone()
|
|
self.assertIsNotNone(row)
|
|
# 必须是冻结现金 1947.05,不是 0.01172*999999
|
|
self.assertAlmostEqual(float(row["realized_pnl_total"]), 1947.05, places=2)
|
|
conn.close()
|
|
|
|
def test_second_sync_stable_when_index_moves(self):
|
|
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
|
|
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_runtime_settings_table(conn)
|
|
runtime_set(conn, TRADING_MODE_KEY, MODE_SIM)
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO options_trades(
|
|
inst_id, underlying, opt_type, sheets, eth_amount,
|
|
premium_paid, premium_received, realized_pnl, premium_ccy,
|
|
status, realized_pnl_usdt, close_index_px,
|
|
created_at, closed_at
|
|
) VALUES (
|
|
'BTC-USD-261008-86500-P', 'BTC', 'P', 1, 0.01,
|
|
0.01, 0.02, 0.01, 'BTC',
|
|
'closed', 952.96, 80000.0,
|
|
'2026-10-05 05:11:30', '2026-10-07 10:03:53'
|
|
)
|
|
"""
|
|
)
|
|
conn.commit()
|
|
|
|
class _Ex1:
|
|
def public_get_market_ticker(self, params):
|
|
return {"data": [{"last": "70000"}]}
|
|
|
|
class _Ex2:
|
|
def public_get_market_ticker(self, params):
|
|
return {"data": [{"last": "120000"}]}
|
|
|
|
sync_options_from_local_trades(conn, _Ex1())
|
|
v1 = float(
|
|
conn.execute(
|
|
"SELECT realized_pnl_total FROM options_review_trades WHERE history_key=?",
|
|
("local_opt:1",),
|
|
).fetchone()["realized_pnl_total"]
|
|
)
|
|
sync_options_from_local_trades(conn, _Ex2())
|
|
v2 = float(
|
|
conn.execute(
|
|
"SELECT realized_pnl_total FROM options_review_trades WHERE history_key=?",
|
|
("local_opt:1",),
|
|
).fetchone()["realized_pnl_total"]
|
|
)
|
|
self.assertAlmostEqual(v1, 952.96, places=2)
|
|
self.assertAlmostEqual(v2, v1, places=6)
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|