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
4 changes: 4 additions & 0 deletions application/runtime_strategy_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import pandas as pd
from quant_platform_kit.common.strategy_plugins import (
build_strategy_plugin_alert_messages,
build_strategy_plugin_error_notification_lines,
build_strategy_plugin_notification_lines,
should_alert_strategy_plugin_signal,
translate_strategy_plugin_value,
Expand Down Expand Up @@ -163,6 +164,9 @@ def translate_strategy_plugin_value(self, category: str, raw_value: str | None)
def build_strategy_plugin_notification_lines(self, signals) -> tuple[str, ...]:
return build_strategy_plugin_notification_lines(signals, translator=self.translator)

def build_strategy_plugin_error_notification_lines(self, error) -> tuple[str, ...]:
return build_strategy_plugin_error_notification_lines(error, translator=self.translator)

def should_alert_strategy_plugin_signal(self, signal) -> bool:
return should_alert_strategy_plugin_signal(signal)

Expand Down
18 changes: 16 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,10 @@ def build_strategy_plugin_notification_lines(signals) -> tuple[str, ...]:
return build_strategy_adapters().build_strategy_plugin_notification_lines(signals)


def build_strategy_plugin_error_notification_lines(error) -> tuple[str, ...]:
return build_strategy_adapters().build_strategy_plugin_error_notification_lines(error)


def build_strategy_plugin_alert_messages(signals):
return build_strategy_adapters().build_strategy_plugin_alert_messages(signals)

Expand Down Expand Up @@ -817,7 +821,11 @@ def build_account_notification_lines() -> tuple[str, ...]:
return (t("account_ids_detail", account_ids=", ".join(account_ids)),)


def build_extra_notification_lines(strategy_plugin_signals=()) -> tuple[str, ...]:
def build_extra_notification_lines(
strategy_plugin_signals=(),
*,
strategy_plugin_error: str | None = None,
) -> tuple[str, ...]:
return (
t(
"market_scope_detail",
Expand All @@ -828,6 +836,7 @@ def build_extra_notification_lines(strategy_plugin_signals=()) -> tuple[str, ...
),
*build_account_notification_lines(),
*build_strategy_plugin_notification_lines(strategy_plugin_signals),
*build_strategy_plugin_error_notification_lines(strategy_plugin_error),
)


Expand Down Expand Up @@ -888,6 +897,7 @@ def run_paper_liquidation_cycle():
def run_strategy_core(
*,
strategy_plugin_signals=(),
strategy_plugin_error: str | None = None,
dry_run_only_override: bool | None = None,
notification_delivery_events: list[dict] | None = None,
):
Expand All @@ -911,7 +921,10 @@ def run_strategy_core(
return run_rebalance_cycle(
runtime=rebalance_runtime,
config=composer.build_rebalance_config(
extra_notification_lines=build_extra_notification_lines(strategy_plugin_signals),
extra_notification_lines=build_extra_notification_lines(
strategy_plugin_signals,
strategy_plugin_error=strategy_plugin_error,
),
),
)

Expand Down Expand Up @@ -984,6 +997,7 @@ def _handle_request(*, dry_run_only_override: bool | None = None, response_body:
cycle_result = coerce_strategy_cycle_result(
run_strategy_core(
strategy_plugin_signals=strategy_plugin_signals,
strategy_plugin_error=strategy_plugin_error,
dry_run_only_override=dry_run_only_override,
notification_delivery_events=notification_delivery_events,
)
Expand Down
6 changes: 3 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
flask
gunicorn
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@2a711adf60b585ca02932bab9ee1bac7ce1df7c6
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fdd39ef0313181bee9083319b87b7175c32b364d
hk-equity-strategies @ git+https://github.com/QuantStrategyLab/HkEquityStrategies.git@02af62bc7af7b8ffdbe8575421434e455ab00d66
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@1a31ddde0dde0f2ad423e841a84af3ba0869e612
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@0ad01faaa2741195d06ecf8dae6a0f3fda712080
hk-equity-strategies @ git+https://github.com/QuantStrategyLab/HkEquityStrategies.git@1c50d2fcedc41b36d387366d0a9209ee759f0308
pandas
numpy
requests
Expand Down
10 changes: 10 additions & 0 deletions tests/test_request_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,16 @@ def test_build_extra_notification_lines_includes_account_id(strategy_module):
assert all("plugin-line" not in line for line in lines)


def test_build_extra_notification_lines_includes_plugin_error(strategy_module_factory):
strategy_module = strategy_module_factory(NOTIFY_LANG="zh")
lines = strategy_module.build_extra_notification_lines(
(),
strategy_plugin_error="ValueError: bad config",
)
assert any("插件信号未加载" in line for line in lines)
assert any("插件配置校验失败" in line for line in lines)


def test_handle_request_skips_overlapping_post(strategy_module, monkeypatch):
observed = {}

Expand Down
3 changes: 3 additions & 0 deletions tests/test_runtime_strategy_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,6 @@ def test_strategy_plugin_load_error_is_non_blocking():
assert signals == ()
assert error == "ValueError: bad config"
assert report["diagnostics"]["strategy_plugin_error"] == "ValueError: bad config"
assert adapters.build_strategy_plugin_error_notification_lines(error) == (
"Plugin signal failed to load: ValueError: bad config; this run falls back to built-in strategy rules",
)