refactor(selection): 统一信号与股票处理逻辑,重构相关数据结构与接口,更新前端展示以支持股票信息
This commit is contained in:
@@ -91,7 +91,7 @@ class FakeSelectionService:
|
||||
|
||||
|
||||
def _run(run_id: str, status: str) -> SelectionRun:
|
||||
signal = SelectionSignal(
|
||||
original_signal = SelectionSignal(
|
||||
ts_code="000001.SZ",
|
||||
name="平安银行",
|
||||
target_trade_date=TARGET,
|
||||
@@ -100,6 +100,15 @@ def _run(run_id: str, status: str) -> SelectionRun:
|
||||
close=10.5,
|
||||
details={"j": 12.0},
|
||||
)
|
||||
pullback_signal = SelectionSignal(
|
||||
ts_code="000001.SZ",
|
||||
name="平安银行",
|
||||
target_trade_date=TARGET,
|
||||
strategy="zhixing_b1",
|
||||
category=ZhixingB1Category.PULLBACK_WHITE,
|
||||
close=10.5,
|
||||
details={"j": 13.0, "rsi": 20.0},
|
||||
)
|
||||
from zhixing_server.modules.selection.domain.runs import SelectionRunItem
|
||||
|
||||
return SelectionRun(
|
||||
@@ -112,7 +121,7 @@ def _run(run_id: str, status: str) -> SelectionRun:
|
||||
eligible_count=1,
|
||||
evaluated_count=1,
|
||||
selected_stock_count=1,
|
||||
signal_count=1,
|
||||
signal_count=2,
|
||||
failed_count=0,
|
||||
coverage=Decimal("1"),
|
||||
items=(
|
||||
@@ -120,11 +129,12 @@ def _run(run_id: str, status: str) -> SelectionRun:
|
||||
ts_code="000001.SZ",
|
||||
name="平安银行",
|
||||
status="selected",
|
||||
signal_count=1,
|
||||
signals=(signal,),
|
||||
signal_count=2,
|
||||
signals=(original_signal, pullback_signal),
|
||||
),
|
||||
),
|
||||
signals=(signal,),
|
||||
signals=(original_signal, pullback_signal),
|
||||
stocks_total=1,
|
||||
)
|
||||
|
||||
|
||||
@@ -209,7 +219,7 @@ def test_query_returns_no_data_without_fabricating_a_result() -> None:
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json()["status"] == "no_data"
|
||||
assert response.json()["signals"] == []
|
||||
assert response.json()["stocks"] == []
|
||||
|
||||
|
||||
def test_query_returns_persisted_signal_details() -> None:
|
||||
@@ -220,12 +230,22 @@ def test_query_returns_persisted_signal_details() -> None:
|
||||
assert response.status_code == 200
|
||||
body = response.json()
|
||||
assert body["run_id"] == "run-http"
|
||||
assert body["signal_count"] == 1
|
||||
assert body["signal_count"] == 2
|
||||
assert body["page"] == 1
|
||||
assert body["page_size"] == 10
|
||||
assert body["signals_total"] == 1
|
||||
assert body["signals"][0]["category"] == "zhixing_b1_original_b1"
|
||||
assert body["signals"][0]["details"] == {"j": 12.0}
|
||||
assert body["stocks_total"] == 1
|
||||
assert "signals_total" not in body
|
||||
assert "signals" not in body
|
||||
assert len(body["stocks"]) == 1
|
||||
assert body["stocks"][0]["ts_code"] == "000001.SZ"
|
||||
assert [signal["category"] for signal in body["stocks"][0]["signals"]] == [
|
||||
"zhixing_b1_original_b1",
|
||||
"zhixing_b1_pullback_white",
|
||||
]
|
||||
assert [signal["details"] for signal in body["stocks"][0]["signals"]] == [
|
||||
{"j": 12.0},
|
||||
{"j": 13.0, "rsi": 20.0},
|
||||
]
|
||||
|
||||
|
||||
def test_query_forwards_pagination_and_filters() -> None:
|
||||
@@ -269,4 +289,4 @@ def test_run_polling_returns_the_persisted_terminal_result() -> None:
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json()["status"] == "success"
|
||||
assert response.json()["signals"][0]["category"] == "zhixing_b1_original_b1"
|
||||
assert response.json()["stocks"][0]["signals"][0]["category"] == ("zhixing_b1_original_b1")
|
||||
|
||||
Reference in New Issue
Block a user