Files
dekun 53863559f4 Initialize crypto_monitor_user (user edition) from monitor codebase.
Retarget git remote, install path, and deploy docs from crypto_monitor to crypto_monitor_user.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 16:18:13 +08:00

49 lines
1.6 KiB
Python

"""永续固定费率净盈亏."""
from __future__ import annotations
import os
import sys
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from lib.trade.trade_fee_lib import ( # noqa: E402
estimate_roundtrip_fee_usdt,
net_pnl_after_fee,
notional_usdt,
taker_fee_rate,
)
class TestTradeFeeLib(unittest.TestCase):
def test_default_rate(self):
os.environ.pop("PERP_TAKER_FEE_RATE", None)
self.assertAlmostEqual(taker_fee_rate(), 0.0005)
def test_notional(self):
self.assertAlmostEqual(notional_usdt(100, 2, 1.0), 200.0)
self.assertAlmostEqual(notional_usdt(62000, 78, 0.0001), 483.6, places=2)
def test_roundtrip_fee_qty(self):
# 开 100*2=200, 平 110*2=220, 费=(200+220)*0.0005=0.21
fee = estimate_roundtrip_fee_usdt(100, 110, 2.0, 1.0, rate=0.0005)
self.assertAlmostEqual(fee, 0.21, places=6)
def test_net_long_matches_checklist(self):
# 毛利 20, 费 0.21 → 净 19.79
net = net_pnl_after_fee(20.0, 100, 110, 2.0, 1.0, rate=0.0005)
self.assertAlmostEqual(net, 19.79, places=4)
def test_open_notional_fallback(self):
# 无张数:开名义 1000, 出场 110/100 → 平 1100, 费=1.05
fee = estimate_roundtrip_fee_usdt(100, 110, open_notional=1000, rate=0.0005)
self.assertAlmostEqual(fee, 1.05, places=6)
net = net_pnl_after_fee(50.0, 100, 110, open_notional=1000, rate=0.0005)
self.assertAlmostEqual(net, 48.95, places=4)
if __name__ == "__main__":
unittest.main()