Skip to content

Commit cf30848

Browse files
committed
Improve strategy plugin alert copy
1 parent 532346b commit cf30848

3 files changed

Lines changed: 71 additions & 29 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "quant-platform-kit"
7-
version = "0.7.26"
7+
version = "0.7.27"
88
description = "Shared broker adapters, domain models, execution ports, and notification utilities for QuantStrategyLab strategies."
99
readme = "README.md"
1010
requires-python = ">=3.9"

src/quant_platform_kit/common/strategy_plugins.py

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -475,9 +475,18 @@ def build_strategy_plugin_alert_messages(
475475
route = getattr(signal, "canonical_route", None) or "unknown_route"
476476
action = getattr(signal, "suggested_action", None) or "unknown_action"
477477
plugin = translate_strategy_plugin_value("name", getattr(signal, "plugin", None), translator=translator)
478+
translated_mode = translate_strategy_plugin_value(
479+
"mode",
480+
getattr(signal, "effective_mode", None),
481+
translator=translator,
482+
)
478483
translated_route = translate_strategy_plugin_value("route", route, translator=translator)
479484
translated_action = translate_strategy_plugin_value("action", action, translator=translator)
480485
strategy = str(strategy_label or getattr(signal, "strategy", None) or "").strip() or "unknown"
486+
would_trade = _translate_bool(
487+
translator,
488+
bool(getattr(signal, "would_trade_if_enabled", False)),
489+
)
481490
subject = _translate(
482491
translator,
483492
"strategy_plugin_alert_subject",
@@ -490,6 +499,7 @@ def build_strategy_plugin_alert_messages(
490499
subject = f"[{context}] {subject}"
491500
body_lines = [
492501
_translate(translator, "strategy_plugin_alert_title", fallback="Strategy Plugin Alert"),
502+
"",
493503
]
494504
if context:
495505
body_lines.append(
@@ -502,33 +512,48 @@ def build_strategy_plugin_alert_messages(
502512
)
503513
body_lines.extend(
504514
[
505-
_translate(
506-
translator,
507-
"strategy_plugin_line",
508-
fallback="Plugin: {plugin} | status: {route} | notice: {action}",
509-
plugin=plugin,
510-
mode=translate_strategy_plugin_value("mode", getattr(signal, "effective_mode", None), translator=translator),
511-
route=translated_route,
512-
action=translated_action,
513-
),
514-
_translate(
515-
translator,
516-
"strategy_plugin_alert_strategy",
517-
fallback="Strategy: {strategy}",
518-
strategy=strategy,
519-
),
520-
_translate(
521-
translator,
522-
"strategy_plugin_alert_as_of",
523-
fallback="Signal as-of: {as_of}",
524-
as_of=getattr(signal, "as_of", None) or "unknown",
525-
),
526-
_translate(
527-
translator,
528-
"strategy_plugin_alert_would_trade",
529-
fallback="Would trade if enabled: {value}",
530-
value=str(bool(getattr(signal, "would_trade_if_enabled", False))).lower(),
531-
),
515+
_translate(
516+
translator,
517+
"strategy_plugin_alert_strategy",
518+
fallback="Strategy: {strategy}",
519+
strategy=strategy,
520+
),
521+
_translate(
522+
translator,
523+
"strategy_plugin_alert_plugin",
524+
fallback="Plugin: {plugin}",
525+
plugin=plugin,
526+
),
527+
_translate(
528+
translator,
529+
"strategy_plugin_alert_status",
530+
fallback="Status: {route}",
531+
route=translated_route,
532+
),
533+
_translate(
534+
translator,
535+
"strategy_plugin_alert_action",
536+
fallback="Notice: {action}",
537+
action=translated_action,
538+
),
539+
_translate(
540+
translator,
541+
"strategy_plugin_alert_mode",
542+
fallback="Mode: {mode}",
543+
mode=translated_mode,
544+
),
545+
_translate(
546+
translator,
547+
"strategy_plugin_alert_as_of",
548+
fallback="Signal as-of: {as_of}",
549+
as_of=getattr(signal, "as_of", None) or "unknown",
550+
),
551+
_translate(
552+
translator,
553+
"strategy_plugin_alert_would_trade",
554+
fallback="Would trade if enabled: {value}",
555+
value=would_trade,
556+
),
532557
]
533558
)
534559
source = getattr(signal, "source_uri", None) or getattr(signal, "local_path", None)
@@ -661,6 +686,14 @@ def _translate(
661686
return translated if translated != key else fallback.format(**kwargs)
662687

663688

689+
def _translate_bool(translator: Callable[..., str] | None, value: bool) -> str:
690+
return _translate(
691+
translator,
692+
"strategy_plugin_alert_yes" if value else "strategy_plugin_alert_no",
693+
fallback="yes" if value else "no",
694+
)
695+
696+
664697
def _required_string(value: Any, *, field_name: str) -> str:
665698
text = _optional_string(value)
666699
if text is None:

tests/test_strategy_plugins.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,14 @@ def test_strategy_plugin_true_crisis_builds_generic_alert_message(self):
274274
"strategy_plugin_alert_title": "alert title",
275275
"strategy_plugin_line": "plugin={plugin}|mode={mode}|route={route}|action={action}",
276276
"strategy_plugin_alert_strategy": "strategy={strategy}",
277+
"strategy_plugin_alert_plugin": "plugin={plugin}",
278+
"strategy_plugin_alert_status": "status={route}",
279+
"strategy_plugin_alert_action": "action={action}",
280+
"strategy_plugin_alert_mode": "mode={mode}",
277281
"strategy_plugin_alert_as_of": "as_of={as_of}",
278282
"strategy_plugin_alert_would_trade": "would_trade={value}",
279283
"strategy_plugin_alert_source": "source={source}",
284+
"strategy_plugin_alert_yes": "yes",
280285
"strategy_plugin_name_crisis_response_shadow": "Crisis",
281286
"strategy_plugin_mode_shadow": "shadow",
282287
"strategy_plugin_route_true_crisis": "true crisis",
@@ -294,7 +299,11 @@ def test_strategy_plugin_true_crisis_builds_generic_alert_message(self):
294299
self.assertEqual(len(alerts), 1)
295300
self.assertEqual(alerts[0].subject, "alert:TQQQ Growth Income:Crisis:true crisis")
296301
self.assertIn("strategy_plugin_alert", alerts[0].alert_key)
297-
self.assertIn("plugin=Crisis|mode=shadow|route=true crisis|action=defend", alerts[0].body)
302+
self.assertIn("plugin=Crisis", alerts[0].body)
303+
self.assertIn("status=true crisis", alerts[0].body)
304+
self.assertIn("action=defend", alerts[0].body)
305+
self.assertIn("mode=shadow", alerts[0].body)
306+
self.assertIn("would_trade=yes", alerts[0].body)
298307
self.assertIn("source=gs://bucket/latest_signal.json", alerts[0].body)
299308

300309

0 commit comments

Comments
 (0)