feat: 单日暴跌>7%实时告警(不依赖zone边界)
This commit is contained in:
@@ -452,6 +452,35 @@ def run_once(round_label=""):
|
|||||||
|
|
||||||
# === 第三步:买入区偏离检测 + 自动重评 ===
|
# === 第三步:买入区偏离检测 + 自动重评 ===
|
||||||
reassesed_codes = []
|
reassesed_codes = []
|
||||||
|
# 先做急跌检测(所有持仓,不依赖买入区)
|
||||||
|
for d in active:
|
||||||
|
code = d["code"]
|
||||||
|
name = d.get("name", code)
|
||||||
|
price_info = prices.get(code)
|
||||||
|
if not price_info:
|
||||||
|
continue
|
||||||
|
price, _, change_pct = price_info
|
||||||
|
if price == 0:
|
||||||
|
continue
|
||||||
|
# 单日跌幅>7%告警(不依赖zone边界,盘中急跌即触发)
|
||||||
|
try:
|
||||||
|
cp = float(change_pct) if change_pct else 0
|
||||||
|
except:
|
||||||
|
cp = 0
|
||||||
|
if cp <= -7:
|
||||||
|
prev_alert = state.get(code, {}).get("__sharp_decline_triggered", False)
|
||||||
|
if not prev_alert:
|
||||||
|
stop_loss = d.get("stop_loss", 0)
|
||||||
|
sl_note = f" 止损{stop_loss}" if stop_loss else ""
|
||||||
|
msg = f"🔻 {name}({code}) {price} 暴跌{cp:.1f}%!{sl_note}"
|
||||||
|
push_to_xmpp(msg)
|
||||||
|
outputs.append(msg)
|
||||||
|
state.setdefault(code, {})["__sharp_decline_triggered"] = True
|
||||||
|
state_updated = True
|
||||||
|
elif cp > -5:
|
||||||
|
# 反弹后清除告警标记,下次再跌还能报
|
||||||
|
state.setdefault(code, {}).pop("__sharp_decline_triggered", None)
|
||||||
|
|
||||||
for d in active:
|
for d in active:
|
||||||
code = d["code"]
|
code = d["code"]
|
||||||
name = d.get("name", code)
|
name = d.get("name", code)
|
||||||
|
|||||||
Reference in New Issue
Block a user