From 56e132656998ed3b559999f49887371162538949 Mon Sep 17 00:00:00 2001 From: hmo Date: Wed, 22 Jul 2026 20:49:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(rec):=20RR=E5=9F=BA=E5=87=86=E4=BB=B7?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E4=B9=B0=E5=85=A5=E5=8C=BA=E4=B8=AD=E5=80=BC?= =?UTF-8?q?=EF=BC=88=E8=80=81=E7=88=B8=E5=86=B3=E7=AD=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 区/损/盈三数同出一份分析, 自洽闭环; 不随价格波动; 脏区间自动算出RR=0现形 - 区间缺失才兜底现价 --- mofin_db.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/mofin_db.py b/mofin_db.py index cb0e11aa..1b0aad2b 100644 --- a/mofin_db.py +++ b/mofin_db.py @@ -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)