b31f861596
Co-authored-by: Cursor <cursoragent@cursor.com>
76 lines
2.9 KiB
Python
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()
|