Skip to content

Commit 9eef678

Browse files
Pigbibiclaude
andcommitted
feat: resolve strategy display name from catalog metadata
Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 2166990 commit 9eef678

3 files changed

Lines changed: 49 additions & 4 deletions

File tree

application/rebalance_service.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ def log_message(message: str) -> None:
640640
"account": account,
641641
"strategy_profile": strategy_runtime.profile,
642642
"strategy_display_name": strategy_runtime.display_name,
643+
"strategy_metadata": getattr(settings, "strategy_metadata", None),
643644
"dry_run_only": settings.dry_run_only,
644645
"live_trading_enabled": settings.live_trading_enabled,
645646
"session_reused": bool(getattr(client, "session_reused", False)),

notifications/telegram.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,36 @@ def translate(key: str, **kwargs) -> str:
539539
return translate
540540

541541

542+
def build_strategy_display_name(lang: str, translate_fn):
543+
"""Build a strategy display name resolver consistent with other platforms.
544+
545+
Returns a callable that resolves a strategy's display name using catalog
546+
metadata (if available) or the legacy i18n dictionary fallback.
547+
"""
548+
def strategy_display_name(
549+
profile: str,
550+
*,
551+
fallback_name: str | None = None,
552+
metadata=None,
553+
) -> str:
554+
if metadata is not None:
555+
from quant_platform_kit.common.notification_localization import (
556+
resolve_strategy_display_name,
557+
)
558+
return resolve_strategy_display_name(
559+
lang, metadata, translator=translate_fn,
560+
)
561+
key = f"strategy_name_{str(profile or '').strip()}"
562+
translated = translate_fn(key)
563+
if translated != key:
564+
return translated
565+
fallback = str(fallback_name or "").strip()
566+
if fallback:
567+
return fallback
568+
return str(profile or "").strip()
569+
return strategy_display_name
570+
571+
542572
def build_sender(token: str | None, chat_id: str | None, *, requests_module=None):
543573
if requests_module is None:
544574
import requests as requests_module
@@ -1158,9 +1188,18 @@ def render_cycle_summary(result: Mapping[str, Any], *, lang: str = "en") -> str:
11581188
has_rebalance_attempt = bool(submitted or target_diff_lines or has_meaningful_skip)
11591189
strategy_profile = str(result.get("strategy_profile") or "").strip()
11601190
strategy_name = str(result.get("strategy_display_name") or strategy_profile).strip()
1161-
translated_strategy_name = translator(f"strategy_name_{strategy_profile}") if strategy_profile else ""
1162-
if translated_strategy_name and translated_strategy_name != f"strategy_name_{strategy_profile}":
1163-
strategy_name = translated_strategy_name
1191+
strategy_metadata = result.get("strategy_metadata")
1192+
if strategy_metadata is not None:
1193+
from quant_platform_kit.common.notification_localization import (
1194+
resolve_strategy_display_name,
1195+
)
1196+
strategy_name = resolve_strategy_display_name(
1197+
lang, strategy_metadata, translator=translator,
1198+
)
1199+
else:
1200+
translated_strategy_name = translator(f"strategy_name_{strategy_profile}") if strategy_profile else ""
1201+
if translated_strategy_name and translated_strategy_name != f"strategy_name_{strategy_profile}":
1202+
strategy_name = translated_strategy_name
11641203
account = str(result.get("account") or "").strip()
11651204
lines = [translator("rebalance_title" if has_rebalance_attempt else "heartbeat_title")]
11661205
if strategy_name:

runtime_config_support.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import os
55
from dataclasses import dataclass
66
from pathlib import Path
7-
from typing import Callable
7+
from typing import TYPE_CHECKING, Callable
8+
9+
if TYPE_CHECKING:
10+
from quant_platform_kit.common.strategies import StrategyMetadata
811

912
from quant_platform_kit.common.runtime_config import (
1013
resolve_bool_value,
@@ -59,6 +62,7 @@ class PlatformRuntimeSettings:
5962
run_strategy_on_http: bool
6063
live_order_ack: bool
6164
max_order_notional_usd: float | None
65+
strategy_metadata: Any = None
6266
runtime_target_enabled: bool = True
6367
cash_only_execution: bool = True
6468
reserved_cash_floor_usd: float = DEFAULT_RESERVED_CASH_FLOOR_USD
@@ -173,6 +177,7 @@ def load_platform_runtime_settings(
173177
strategy_profile=runtime_paths.strategy_profile,
174178
strategy_display_name=runtime_paths.strategy_display_name,
175179
strategy_domain=runtime_paths.strategy_domain,
180+
strategy_metadata=strategy_metadata,
176181
notify_lang=os.getenv("NOTIFY_LANG", "en"),
177182
tg_token=_get_credential("firstrade-telegram-token", "TELEGRAM_TOKEN"),
178183
tg_chat_id=os.getenv("GLOBAL_TELEGRAM_CHAT_ID"),

0 commit comments

Comments
 (0)