From 281922ac1777f5f9066a3561569d52a772939141 Mon Sep 17 00:00:00 2001 From: xxm Date: Tue, 25 Aug 2026 10:17:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20promote=E6=8E=A8=E9=80=81=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E2=80=94=E2=80=94=E5=8F=AA=E6=8E=A8=E6=9C=89=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=BB=BA=E8=AE=AE=E4=BF=A1=E5=8F=B7=E7=9A=84(?= =?UTF-8?q?=E4=B9=B0=E5=85=A5/=E5=8F=AF=E4=B9=B0=E5=85=A5/=E5=8F=AF?= =?UTF-8?q?=E5=8A=A0=E4=BB=93,=E8=B5=B0push=5Frecommend=5Falert=E6=A0=87?= =?UTF-8?q?=E5=87=86=E9=80=9A=E9=81=93:=E9=97=A8=E7=A6=81+12=E7=BB=B4?= =?UTF-8?q?=E5=85=A8=E6=96=87+=E5=8D=95=E5=8F=AA=E5=8D=95=E6=9D=A1),?= =?UTF-8?q?=E8=A7=82=E6=9C=9B/=E5=85=B3=E6=B3=A8=E6=8F=90=E6=8B=94?= =?UTF-8?q?=E4=B8=8D=E8=BF=9BXMPP=E5=8F=AA=E5=BD=92=E6=A1=A3broadcast(?= =?UTF-8?q?=E8=80=81=E8=8E=AB:=E5=A4=9A=E7=A5=A8=E5=A0=86=E9=95=BF?= =?UTF-8?q?=E6=96=87=E6=88=AA=E6=96=AD=E4=B8=8D=E8=A1=8C+=E6=97=A0?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=BB=BA=E8=AE=AE=E4=B8=8D=E8=A6=81=E5=8F=91?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/promote_candidates.py | 31 ++++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/deploy/profile-scripts/promote_candidates.py b/deploy/profile-scripts/promote_candidates.py index b2e63d51..9e5ebfb7 100644 --- a/deploy/profile-scripts/promote_candidates.py +++ b/deploy/profile-scripts/promote_candidates.py @@ -284,32 +284,25 @@ def main(): conn.commit() print(f"\n[PROMOTE] 本次处理{processed}个,提拔{promoted}只(剩余留待下批)", flush=True) - # 推XMPP(老莫:进自选必须附完整 12 维重评全文) + # 推XMPP(2026-08-25 老莫新规则:①多票堆一条长文截断不行→每只单独一条 + # ②无操作建议(观望/关注)不推XMPP只归档broadcast) if promoted > 0: try: - import urllib.request codes = ",".join("?" * len(newly_promoted_codes)) promoted_rows = conn.execute( - f"SELECT code, name, strategy_name, rr_ratio, full_analysis " + f"SELECT code, name, timing_signal " f"FROM holding_strategies WHERE status='active' AND code IN ({codes})", tuple(newly_promoted_codes) ).fetchall() if newly_promoted_codes else [] - body = f"🤖 候选自动提拔: {promoted}只新入自选(评分降序优中选优,每批≤{MAX_NEW_PER_RUN})\n" - for i, (code, name, strat, rr, fa) in enumerate(promoted_rows, 1): - nm = name or code - body += f"\n━━━ [{i}] {code} {nm} ━━━\n" - body += f"策略: {strat or 'unknown'} | RR: {rr or 'N/A'}\n" - if fa and len(str(fa)) > 50: - body += f"【12维重评】\n{fa}\n" - else: - body += "(重评报告生成中/未就绪,稍后补推)\n" - if len(body) > 6000: - body = body[:6000] + "\n…(内容过长已截断)" - req = urllib.request.Request("http://127.0.0.1:5805/", - data=json.dumps({"to": "hmo@yoin.fun", "body": body, "type": "chat"}).encode(), - headers={"Content-Type": "application/json"}) - urllib.request.urlopen(req, timeout=10) - print(f"[PROMOTE] XMPP 通知已发送({promoted}只含完整重评)", flush=True) + _ACTION_SIG = ("买入", "可买入", "可加仓") # 有操作建议的信号 + pushed = 0 + for code, name, tsig in promoted_rows: + if any(s in str(tsig or "") for s in _ACTION_SIG): + # 有操作建议:走标准推荐通道(质量门禁+12维完整分析,单只单条不堆叠) + from mofin_db import push_recommend_alert + if push_recommend_alert(conn, code): + pushed += 1 + print(f"[PROMOTE] XMPP: {pushed}只有操作建议已推送;其余{len(promoted_rows)-pushed}只观望/关注仅归档broadcast(不进池通知不打扰)", flush=True) except Exception as e: print(f"[PROMOTE] XMPP 通知失败: {e}", flush=True) # 2026-08-18 老莫:重评未就绪的必须补推——后台 detach 补跑重评+补推