Use absolute coin counts in perp-options points mode.

Treat 2:4 as 2 perp + 4 option coins instead of normalizing to 1:2, and disable embed page caching so hub iframe picks up trade UI updates.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-29 22:54:16 +08:00
parent 9f3395de2f
commit d89aff3ad6
7 changed files with 116 additions and 44 deletions
+28
View File
@@ -125,6 +125,34 @@ class HubPerpOptionsCalcTests(unittest.TestCase):
self.assertAlmostEqual(sw["max_loss_u"], 37.8, places=6)
self.assertAlmostEqual(sw["net_u"], -37.8, places=6)
def test_points_absolute_2_to_4(self):
# 2:4 按绝对币数,不再归一成 1:2
data, err = calc_perp_options_points(
base="ETH",
spot=1800,
capital_usdt=3000,
target_profit_u=15,
perp_leverage=10,
option_leverage=100,
ratio_perp=2,
ratio_opt=4,
ct_mult=0.01,
)
self.assertIsNone(err)
assert data is not None
self.assertEqual(data["perp_coins"], 2.0)
self.assertEqual(data["opt_coins"], 4.0)
self.assertEqual(data["premium_total_u"], 72.0)
self.assertAlmostEqual(data["perp_margin_u"], 360.0, places=6)
expect_a = (15 + 72 + 2 * 1800 * 2 * 0.0005) / (2 * 0.9995)
self.assertAlmostEqual(data["case_a"]["move_points"], expect_a, places=6)
self.assertAlmostEqual(data["case_a"]["net_u"], 15.0, places=5)
self.assertAlmostEqual(data["case_b"]["move_points_portfolio"], 43.5, places=6)
self.assertAlmostEqual(data["case_b"]["portfolio_net_u"], 15.0, places=6)
sw = data["case_sideways"]
self.assertAlmostEqual(sw["fee_u"], 3.6, places=6)
self.assertAlmostEqual(sw["max_loss_u"], 75.6, places=6)
def test_points_ratio_1_to_1_no_portfolio(self):
data, err = calc_perp_options(
calc_mode="points",