Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions notifications/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,23 @@ def _localize_notification_text(text, *, translator):
return _base_localize_notification_text(text, translator=translator)


def _localize_timing_contract(contract: str, *, translator) -> str:
value = str(contract or "").strip()
if not value:
return ""
if value == "same_trading_day":
return "当日执行" if _translator_uses_zh(translator) else "same trading day"
if value == "next_trading_day":
return "次一交易日执行" if _translator_uses_zh(translator) else "next trading day"
match = re.fullmatch(r"next_(\d+)_trading_days", value)
if match:
count = int(match.group(1))
if _translator_uses_zh(translator):
return f"{count}个交易日后执行"
return f"next {count} trading days"
return _localize_notification_text(value, translator=translator)


def _split_detail_segment(text):
value = str(text or "").strip()
if not value:
Expand Down Expand Up @@ -55,12 +72,13 @@ def _build_timing_audit_lines(execution, *, translator):
if not signal_date and not effective_date and not contract:
return []
label = "⏱ 执行时点" if _translator_uses_zh(translator) else "⏱ Timing"
localized_contract = _localize_timing_contract(contract, translator=translator)
if signal_date and effective_date:
value = f"{signal_date} -> {effective_date}"
else:
value = signal_date or effective_date or contract
if contract and contract not in value:
value = f"{value} ({contract})" if value else contract
value = signal_date or effective_date or localized_contract
if localized_contract and localized_contract not in value:
value = f"{value} ({localized_contract})" if value else localized_contract
return [f"{label}: {value}"]


Expand Down
6 changes: 6 additions & 0 deletions notifications/telegram.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
"signal": "🎯 触发信号: {msg}",
"heartbeat_title": "💓 【心跳检测】",
"equity": "💰 净值: ${value}",
"buying_power": "购买力",
"reserved_cash": "预留现金",
"investable_cash": "可投资现金",
"cash_summary": "💵 资金\n - 账户现金: ${available}\n - 可投资现金: ${investable}",
"cash_label": "现金",
"order_logs_title": "🧾 执行明细",
Expand Down Expand Up @@ -113,6 +116,9 @@
"signal": "🎯 Signal: {msg}",
"heartbeat_title": "💓 【Heartbeat】",
"equity": "💰 Equity: ${value}",
"buying_power": "Buying Power",
"reserved_cash": "Reserved Cash",
"investable_cash": "Investable Cash",
"cash_summary": "💵 Cash\n - Account cash: ${available}\n - Investable cash: ${investable}",
"cash_label": "Cash",
"order_logs_title": "🧾 Execution details",
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
flask
gunicorn
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@c24d4c52e84c8c696006532590b15e9be92c8d89
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@a56c2adcb04beaf5f3dffb3a7e564497f97d0df1
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fcffc7e3901089ddc10e161d4e5703417c0a03d3
pandas
requests
pytz
Expand Down
4 changes: 2 additions & 2 deletions tests/test_rebalance_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ def test_sell_then_buy_skip_is_sent_in_single_summary_message(self):
self.assertEqual(len(sent_messages), 1)
self.assertIn("🔔 【调仓指令】", sent_messages[0])
self.assertIn("🧭 策略: SOXL/SOXX 半导体趋势收益", sent_messages[0])
self.assertIn("⏱ 执行时点: 2026-04-21 -> 2026-04-22 (next_trading_day)", sent_messages[0])
self.assertIn("⏱ 执行时点: 2026-04-21 -> 2026-04-22 (次一交易日执行)", sent_messages[0])
self.assertIn("限价卖出", sent_messages[0])
self.assertIn("买入说明", sent_messages[0])
self.assertIn("SOXX.US", sent_messages[0])
Expand Down Expand Up @@ -537,7 +537,7 @@ def test_buy_skip_without_orders_is_sent_in_single_heartbeat_message(self):

self.assertEqual(len(sent_messages), 1)
self.assertIn("💓 【心跳检测】", sent_messages[0])
self.assertIn("⏱ 执行时点: 2026-04-21 -> 2026-04-22 (next_trading_day)", sent_messages[0])
self.assertIn("⏱ 执行时点: 2026-04-21 -> 2026-04-22 (次一交易日执行)", sent_messages[0])
self.assertIn("本轮没有可执行订单", sent_messages[0])
self.assertIn("说明", sent_messages[0])
self.assertIn("可投资现金", sent_messages[0])
Expand Down