diff --git a/notifications/telegram.py b/notifications/telegram.py index 6ae6ac7..fccf3ca 100644 --- a/notifications/telegram.py +++ b/notifications/telegram.py @@ -60,6 +60,10 @@ "market_status_delever": "🛡️ 降杠杆({asset})", "signal_risk_on": "SOXL 站上 {window} 日均线,持有 SOXL,交易层风险仓位 {ratio}", "signal_delever": "SOXL 跌破 {window} 日均线,切换至 SOXX,交易层风险仓位 {ratio}", + "market_status_blend_gate_risk_on": "🚀 风险开启({asset})", + "market_status_blend_gate_defensive": "🛡️ 降杠杆({asset})", + "signal_blend_gate_risk_on": "{trend_symbol} 站上 {window} 日门槛线,持有 SOXL {soxl_ratio} + SOXX {soxx_ratio}", + "signal_blend_gate_defensive": "{trend_symbol} 跌破门槛线,防守持有 SOXX {soxx_ratio}", "signal_hold": "趋势持有", "signal_entry": "入场信号", "signal_reduce": "减仓信号", @@ -71,6 +75,9 @@ "strategy_name_russell_1000_multi_factor_defensive": "罗素1000多因子", "strategy_name_tech_communication_pullback_enhancement": "科技通信回调增强", "strategy_name_qqq_tech_enhancement": "科技通信回调增强", + "strategy_name_mega_cap_leader_rotation_aggressive": "Mega Cap 激进龙头轮动", + "strategy_name_mega_cap_leader_rotation_dynamic_top20": "Mega Cap 动态 Top20 龙头轮动", + "strategy_name_dynamic_mega_leveraged_pullback": "Mega Cap 2x 回调策略", }, "en": { "rebalance_title": "🔔 【Trade Execution Report】", @@ -117,6 +124,10 @@ "market_status_delever": "🛡️ DE-LEVER ({asset})", "signal_risk_on": "SOXL above {window}d MA, hold SOXL, risk {ratio}", "signal_delever": "SOXL below {window}d MA, switch to SOXX, risk {ratio}", + "market_status_blend_gate_risk_on": "🚀 RISK-ON ({asset})", + "market_status_blend_gate_defensive": "🛡️ DE-LEVER ({asset})", + "signal_blend_gate_risk_on": "{trend_symbol} above {window}d gated entry, hold SOXL {soxl_ratio} + SOXX {soxx_ratio}", + "signal_blend_gate_defensive": "{trend_symbol} below gated entry, hold defensive SOXX {soxx_ratio}", "signal_hold": "Trend Hold", "signal_entry": "Entry Signal", "signal_reduce": "Reduce Signal", @@ -128,6 +139,9 @@ "strategy_name_russell_1000_multi_factor_defensive": "Russell 1000 Multi-Factor", "strategy_name_tech_communication_pullback_enhancement": "Tech/Communication Pullback Enhancement", "strategy_name_qqq_tech_enhancement": "Tech/Communication Pullback Enhancement", + "strategy_name_mega_cap_leader_rotation_aggressive": "Mega Cap Leader Rotation Aggressive", + "strategy_name_mega_cap_leader_rotation_dynamic_top20": "Mega Cap Leader Rotation Dynamic Top20", + "strategy_name_dynamic_mega_leveraged_pullback": "Dynamic Mega Leveraged Pullback", }, } diff --git a/tests/test_notifications.py b/tests/test_notifications.py index fb7645a..4170de6 100644 --- a/tests/test_notifications.py +++ b/tests/test_notifications.py @@ -14,6 +14,7 @@ build_strategy_display_name, build_translator, ) +from strategy_registry import SUPPORTED_STRATEGY_PROFILES class FakeRequests: @@ -29,6 +30,17 @@ class NotificationTests(unittest.TestCase): def test_build_translator_supports_chinese(self): translate = build_translator("zh") self.assertEqual(translate("equity", value="123.45"), "💰 净值: $123.45") + self.assertEqual(translate("market_status_blend_gate_risk_on", asset="SOXX+SOXL"), "🚀 风险开启(SOXX+SOXL)") + self.assertEqual( + translate( + "signal_blend_gate_risk_on", + trend_symbol="SOXX", + window=140, + soxl_ratio="70.0%", + soxx_ratio="20.0%", + ), + "SOXX 站上 140 日门槛线,持有 SOXL 70.0% + SOXX 20.0%", + ) def test_build_strategy_display_name_supports_i18n(self): zh_translate = build_translator("zh") @@ -38,6 +50,14 @@ def test_build_strategy_display_name_supports_i18n(self): self.assertEqual(zh_name, "SOXL/SOXX 半导体趋势收益") self.assertEqual(en_name, "SOXL/SOXX Semiconductor Trend Income") + def test_supported_strategy_profiles_have_translated_names(self): + zh_name = build_strategy_display_name(build_translator("zh")) + en_name = build_strategy_display_name(build_translator("en")) + + for profile in SUPPORTED_STRATEGY_PROFILES: + self.assertNotEqual(zh_name(profile), profile) + self.assertNotEqual(en_name(profile), profile) + def test_build_prefixer_prefers_account_prefix_only(self): with_prefix = build_prefixer("HK", "longbridge-quant-semiconductor-rotation-income-hk") self.assertEqual(with_prefix("hello"), "[HK] hello")