@@ -185,7 +185,7 @@ def format_small_account_whole_share_bootstrap_notes(
185185 "account_overview_title" : "📌 策略账户概览" ,
186186 "equity" : "净值" ,
187187 "total_assets" : "总资产(策略标的+现金)" ,
188- "buying_power" : "购买力 " ,
188+ "buying_power" : "可用现金 " ,
189189 "reserved_cash" : "预留现金" ,
190190 "investable_cash" : "可投资现金" ,
191191 "cash_label" : "现金" ,
@@ -332,10 +332,14 @@ def format_small_account_whole_share_bootstrap_notes(
332332 "strategy_name_ibit_smart_dca" : "IBIT 比特币 ETF 智能定投" ,
333333 "skip_reason_below_trade_threshold" : "低于调仓阈值" ,
334334 "skip_reason_quote_unavailable" : "无法获取报价" ,
335- "skip_reason_sell_quantity_zero" : "卖出股数为0" ,
336- "skip_reason_buy_quantity_zero" : "买入股数为0" ,
335+ "skip_reason_sell_quantity_zero" : "整数股不足 1 股,无需下单" ,
336+ "skip_reason_pending_sell_release" : "需先减仓但整数股卖单未成交,现金不足以对应买入,跳过以避免融资" ,
337+ "skip_reason_negative_cash" : "账户现金为负,跳过买入以避免额外融资" ,
338+ "skip_reason_buy_quantity_zero" : "整数股不足 1 股,无需下单" ,
337339 "skip_reason_insufficient_cash_for_whole_share" : "现金不足以买入一整股" ,
338340 "skip_reason_unknown" : "未知原因" ,
341+ "deferred_orders_line" : "ℹ️ [本轮跳过] {details}" ,
342+ "skip_symbols_reason" : "{symbols}({reason})" ,
339343 },
340344 "en" : {
341345 "rebalance_title" : "🔔 【Rebalance Instruction】" ,
@@ -347,7 +351,7 @@ def format_small_account_whole_share_bootstrap_notes(
347351 "account_overview_title" : "📌 Strategy Account" ,
348352 "equity" : "Equity" ,
349353 "total_assets" : "Total assets" ,
350- "buying_power" : "Buying power " ,
354+ "buying_power" : "Available cash " ,
351355 "reserved_cash" : "Reserved cash" ,
352356 "investable_cash" : "Investable cash" ,
353357 "cash_label" : "Cash" ,
@@ -494,10 +498,14 @@ def format_small_account_whole_share_bootstrap_notes(
494498 "strategy_name_ibit_smart_dca" : "IBIT Smart DCA" ,
495499 "skip_reason_below_trade_threshold" : "below trade threshold" ,
496500 "skip_reason_quote_unavailable" : "quote unavailable" ,
497- "skip_reason_sell_quantity_zero" : "sell quantity rounds to 0" ,
498- "skip_reason_buy_quantity_zero" : "buy quantity rounds to 0" ,
501+ "skip_reason_sell_quantity_zero" : "whole-share quantity rounds to 0; no order needed" ,
502+ "skip_reason_pending_sell_release" : "trim still pending but whole-share sell rounded to 0; buy skipped this cycle to avoid margin" ,
503+ "skip_reason_negative_cash" : "account cash is negative; buy skipped to avoid additional margin" ,
504+ "skip_reason_buy_quantity_zero" : "whole-share quantity rounds to 0; no order needed" ,
499505 "skip_reason_insufficient_cash_for_whole_share" : "insufficient cash for one whole share" ,
500506 "skip_reason_unknown" : "unknown reason" ,
507+ "deferred_orders_line" : "ℹ️ [Skipped this cycle] {details}" ,
508+ "skip_symbols_reason" : "{symbols} ({reason})" ,
501509 },
502510}
503511
@@ -705,9 +713,9 @@ def _format_generated_dashboard_lines(
705713 total_equity = _safe_float (portfolio .get ("total_equity" ))
706714 if total_equity is not None :
707715 lines .append (f" - { translator ('total_assets' )} : { _format_money (total_equity )} " )
708- buying_power = _safe_float (portfolio .get ("buying_power " ))
716+ buying_power = _safe_float (portfolio .get ("liquid_cash " ))
709717 if buying_power is None :
710- buying_power = _safe_float (portfolio .get ("liquid_cash " ))
718+ buying_power = _safe_float (portfolio .get ("buying_power " ))
711719 if buying_power is not None :
712720 lines .append (f" - { translator ('buying_power' )} : { _format_money (buying_power )} " )
713721 reserved_cash = _safe_float (execution .get ("reserved_cash" ))
@@ -1115,7 +1123,16 @@ def _format_skipped_reason(skipped: list[Mapping[str, Any]], *, translator: Call
11151123 grouped [reason ].append (symbol )
11161124 parts = []
11171125 for reason , symbols in grouped .items ():
1118- parts .append (f"{ reason } :{ ',' .join (symbols )} " if symbols else reason )
1126+ if symbols :
1127+ parts .append (
1128+ translator (
1129+ "skip_symbols_reason" ,
1130+ symbols = "," .join (symbols ),
1131+ reason = reason ,
1132+ )
1133+ )
1134+ else :
1135+ parts .append (reason )
11191136 return ", " .join (parts ) if parts else translator ("no_executable_orders" )
11201137
11211138
@@ -1185,6 +1202,18 @@ def render_cycle_summary(result: Mapping[str, Any], *, lang: str = "en") -> str:
11851202 if submitted :
11861203 lines .append (translator ("order_logs_title" ))
11871204 lines .extend (_format_order_lines (submitted , dry_run_only = dry_run_only , translator = translator ))
1205+ meaningful_skipped = [
1206+ item
1207+ for item in skipped
1208+ if str (item .get ("reason" ) or "" ) != "below_trade_threshold"
1209+ ]
1210+ if meaningful_skipped :
1211+ lines .append (
1212+ translator (
1213+ "deferred_orders_line" ,
1214+ details = _format_skipped_reason (meaningful_skipped , translator = translator ),
1215+ )
1216+ )
11881217 elif skipped and has_rebalance_attempt :
11891218 lines .append (translator ("order_logs_title" ))
11901219 reason = _format_skipped_reason (skipped , translator = translator )
0 commit comments