diff --git a/deploy/profile-scripts/price_monitor.py b/deploy/profile-scripts/price_monitor.py index 760ba2cc..158b01fa 100644 --- a/deploy/profile-scripts/price_monitor.py +++ b/deploy/profile-scripts/price_monitor.py @@ -512,6 +512,33 @@ def run_once(round_label=""): if code not in state: state[code] = {} + # ── v_combo波段出场检测(exit_mode=swing的持仓,2026-07-29落地)── + if d.get("exit_mode", "swing") == "swing" and (d.get("shares") or 0) > 0: + try: + import sqlite3 as _sq + _c2 = _sq.connect("/home/hmo/MoFin/data/mofin.db") + _ma = _c2.execute("SELECT close, high, ma10 FROM stock_daily WHERE code=? ORDER BY date DESC LIMIT 4", (code,)).fetchall() + _c2.close() + if len(_ma) >= 3: + _closes = [r[0] for r in _ma] + _highs = [r[1] for r in _ma] + _ma10s = [r[2] for r in _ma if r[2]] + if _ma10s: + _ma10 = _ma10s[0] + # 连续2日收破MA10 → 波段出场 + below = sum(1 for c in _closes[:2] if c < _ma10) + if below >= 2 and price < _ma10 and _can_push(code, "swing_out"): + outputs.append(f"📉 {name}({code}) {price} 连续破MA10({_ma10:.2f}) → 波段先出(可减仓)") + record_event(code, name, "swing_out", price, str(_ma10)) + _push_action("波段出场", f"📉 {name}({code}) {price} 连续2日破MA10({_ma10:.2f}) → 波段先出,建议减仓;收回MA10且创新高再进") + # 收回MA10且突破前一日高点 → 波段再进 + elif price > _ma10 and len(_highs) >= 2 and _highs[0] > _highs[1] and _can_push(code, "swing_re"): + outputs.append(f"📈 {name}({code}) {price} 收回MA10({_ma10:.2f})且突破前高 → 波段再进") + record_event(code, name, "swing_re", price, str(_ma10)) + _push_action("波段再进", f"📈 {name}({code}) {price} 收回MA10({_ma10:.2f})且突破前一日高点 → 波段再进,可接回") + except Exception as _e: + pass + # 时间预算检查:如果超时,跳过重评只做状态记录 _budget_low = (time.time() - start) > TIME_BUDGET