From 7ec99053b974add63b6ac01f4ff0bba366b3cd24 Mon Sep 17 00:00:00 2001 From: xxm Date: Tue, 25 Aug 2026 12:37:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20batch=5Freassess=20SIGNAL=5FJSON?= =?UTF-8?q?=E9=87=8D=E6=89=93(prompt=E6=9C=AB=E5=B0=BE=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E8=A1=8C=E8=A6=81=E6=B1=82+parse=5Fresponse?= =?UTF-8?q?=E7=9B=B4=E8=AF=BB=E5=AD=97=E6=AE=B5)=E2=80=94=E2=80=94?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E7=89=88fix=5Fstructured=E5=9B=A0mofin=5Fdb?= =?UTF-8?q?=E7=BC=A9=E8=BF=9B=E9=94=99=E8=AF=AF=E4=B8=AD=E6=96=AD=E6=9C=AA?= =?UTF-8?q?commit=E8=A2=ABdeploy=5Fguard=E5=9B=9E=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/batch_reassess.py | 29 ++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/deploy/profile-scripts/batch_reassess.py b/deploy/profile-scripts/batch_reassess.py index 142b73cd..5b74af4b 100644 --- a/deploy/profile-scripts/batch_reassess.py +++ b/deploy/profile-scripts/batch_reassess.py @@ -712,9 +712,14 @@ accumulation / b_td1_v3 / v_mr / hk_pe_mom / hk_pe_oversold / p_oversold / s2_pa ⚠️ 输出纪律(必须遵守): 1. 直接以【维持或修改】开头,禁止任何寒暄、开场白、分隔线 -2. 禁止输出 或任何 XML/JSON/代码块 +2. 禁止输出 或任何 XML/代码块(唯一例外:末尾的 SIGNAL_JSON 行) 3. 所有【】节标题一个都不能少 -4. 止损<区间下沿<区间上沿<止盈,违反任一条=输出作废重想""" +4. 止损<区间下沿<区间上沿<止盈,违反任一条=输出作废重想 +5. ⚠️ 最后一行必须是机器可读结论(单行,不加代码块标记): +SIGNAL_JSON: {"signal":"买入|可买入|可加仓|关注|观望|持有|弱势持有|卖出|止盈","actionable":true或false,"entry_low":数字或0,"entry_high":数字或0,"stop_loss":数字或0,"take_profit":数字或0,"position_pct":数字0到20,"reason":"一句话"} +- signal 必须与【综合结论】完全一致 +- actionable=true 仅当"当前价格下立即可执行的买入/卖出操作";观望/等待/条件未满足/不符合建仓条件一律 false +- 数字字段与【买入区间】【建议止损】【建议止盈】【建议仓位】一致,无则0""" def parse_response(text): """从LLM回复中提取策略参数。 ⚠️ 节标题精确匹配:只认行首【买入区间】【综合结论】等节行。 @@ -821,6 +826,26 @@ def parse_response(text): result["strategy_switch_to"] = c break + # ── 2026-08-25 机器可读结论优先(老莫:结构化标注,不靠关键词匹配散文)── + _m_json = re.search(r'^SIGNAL_JSON:\s*(\{.*\})\s*$', text, re.M) + if _m_json: + try: + import json as _js + _sj = _js.loads(_m_json.group(1)) + result["signal_json"] = _sj + if _sj.get("signal"): + result["signal"] = _sj["signal"] + for _k, _rk in (("entry_low","entry_low"),("entry_high","entry_high"), + ("stop_loss","stop_loss"),("take_profit","take_profit")): + if _sj.get(_k): + result[_rk] = float(_sj[_k]) + if _sj.get("position_pct") is not None: + result["position"] = f"{_sj['position_pct']}%(SIGNAL_JSON)" + if result["signal"] in ("买入","可买入","可加仓") and _sj.get("actionable") is False: + result["signal"] = "关注" + result["actionable_downgraded"] = True + except Exception: + pass return result def save_result(code, full_text, parsed, ta_levels=None):