fix(rec): RR基准价改用买入区中值(老爸决策)

- 区/损/盈三数同出一份分析, 自洽闭环; 不随价格波动; 脏区间自动算出RR=0现形
- 区间缺失才兜底现价
This commit is contained in:
hmo
2026-07-22 20:49:59 +08:00
parent 9bcf3e5e63
commit 56e1326569
+14 -12
View File
@@ -1145,26 +1145,28 @@ def reconcile_signal_from_analysis(conn, code: str) -> str:
def recompute_rr(conn, code: str) -> float:
"""现价+已存止损/止盈重算 RR 并写回 rr_ratio。
"""买入区中值+已存止损/止盈重算 RR 并写回 rr_ratio。
根治"LLM 不输出 RR → rr_ratio 永远 0"的断链(红线:RR 由系统算,不信 LLM)。
公式: RR = (止盈 - 基准价) / (基准价 - 止损);基准价=现价,兜底区间上沿。
公式: RR = (止盈 - 基准价) / (基准价 - 止损);基准价=买入区中值(与策略自洽、
不随价格波动、脏区间自动算出 RR=0 现形),区间缺失时兜底现价。
损/盈缺失或基准价<=止损 → RR=0(不达标,不参与排序)。"""
try:
row = conn.execute(
"SELECT entry_high, stop_loss, take_profit FROM holding_strategies WHERE code=? AND status='active'",
"SELECT entry_low, entry_high, stop_loss, take_profit FROM holding_strategies WHERE code=? AND status='active'",
(code,)).fetchone()
if not row:
return 0.0
eh, sl, tp = (row[0] or 0), (row[1] or 0), (row[2] or 0)
el, eh, sl, tp = (row[0] or 0), (row[1] or 0), (row[2] or 0), (row[3] or 0)
ref = 0.0
try:
pr = conn.execute("SELECT price FROM live_prices WHERE code=?", (code,)).fetchone()
if pr and (pr[0] or 0) > 0:
ref = float(pr[0])
except Exception:
pass
if ref <= 0:
ref = float(eh or 0)
if el > 0 and eh > el:
ref = (el + eh) / 2.0 # 买入区中值:策略自洽的期望入场价
else:
try:
pr = conn.execute("SELECT price FROM live_prices WHERE code=?", (code,)).fetchone()
if pr and (pr[0] or 0) > 0:
ref = float(pr[0])
except Exception:
pass
rr = 0.0
if sl > 0 and tp > 0 and ref > sl:
rr = round((tp - ref) / (ref - sl), 2)