diff --git a/mofin_db.py b/mofin_db.py index 5b9bd385..cb18f17c 100644 --- a/mofin_db.py +++ b/mofin_db.py @@ -1148,12 +1148,18 @@ def sync_recommend_tag(conn, code: str, timing_signal: str): """裸 SQL 调用方(batch_reassess / per_stock_reassess)的推荐 tag 同步。 动作级信号 → current_recommend;信号降级 → 清除 current_recommend; active_manual(人工标记)永不动。与 XMPP 动作级告警同源(红线#12)。""" - _ACTION_SIGNALS = ("买入", "可买入", "可加仓", "卖出", "止盈") try: _old_tag_row = conn.execute( "SELECT tag FROM holding_strategies WHERE code=? AND status='active'", (code,)).fetchone() _old_tag = (_old_tag_row[0] or '') if _old_tag_row else '' - if timing_signal in _ACTION_SIGNALS: + # 卖出/止盈 仅对持仓股算动作信号(没持仓卖什么) + _ACTION_BUY = ("买入", "可买入", "可加仓") + _ACTION_SELL = ("卖出", "止盈") + if timing_signal in _ACTION_SELL: + _h = conn.execute("SELECT shares FROM holdings WHERE code=? AND is_active=1", (code,)).fetchone() + if not (_h and (_h[0] or 0) > 0): + timing_signal = "" # 非持仓的卖出/止盈不算动作信号 + if timing_signal in _ACTION_BUY or timing_signal in _ACTION_SELL: conn.execute( "UPDATE holding_strategies SET tag='current_recommend' " "WHERE code=? AND status='active' AND (tag IS NULL OR tag != 'active_manual')", @@ -1161,7 +1167,8 @@ def sync_recommend_tag(conn, code: str, timing_signal: str): conn.commit() if _old_tag != 'current_recommend': enqueue_recommend(conn, code) # 新推荐 → 摘要队列(batch 结束统一发) - elif timing_signal: + elif _old_tag == 'current_recommend': + # 空信号或非动作信号 → 清除自动推荐(active_manual 不动) conn.execute( "UPDATE holding_strategies SET tag='' " "WHERE code=? AND status='active' AND tag='current_recommend'",