53863559f4
Retarget git remote, install path, and deploy docs from crypto_monitor to crypto_monitor_user. Co-authored-by: Cursor <cursoragent@cursor.com>
49 lines
1.6 KiB
Python
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()
|