diff --git a/deploy/profile-scripts/price_monitor.py b/deploy/profile-scripts/price_monitor.py index 60c5ee63..398e6e26 100644 --- a/deploy/profile-scripts/price_monitor.py +++ b/deploy/profile-scripts/price_monitor.py @@ -11,6 +11,59 @@ from datetime import datetime from mo_data import read_decisions from alert_logger import record_alert, clear_alert +# ── 温区感知 + 信号溯源(2026-08-13)── +try: + from regime_gate import _load_weights +except Exception: + _load_weights = None + +def _load_active_strats(): + """当前温区激活策略集合(strategy_weights.json matched)""" + if _load_weights is None: + return None + try: + w = _load_weights() + if w and w.get("weights"): + return {k for k, v in w["weights"].items() if v.get("matched")} + except Exception: + pass + return None + +def _is_strategy_active(d_entry): + """该持仓策略是否在当前温区激活。未标记策略默认激活(兼容持仓管理/风控)""" + act = _load_active_strats() + if act is None: + return True + for key in ("tag", "version", "strategy_type", "decision_type"): + v = d_entry.get(key) + if v and str(v) in act: + return True + # 该策略在权重表中但不在激活集 → 非激活 + try: + w = _load_weights() or {} + wmap = w.get("weights") or {} + for key in ("tag", "version", "strategy_type", "decision_type"): + v = d_entry.get(key) + if v and v in wmap: + return v in act + except Exception: + pass + return True + +def _record_signal(code, name, reason, strategy=""): + """信号溯源:记录到 signal_ledger""" + try: + from signal_ledger import record_signal + from regime_gate import get_current_regime + from temp_band import get_market_temp + rg = get_current_regime() + tp = get_market_temp() + record_signal(code=code, name=name, strategy=strategy, version=strategy, + regime=rg.get("regime", ""), temp_band=tp.get("band", ""), + reason=reason, source_module="price_monitor") + except Exception: + pass + BREACH_PATH = "/home/hmo/.hermes/zone_breach.json" STATE_PATH = "/home/hmo/.hermes/price_trigger_state.json" @@ -614,9 +667,17 @@ def run_once(round_label=""): msg = f"🔔 {name}({code}) 价{price}→触发{zone_desc},已触发重评|RR={rr}" _push_action("操作信号", msg) outputs.append(f" 📨 区间触发重评→已推送Dad: {action}") + # 2026-08-13 信号溯源:风控动作记录 + _record_signal(code, name, f"风控:{timing_signal} {zone_desc}", strategy=d.get("tag") or d.get("version") or "") else: - _zone_entries.append(f"{name}({code}) {price}→{zone_desc}+重评{timing_signal}|RR={rr}") - outputs.append(f" 📋 机会记入摘要: {timing_signal} RR={rr}") + # 2026-08-13 温区感知:非激活策略的买入/加仓机会抑制(不进摘要) + if _is_strategy_active(d): + _zone_entries.append(f"{name}({code}) {price}→{zone_desc}+重评{timing_signal}|RR={rr}") + outputs.append(f" 📋 机会记入摘要: {timing_signal} RR={rr}") + # 2026-08-13 信号溯源:买入机会记录 + _record_signal(code, name, f"买入机会:{zone_desc} {timing_signal}", strategy=d.get("tag") or d.get("version") or "") + else: + outputs.append(f" 🧊 温区未激活跳过: {name}({code}) {timing_signal} RR={rr}") else: reason = f"重评结果:{timing_signal},不构成操作建议" outputs.append(f" 📋 本地日志(不推): {reason}")