feat: two-level entry model UI for trend accounts (reversal/trend/swing)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-06 19:02:18 +08:00
parent eb6788091d
commit ff1bcd69d2
14 changed files with 289 additions and 146 deletions
+29 -3
View File
@@ -3,8 +3,14 @@ import unittest
from lib.trade.entry_model_lib import (
ENTRY_MODEL_BIG_DIV_A,
ENTRY_MODEL_BIG_DIV_B,
ENTRY_MODEL_LAUNCH_A,
ENTRY_MODEL_LAUNCH_B,
ENTRY_MODEL_SMALL_DIV,
ENTRY_CATEGORY_REVERSAL,
ENTRY_CATEGORY_TREND,
build_trend_div_entry_reason_options,
entry_model_categories,
entry_model_category,
entry_model_label,
hub_meta_entry_context,
is_intraday_trading_profile,
@@ -35,12 +41,23 @@ class TestEntryModelLib(unittest.TestCase):
}
)
self.assertFalse(is_intraday_trading_profile(policy))
self.assertEqual(trend_manual_entry_reason_count(policy), 3)
self.assertEqual(trend_manual_entry_reason_count(policy), 5)
def test_entry_model_maps_trade_style(self):
self.assertEqual(trade_style_for_entry_model(ENTRY_MODEL_LAUNCH_A), "trend")
self.assertEqual(trade_style_for_entry_model(ENTRY_MODEL_BIG_DIV_A), "trend")
self.assertEqual(trade_style_for_entry_model(ENTRY_MODEL_SMALL_DIV), "swing")
self.assertEqual(entry_model_label(ENTRY_MODEL_BIG_DIV_A), "大分歧A")
self.assertEqual(entry_model_label(ENTRY_MODEL_LAUNCH_B), "启动B")
self.assertEqual(entry_model_category(ENTRY_MODEL_LAUNCH_A), ENTRY_CATEGORY_REVERSAL)
self.assertEqual(entry_model_category(ENTRY_MODEL_BIG_DIV_B), ENTRY_CATEGORY_TREND)
def test_entry_model_categories_two_level(self):
cats = entry_model_categories()
keys = [c["key"] for c in cats]
self.assertEqual(keys, ["reversal", "trend", "swing"])
reversal = cats[0]["options"]
self.assertEqual([o["code"] for o in reversal], ["launch_a", "launch_b"])
self.assertEqual(len(cats[2]["options"]), 1)
def test_parse_trend_div_requires_entry_model(self):
policy = TradePolicy(False, "both", False, ())
@@ -55,6 +72,13 @@ class TestEntryModelLib(unittest.TestCase):
self.assertEqual(code, ENTRY_MODEL_SMALL_DIV)
self.assertEqual(style, "swing")
style, code, err = parse_manual_order_style_fields(
policy, {"entry_model": ENTRY_MODEL_LAUNCH_A}
)
self.assertIsNone(err)
self.assertEqual(code, ENTRY_MODEL_LAUNCH_A)
self.assertEqual(style, "trend")
def test_hub_meta_intraday(self):
policy = load_trade_policy(
{
@@ -74,10 +98,12 @@ class TestEntryModelLib(unittest.TestCase):
def test_resolve_entry_reason_from_model(self):
er = resolve_trade_record_entry_reason(entry_model=ENTRY_MODEL_BIG_DIV_B)
self.assertEqual(er, "大分歧B")
er2 = resolve_trade_record_entry_reason(entry_model=ENTRY_MODEL_LAUNCH_A)
self.assertEqual(er2, "启动A")
def test_build_trend_div_journal_options(self):
opts = build_trend_div_entry_reason_options(("趋势回调",))
self.assertEqual(opts[:3], ("大分歧A", "大分歧B", "小分歧"))
self.assertEqual(opts[:5], ("启动A", "启动B", "大分歧A", "大分歧B", "小分歧"))
self.assertIn("趋势回调", opts)