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)