"""已实现盈亏曲线:累计平仓真盈亏,不受划转影响.""" 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()