@@ -171,10 +171,11 @@ def test_heartbeat_signal_snapshot_localizes_price_source(self):
171171 dry_run_only = False ,
172172 )
173173
174- self .assertIn ("数据源 LongBridge 日线K线" , rendered .compact_text )
175- self .assertIn ("🧩 输入状态: 价格 2026-05-28 | 股票池 2026-04-30 | 股票池复用 连续1次" , rendered .compact_text )
176- self .assertNotIn ("报价覆盖" , rendered .compact_text )
177- self .assertIn ("📊 市场状态: 🚀 风险开启(SOXX+SOXL)" , rendered .compact_text )
174+ self .assertIn ("数据源 LongBridge 日线K线" , rendered .detailed_text )
175+ self .assertIn ("🧩 输入状态: 价格 2026-05-28 | 股票池 2026-04-30 | 股票池复用 连续1次" , rendered .detailed_text )
176+ self .assertIn ("📊 市场状态: 🚀 风险开启(SOXX+SOXL)" , rendered .detailed_text )
177+ self .assertNotIn ("数据源 LongBridge 日线K线" , rendered .compact_text )
178+ self .assertNotIn ("📊 市场状态" , rendered .compact_text )
178179 self .assertNotIn ("longbridge_candlesticks" , rendered .compact_text )
179180
180181 def test_dry_run_heartbeat_uses_dry_run_title (self ):
@@ -264,12 +265,14 @@ def test_heartbeat_renders_tqqq_volatility_delever_risk_control(self):
264265
265266 self .assertIn (
266267 "🛡️ 风控: QQQ 5 日年化波动率 31.2% 高于实际阈值 30.0%(动态 p90,252日窗口,范围 24.0%-36.0%,样本 252),TQQQ 转向 QQQ(杠杆仓位:TQQQ 保留 25.0%,QQQ 75.0%)" ,
267- zh_rendered .compact_text ,
268+ zh_rendered .detailed_text ,
268269 )
270+ self .assertNotIn ("🛡️ 风控:" , zh_rendered .compact_text )
269271 self .assertIn (
270272 "🛡️ Risk control: QQQ 5d annualized volatility 31.2% is above effective threshold 30.0% (dynamic p90, 252d lookback, bounded 24.0%-36.0%, samples 252); TQQQ redirects to QQQ (leveraged sleeve: TQQQ retained 25.0%, QQQ 75.0%)" ,
271- en_rendered .compact_text ,
273+ en_rendered .detailed_text ,
272274 )
275+ self .assertNotIn ("🛡️ Risk control:" , en_rendered .compact_text )
273276
274277 def test_heartbeat_renders_tqqq_volatility_delever_hysteresis_risk_control (self ):
275278 zh_rendered = render_heartbeat_notification (
@@ -331,12 +334,14 @@ def test_heartbeat_renders_tqqq_volatility_delever_hysteresis_risk_control(self)
331334
332335 self .assertIn (
333336 "🛡️ 风控: QQQ 5 日年化波动率 26.2% 仍高于退出阈值 24.0%;入场实际阈值 30.0%(动态 p90,252日窗口,范围 24.0%-36.0%,样本 252),维持 TQQQ 转向 QQQM(杠杆仓位:TQQQ 保留 0.0%,QQQM 100.0%)" ,
334- zh_rendered .compact_text ,
337+ zh_rendered .detailed_text ,
335338 )
339+ self .assertNotIn ("🛡️ 风控:" , zh_rendered .compact_text )
336340 self .assertIn (
337341 "🛡️ Risk control: QQQ 5d annualized volatility 26.2% remains above exit threshold 24.0%; entry effective threshold 30.0% (dynamic p90, 252d lookback, bounded 24.0%-36.0%, samples 252); keep TQQQ redirected to QQQM (leveraged sleeve: TQQQ retained 0.0%, QQQM 100.0%)" ,
338- en_rendered .compact_text ,
342+ en_rendered .detailed_text ,
339343 )
344+ self .assertNotIn ("🛡️ Risk control:" , en_rendered .compact_text )
340345
341346 def test_heartbeat_localizes_strategy_diagnostics_and_source_input_status (self ):
342347 rendered = render_heartbeat_notification (
@@ -369,25 +374,37 @@ def test_heartbeat_localizes_strategy_diagnostics_and_source_input_status(self):
369374 dry_run_only = False ,
370375 )
371376
372- self .assertIn ("🧩 输入状态: 价格 2026-06-01 | 股票池 2026-05-14 | 状态 部分行情刷新" , rendered .compact_text )
373- self .assertIn (
374- "🎯 信号: 市场阶段=进攻 市场宽度=68.0% 基准趋势=向上 "
375- "目标股票仓位=100.0% 实际股票仓位=100.0% 入选标的数=4 "
376- "前排标的=MU(4.07), INTC(2.23), AMD(1.96)" ,
377- rendered .compact_text ,
378- )
379- self .assertIn ("📊 市场状态: 市场阶段=进攻" , rendered .compact_text )
380- self .assertIn (
381- "🎯 信号: 市场阶段=进攻 市场宽度=68.0% 基准趋势=向上 "
382- "目标股票仓位=100.0% 实际股票仓位=100.0% 入选标的数=4 "
383- "前排标的=MU(4.07), INTC(2.23), AMD(1.96)" ,
384- rendered .compact_text ,
385- )
377+ self .assertIn ("🧩 输入状态: 价格 2026-06-01 | 股票池 2026-05-14 | 状态 部分行情刷新" , rendered .detailed_text )
378+ self .assertNotIn ("🎯 信号:" , rendered .compact_text )
379+ self .assertIn ("📊 市场状态: 市场阶段=进攻" , rendered .detailed_text )
380+ self .assertNotIn ("🧩 输入状态" , rendered .compact_text )
381+ self .assertNotIn ("📊 市场状态" , rendered .compact_text )
386382 self .assertNotIn ("regime=risk_on" , rendered .compact_text )
387383 self .assertNotIn ("benchmark_trend=up" , rendered .compact_text )
388384 self .assertNotIn ("target_stock=" , rendered .compact_text )
389385 self .assertNotIn ("partial_history_refresh" , rendered .compact_text )
390386
387+ def test_dashboard_relabels_total_assets_for_margin_execution (self ):
388+ rendered = render_rebalance_notification (
389+ execution = {
390+ "dashboard_text" : " - 总资产(策略标的+现金,不含融资额度): $50,000.00\n - 可用现金: $75,000.00" ,
391+ "cash_only_execution" : False ,
392+ "signal_display" : "hold" ,
393+ "status_display" : "hold" ,
394+ },
395+ logs = (),
396+ skip_logs = (),
397+ note_logs = (),
398+ translator = build_translator ("zh" ),
399+ separator = "━━━━━━━━━━━━━━━━━━" ,
400+ strategy_display_name = "TQQQ 增长收益" ,
401+ dry_run_only = False ,
402+ )
403+
404+ self .assertIn ("总资产(策略净值): $50,000.00" , rendered .compact_text )
405+ self .assertIn ("购买力: $75,000.00" , rendered .compact_text )
406+ self .assertNotIn ("不含融资额度" , rendered .compact_text )
407+
391408 def test_dashboard_relabels_buying_power_for_cash_only_execution (self ):
392409 rendered = render_rebalance_notification (
393410 execution = {
0 commit comments