"""期期成交盈亏汇总:须计入 option2(Put)腿。""" from __future__ import annotations from app.sim.pnl import summarize_fills_pnl def test_summarize_oo_both_legs() -> None: fills = [ { "leg": "option", "action": "open", "side": "long", "fill_px": 12.6, "qty_eth": 3.5, "fee": 0.0221, "slip": 0, }, { "leg": "option2", "action": "open", "side": "long", "fill_px": 9.0, "qty_eth": 5.0, "fee": 0.0225, "slip": 0, }, { "leg": "option", "action": "close", "side": "sell", "fill_px": 0.0, "qty_eth": 3.5, "fee": 0.0, "slip": 0, }, { "leg": "option2", "action": "close", "side": "sell", "fill_px": 0.0, "qty_eth": 5.0, "fee": 0.0, "slip": 0, }, ] s = summarize_fills_pnl(fills) assert s["option_pnl"] == -12.6 * 3.5 assert s["option2_pnl"] == -9.0 * 5.0 assert s["perp_pnl"] is None assert abs(float(s["fees_option"] or 0) - 0.0446) < 1e-9 assert abs(float(s["gross_pnl"] or 0) - (-44.1 - 45.0)) < 1e-9 assert abs(float(s["net_pnl"] or 0) - (-89.1 - 0.0446)) < 1e-9 def test_summarize_perp_option_unchanged() -> None: fills = [ {"leg": "option", "action": "open", "fill_px": 10, "qty_eth": 2, "fee": 0.1, "slip": 0}, {"leg": "perp", "action": "open", "side": "short", "fill_px": 100, "qty_eth": 1, "fee": 0.2, "slip": 0}, {"leg": "option", "action": "close", "fill_px": 12, "qty_eth": 2, "fee": 0.1, "slip": 0}, {"leg": "perp", "action": "close", "side": "short", "fill_px": 98, "qty_eth": 1, "fee": 0.2, "slip": 0}, ] s = summarize_fills_pnl(fills) assert s["option_pnl"] == 4.0 assert s["perp_pnl"] == 2.0 assert s["option2_pnl"] is None assert abs(float(s["net_pnl"] or 0) - (6.0 - 0.6)) < 1e-9