From e18dbfff6e056564d77e1a46a6e0d0bd046e642d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Thu, 9 Jul 2026 20:59:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B9=9D=E7=BB=B4=E5=88=86=E6=9E=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=BB=93=E6=9E=84=E5=8C=96=E5=8F=99=E4=BA=8B?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F(=E2=91=A0=E2=91=A1=E2=91=A2...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/per_stock_reassess.py | 60 ++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/scripts/per_stock_reassess.py b/scripts/per_stock_reassess.py index 10feb8ee..8ea523d9 100644 --- a/scripts/per_stock_reassess.py +++ b/scripts/per_stock_reassess.py @@ -19,15 +19,11 @@ def _build_full_analysis(code, entry, result): return "" lines = [] name = entry.get("name", code) - price = result.get("price", entry.get("price", 0)) + price = result.get("price") or entry.get("price", 0) - # 技术面 tech = result.get("tech_snapshot") or entry.get("tech_snapshot", "") - # 行业 sector = result.get("sector_context") or entry.get("sector_context", "") - # 信号 signal = result.get("timing_signal") or entry.get("timing_signal", "") - # 类别 category = result.get("stock_category") or entry.get("stock_category", "") el = result.get("entry_low") or entry.get("entry_low", 0) @@ -35,21 +31,38 @@ def _build_full_analysis(code, entry, result): sl = result.get("stop_loss") or entry.get("stop_loss", 0) tp = result.get("take_profit") or entry.get("take_profit", 0) rr = result.get("rr_ratio") or entry.get("rr_ratio", 0) - - lines.append(f"{name}({code}) — 九维分析") - lines.append("") - if sector: lines.append(f"🏭 行业背景: {sector}") - if tech: lines.append(f"📊 技术分析: {tech}") - if category: lines.append(f"📌 分类: {category}") - lines.append(f"📈 信号: {signal}") - if price: lines.append(f"💵 当前价: {price}") - if el or eh: lines.append(f"🎯 买入区: {el}~{eh}") - if sl: lines.append(f"🛑 止损: {sl}") - if tp: lines.append(f"✅ 止盈: {tp}") - if rr: lines.append(f"📊 RR: {rr:.2f}") - act = result.get("action", "") - if act: lines.append(f"📋 策略: {act}") + + # 从tech_snapshot提取关键数据 + ma5 = ma10 = ma20 = ma60 = "?" + import re + ma_match = re.search(r'MA5=([\d.]+).*?MA10=([\d.]+).*?MA20=([\d.]+).*?MA60=([\d.]+)', tech) + if ma_match: + ma5, ma10, ma20, ma60 = ma_match.groups() + + lines.append(f"【{name}({code}) 九维全析】") + lines.append("") + lines.append(f"① 大盘×技术面:价格{price},MA5={ma5} MA10={ma10} MA20={ma20} MA60={ma60}") + if el and eh: + lines.append(f"② 大盘×买入区:当前价{'在买入区' if el <= price <= eh else ('低于买入区' if price < el else '高于买入区')}{el}~{eh}") + lines.append(f"③ 大盘×资金流:信号={signal},分类={category}") + if sector: + lines.append(f"④ 行业×基本面:{sector}") + if tech: + # 提取形态和量价 + shape_m = re.search(r'形态:([^\s]+)', tech) + vol_m = re.search(r'量价:([^\s]+)', tech) + shape = shape_m.group(1) if shape_m else "?" + vol = vol_m.group(1) if vol_m else "?" + lines.append(f"⑤ 个股×技术面:{shape} | {vol}") + sr_m = re.search(r'强撑:([\d.]+).*?弱撑:([\d.]+).*?弱压:([\d.]+).*?强压:([\d.]+)', tech) + if sr_m: + lines.append(f"⑥ 个股×支撑阻力:强撑{sr_m.group(1)}→弱撑{sr_m.group(2)}→弱压{sr_m.group(3)}→强压{sr_m.group(4)}") + if sl and tp: + lines.append(f"⑦ 个股×风报比:止损{sl} 止盈{tp} RR={rr:.1f}") + if act: + lines.append(f"⑧ 策略判定:{act[:100]}") + lines.append(f"⑨ 综合结论:{signal},建议{'关注买入' if '买入' in signal else '持有观望' if signal == '持有' else '观望等待'}") return "\n".join(lines) @@ -216,6 +229,15 @@ def main(): if _fa and _fa[0]: print(f" ✅ full_analysis已写入({len(_fa[0])}字)") else: print(f" ⚠️ full_analysis为空") _v.close() + # 用代码构建完整九维分析 + _full_analysis_text = _build_full_analysis(code, entry, result) + + # 保存到DB + _fa_conn = __import__('sqlite3').connect("/home/hmo/MoFin/data/mofin.db") + _fa_conn.execute("UPDATE holding_strategies SET full_analysis=? WHERE code=? AND status='active'", (_full_analysis_text, code)) + _fa_conn.commit() + _fa_conn.close() + print(f" ✅ 完整九维分析已保存({len(_full_analysis_text)}字)") print(f" [DB] holding_strategies 已更新: {code}") except Exception as _dbe: print(f" [DB FAIL] holding_strategies 写入失败: {_dbe}", file=sys.stderr)