ff1bcd69d2
Co-authored-by: Cursor <cursoragent@cursor.com>
112 lines
4.4 KiB
Python
112 lines
4.4 KiB
Python
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,
|
|
parse_manual_order_style_fields,
|
|
resolve_trade_record_entry_reason,
|
|
trade_style_for_entry_model,
|
|
trend_manual_entry_reason_count,
|
|
)
|
|
from lib.trade.trade_policy_lib import TradePolicy, load_trade_policy
|
|
|
|
|
|
class TestEntryModelLib(unittest.TestCase):
|
|
def test_intraday_profile_btc_eth_whitelist(self):
|
|
policy = load_trade_policy(
|
|
{
|
|
"TRADE_SYMBOL_RESTRICT_ENABLED": "true",
|
|
"TRADE_SYMBOL_WHITELIST": "BTC,ETH",
|
|
}
|
|
)
|
|
self.assertTrue(is_intraday_trading_profile(policy))
|
|
self.assertEqual(trend_manual_entry_reason_count(policy), 5)
|
|
|
|
def test_trend_div_profile_alt(self):
|
|
policy = load_trade_policy(
|
|
{
|
|
"TRADE_SYMBOL_RESTRICT_ENABLED": "false",
|
|
"TRADE_SYMBOL_WHITELIST": "BTC,ETH",
|
|
}
|
|
)
|
|
self.assertFalse(is_intraday_trading_profile(policy))
|
|
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_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, ())
|
|
style, code, err = parse_manual_order_style_fields(policy, {})
|
|
self.assertTrue(err)
|
|
self.assertEqual(code, None)
|
|
|
|
style, code, err = parse_manual_order_style_fields(
|
|
policy, {"entry_model": ENTRY_MODEL_SMALL_DIV}
|
|
)
|
|
self.assertIsNone(err)
|
|
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(
|
|
{
|
|
"TRADE_SYMBOL_RESTRICT_ENABLED": "true",
|
|
"TRADE_SYMBOL_WHITELIST": "BTC,ETH",
|
|
}
|
|
)
|
|
ctx = hub_meta_entry_context(policy)
|
|
self.assertTrue(ctx["intraday_discipline"])
|
|
self.assertEqual(ctx["order_entry_profile"], "intraday")
|
|
policy = TradePolicy(False, "both", True, ("BTC", "ETH"))
|
|
style, code, err = parse_manual_order_style_fields(policy, {"trade_style": "swing"})
|
|
self.assertIsNone(err)
|
|
self.assertIsNone(code)
|
|
self.assertEqual(style, "swing")
|
|
|
|
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[:5], ("启动A", "启动B", "大分歧A", "大分歧B", "小分歧"))
|
|
self.assertIn("趋势回调", opts)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|