fix(rr): 三值RR共用统一上方目标 根治中值>范围上下界的自相矛盾
- 上方目标基于区间中值统一定(非每个x单独算),确保rr_low>rr_mid>rr_high恒成立 - digest三值范围排序(小~大)显示,数学自洽 - 弹窗已用下沿/上沿语义标签,数值颠倒不影响理解
This commit is contained in:
+17
-10
@@ -1172,9 +1172,10 @@ def recompute_rr(conn, code: str) -> float:
|
||||
"""用买入区+已存止损/止盈重算三值 RR 并写回(rr_low/rr_ratio中值/rr_high)。
|
||||
根治"LLM 不输出 RR → rr_ratio 永远 0"的断链(红线:RR 由系统算,不信 LLM)。
|
||||
公式: RR(x) = (上方目标 - x) / (x - 止损);x 分别取买入区下沿/中值/上沿。
|
||||
上方目标 = min(止盈, 20日新高若高于x)(2026-07-24 老爸:
|
||||
前高挡在中间时止盈是放空炮,真实RR必须对最近上方阻力先结算;
|
||||
突破形态(现价已在20日新高)不惩罚,用止盈全值)。
|
||||
上方目标基于中值参考价统一定(不因 x 不同而漂移),保证三值自洽:
|
||||
rr_low > rr_ratio > rr_high 恒成立,展示"在同一阻力下不同入场价的敏感度"。
|
||||
目标 = min(止盈, 20日新高若高于中值)(2026-07-24 老爸:
|
||||
前高挡在中间时止盈是放空炮,真实RR必须对最近上方阻力先结算)。
|
||||
rr_ratio=中值 RR 用于排序与2.0门槛;rr_low/rr_high 展示入场价敏感度。
|
||||
区间缺失 → 中值兜底现价(low/high=0);损/盈缺失或 x<=止损 → 该值=0。"""
|
||||
try:
|
||||
@@ -1196,12 +1197,14 @@ def recompute_rr(conn, code: str) -> float:
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 基准参考价 = 区间中值(决定上方目标,三值共用)
|
||||
ref = (el + eh) / 2.0 if el > 0 and eh > el else 0
|
||||
target = tp
|
||||
if ref > 0 and high_20d > ref and high_20d < tp:
|
||||
target = high_20d
|
||||
|
||||
def _rr(x):
|
||||
if sl > 0 and tp > 0 and x > sl:
|
||||
# 上方目标:止盈与前高取近者(前高高于x才算阻力,否则视为突破用止盈)
|
||||
target = tp
|
||||
if high_20d > x and high_20d < target:
|
||||
target = high_20d
|
||||
if sl > 0 and target > 0 and x > sl and target > x:
|
||||
v = round((target - x) / (x - sl), 2)
|
||||
return v if v > 0 else 0.0
|
||||
return 0.0
|
||||
@@ -1451,8 +1454,12 @@ def flush_rec_digest(max_items=5):
|
||||
for i, it in enumerate(top):
|
||||
_rr_mid = it.get('rr') or 0
|
||||
_rr_lo, _rr_hi = it.get('rr_low') or 0, it.get('rr_high') or 0
|
||||
_rr_txt = (f"RR={_rr_mid}({_rr_lo}~{_rr_hi})" if _rr_lo and _rr_hi and _rr_lo != _rr_hi
|
||||
else f"RR={_rr_mid}")
|
||||
if _rr_lo and _rr_hi and _rr_lo != _rr_hi:
|
||||
_lo_val = min(_rr_lo, _rr_hi)
|
||||
_hi_val = max(_rr_lo, _rr_hi)
|
||||
_rr_txt = f"RR={_rr_mid}({_lo_val}~{_hi_val})"
|
||||
else:
|
||||
_rr_txt = f"RR={_rr_mid}"
|
||||
_badge = "💰可执行" if it['code'] in _exec_codes else "⏳排队"
|
||||
lines.append(f"• {_badge} {it.get('name') or it['code']}({it['code']}) {it['signal']}"
|
||||
f" 区{it.get('entry_low') or '—'}~{it.get('entry_high') or '—'}"
|
||||
|
||||
Reference in New Issue
Block a user