Files
crypto_okx/tests/test_instance_realized_pnl_curve.py

76 lines
2.9 KiB
Python

"""已实现盈亏曲线:累计平仓真盈亏,不受划转影响."""
from __future__ import annotations
import sqlite3
import unittest
class RealizedPnlCurveTests(unittest.TestCase):
def _init(self):
from lib.options.options_db import init_options_tables
conn = sqlite3.connect(":memory:")
conn.row_factory = sqlite3.Row
init_options_tables(conn)
return conn
def test_cumulative_steps(self):
from lib.instance.instance_cash_sample_lib import query_realized_pnl_series_with_db
conn = self._init()
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-A','BTC','P',1,0.01,0.01,0.02,0.01,'BTC','closed',100.0,80000,
'2026-10-01 10:00:00','2026-10-01 12:00:00'),
('BTC-B','BTC','P',1,0.01,0.01,0.02,0.01,'BTC','closed',50.0,80000,
'2026-10-02 10:00:00','2026-10-02 12:00:00'),
('BTC-C','BTC','P',1,0.01,0.01,0.02,-0.01,'BTC','closed',-20.0,80000,
'2026-10-03 10:00:00','2026-10-03 12:00:00')
"""
)
conn.commit()
out = query_realized_pnl_series_with_db(conn, range_key="all")
self.assertTrue(out["ok"])
self.assertEqual(out["metric"], "realized_pnl")
self.assertEqual(out["trade_count"], 3)
# 点含区间起点/各笔台阶/延伸到 now;累计最终 130
self.assertAlmostEqual(float(out["latest"]), 130.0, places=2)
vals = [p["v"] for p in out["points"]]
self.assertIn(100.0, vals)
self.assertIn(150.0, vals)
self.assertIn(130.0, vals)
conn.close()
def test_range_carries_baseline(self):
from lib.instance.instance_cash_sample_lib import query_realized_pnl_series_with_db
conn = self._init()
# 一笔很早的盈利,窗口内无新单 → 水平线在 80
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, created_at, closed_at
) VALUES (
'BTC-OLD','BTC','P',1,0.01,0.01,0.02,0.01,'BTC',
'closed', 80.0, '2020-01-01 10:00:00', '2020-01-01 12:00:00'
)
"""
)
conn.commit()
out = query_realized_pnl_series_with_db(conn, range_key="7d")
self.assertAlmostEqual(float(out["latest"]), 80.0, places=2)
self.assertTrue(all(abs(float(p["v"]) - 80.0) < 1e-6 for p in out["points"]))
conn.close()
if __name__ == "__main__":
unittest.main()