fix: 品种推荐改为最大手数并补算旧缓存。
- 最大手数 = floor(权益×保证金上限%÷1手保证金) - 加载与 SSE 推送时实时补算,旧缓存缺字段时自动刷新 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+60
-2
@@ -2,6 +2,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import math
|
||||
from datetime import datetime
|
||||
from typing import Callable, Optional
|
||||
|
||||
@@ -26,6 +27,50 @@ def filter_affordable_recommendations(rows: list[dict]) -> list[dict]:
|
||||
return [r for r in rows if r.get("status") in ("ok", "margin_ok")]
|
||||
|
||||
|
||||
def rows_missing_max_lots(rows: list[dict]) -> bool:
|
||||
"""缓存是否为旧版(缺少最大手数字段)。"""
|
||||
if not rows:
|
||||
return False
|
||||
return any("max_lots" not in r for r in rows)
|
||||
|
||||
|
||||
def enrich_recommend_rows(
|
||||
rows: list[dict],
|
||||
capital: float,
|
||||
*,
|
||||
max_margin_pct: float = 30.0,
|
||||
) -> list[dict]:
|
||||
"""用当前权益与保证金比例补算最大可开手数(兼容旧缓存)。"""
|
||||
cap = float(capital or 0)
|
||||
pct = max(1.0, min(100.0, float(max_margin_pct or 30.0)))
|
||||
budget = cap * pct / 100.0 if cap > 0 else 0.0
|
||||
enriched: list[dict] = []
|
||||
for raw in rows:
|
||||
row = dict(raw)
|
||||
try:
|
||||
margin_one = float(row.get("margin_one_lot") or 0)
|
||||
except (TypeError, ValueError):
|
||||
margin_one = 0.0
|
||||
if margin_one > 0 and budget > 0:
|
||||
lots = int(math.floor(budget / margin_one))
|
||||
else:
|
||||
try:
|
||||
lots = int(row.get("max_lots") or row.get("recommended_lots") or 0)
|
||||
except (TypeError, ValueError):
|
||||
lots = 0
|
||||
row["max_lots"] = lots
|
||||
row.pop("recommended_lots", None)
|
||||
row["margin_budget"] = round(budget, 2)
|
||||
row["max_margin_pct"] = pct
|
||||
status = row.get("status") or ""
|
||||
if lots >= 1 and status in ("ok", "margin_ok"):
|
||||
row["status_label"] = (
|
||||
f"最大 {lots} 手" if status == "ok" else f"最大 {lots} 手·止损偏宽"
|
||||
)
|
||||
enriched.append(row)
|
||||
return enriched
|
||||
|
||||
|
||||
def refresh_recommend_cache(
|
||||
conn,
|
||||
capital: float,
|
||||
@@ -85,8 +130,21 @@ def load_recommend_cache(conn) -> dict:
|
||||
}
|
||||
|
||||
|
||||
def recommend_payload(conn, *, live_capital: float) -> dict:
|
||||
def recommend_payload(
|
||||
conn,
|
||||
*,
|
||||
live_capital: float,
|
||||
max_margin_pct: float = 30.0,
|
||||
) -> dict:
|
||||
"""读取缓存并附带当前权益(展示用,可能与缓存计算时不同)。"""
|
||||
payload = load_recommend_cache(conn)
|
||||
payload["capital"] = float(live_capital or 0)
|
||||
cap = float(live_capital or 0)
|
||||
pct = max(1.0, min(100.0, float(max_margin_pct or 30.0)))
|
||||
payload["capital"] = cap
|
||||
payload["max_margin_pct"] = pct
|
||||
payload["rows"] = enrich_recommend_rows(
|
||||
payload.get("rows") or [],
|
||||
cap,
|
||||
max_margin_pct=pct,
|
||||
)
|
||||
return payload
|
||||
|
||||
Reference in New Issue
Block a user