cd23ea74a6
Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
"""单独期权翻倍出场命中条件."""
|
|
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from lib.options.options_db import init_options_tables
|
|
from lib.options.options_profit_exit_lib import (
|
|
normalize_profit_exit_mult,
|
|
profit_exit_by_inst,
|
|
profit_exit_hit,
|
|
required_recycle_usdc,
|
|
set_profit_exit,
|
|
)
|
|
|
|
|
|
class TestOptionsProfitExit(unittest.TestCase):
|
|
def test_hit_one_x_means_profit_equals_premium(self):
|
|
# 1倍:盈利=权利金 ⇒ 回收≥2×权利金
|
|
self.assertTrue(profit_exit_hit(premium_paid=10.0, recycle_usdc=20.0, mult=1.0))
|
|
self.assertFalse(profit_exit_hit(premium_paid=10.0, recycle_usdc=19.9, mult=1.0))
|
|
self.assertEqual(required_recycle_usdc(10.0, 1.0), 20.0)
|
|
|
|
def test_hit_two_x(self):
|
|
self.assertTrue(profit_exit_hit(premium_paid=10.0, recycle_usdc=30.0, mult=2.0))
|
|
self.assertFalse(profit_exit_hit(premium_paid=10.0, recycle_usdc=29.9, mult=2.0))
|
|
|
|
def test_normalize_mult(self):
|
|
self.assertEqual(normalize_profit_exit_mult(None), 1.0)
|
|
self.assertEqual(normalize_profit_exit_mult(0), 1.0)
|
|
self.assertEqual(normalize_profit_exit_mult("1.5"), 1.5)
|
|
|
|
def test_set_and_clear(self):
|
|
with tempfile.TemporaryDirectory() as td:
|
|
db = Path(td) / "t.db"
|
|
conn = sqlite3.connect(str(db))
|
|
conn.row_factory = sqlite3.Row
|
|
init_options_tables(conn)
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO options_trades
|
|
(inst_id, underlying, opt_type, sheets, eth_amount, premium_paid, status)
|
|
VALUES ('ETH-X', 'ETH', 'C', 1, 0.01, 10.0, 'open')
|
|
"""
|
|
)
|
|
conn.commit()
|
|
out = set_profit_exit(conn, inst_id="ETH-X", enabled=True, mult=1.5)
|
|
self.assertTrue(out["ok"])
|
|
conn.commit()
|
|
m = profit_exit_by_inst(conn)
|
|
self.assertTrue(m["ETH-X"]["profit_exit_enabled"])
|
|
self.assertEqual(m["ETH-X"]["profit_exit_mult"], 1.5)
|
|
self.assertEqual(m["ETH-X"]["required_recycle"], 25.0)
|
|
out2 = set_profit_exit(conn, inst_id="ETH-X", enabled=False, mult=1.5)
|
|
self.assertTrue(out2["ok"])
|
|
conn.commit()
|
|
m2 = profit_exit_by_inst(conn)
|
|
self.assertNotIn("ETH-X", m2)
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|