feat数据统计曲线改为累计已实现盈亏,划转提现不再影响。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""已实现盈亏曲线:累计平仓真盈亏,不受划转影响."""
|
||||
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()
|
||||
Reference in New Issue
Block a user