fix: show header realtime PnL from exchange positions and order metrics
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
"""instance_live_pnl_lib 单元测试。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from lib.instance.instance_live_pnl_lib import (
|
||||
position_row_contracts,
|
||||
resolve_instance_unrealized_pnl,
|
||||
sum_unrealized_pnl_from_metrics,
|
||||
sum_unrealized_pnl_from_positions,
|
||||
)
|
||||
|
||||
|
||||
class TestInstanceLivePnlLib(unittest.TestCase):
|
||||
def test_position_row_contracts_from_info(self):
|
||||
pos = {"contracts": 0, "info": {"positionAmt": "12.5"}}
|
||||
self.assertAlmostEqual(position_row_contracts(pos), 12.5)
|
||||
|
||||
def test_sum_from_positions_binance_style(self):
|
||||
positions = [
|
||||
{"unrealizedPnl": -0.14, "info": {"positionAmt": "100"}},
|
||||
]
|
||||
self.assertEqual(sum_unrealized_pnl_from_positions(positions), -0.14)
|
||||
|
||||
def test_sum_from_metrics_fallback(self):
|
||||
rows = [{"exchange_symbol": "DOGE/USDT:USDT", "symbol": "DOGE/USDT", "direction": "long"}]
|
||||
|
||||
def _metrics(ex_sym, direction):
|
||||
self.assertEqual(direction, "long")
|
||||
return {"unrealized_pnl": -0.14}
|
||||
|
||||
self.assertEqual(sum_unrealized_pnl_from_metrics(rows, _metrics), -0.14)
|
||||
|
||||
def test_resolve_prefers_bulk_positions(self):
|
||||
def _fetch():
|
||||
return [{"unrealizedPnl": 1.2, "contracts": 1}]
|
||||
|
||||
def _metrics(_ex, _d):
|
||||
raise AssertionError("should not call metrics when bulk works")
|
||||
|
||||
total = resolve_instance_unrealized_pnl(_fetch, [], _metrics)
|
||||
self.assertEqual(total, 1.2)
|
||||
|
||||
def test_resolve_falls_back_to_metrics(self):
|
||||
def _fetch():
|
||||
raise RuntimeError("api down")
|
||||
|
||||
rows = [{"exchange_symbol": "BTC/USDT:USDT", "symbol": "BTC/USDT", "direction": "short"}]
|
||||
|
||||
def _metrics(_ex, direction):
|
||||
return {"unrealized_pnl": -2.5} if direction == "short" else None
|
||||
|
||||
total = resolve_instance_unrealized_pnl(_fetch, rows, _metrics)
|
||||
self.assertEqual(total, -2.5)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user