From 22d06efafe300b614ed92701f62bd75548c0d879 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Mar 2026 10:26:22 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=A1=E5=8F=B7=E6=96=B0=E9=B2=9C?= =?UTF-8?q?=E5=BA=A6=E4=BF=9D=E6=8A=A4=20=E2=80=94=20=E8=B6=85=E8=BF=872?= =?UTF-8?q?=E7=A7=92=E5=BC=83=E4=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - execute_entry最前面检查signal_age = now - signal_ts - >2000ms直接return None,不开仓 - 写warn级别event到live_events(含age_ms和score) - 正常NOTIFY链路<100ms,超2秒说明有异常 --- backend/live_executor.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/live_executor.py b/backend/live_executor.py index cb614ff..42db7f1 100644 --- a/backend/live_executor.py +++ b/backend/live_executor.py @@ -263,7 +263,17 @@ async def execute_entry(session: aiohttp.ClientSession, signal: dict, db_conn): t_signal = signal_ts # 信号时间戳(ms) - # 0. 检查风控状态(读risk_guard写的状态文件) + # 0. 信号新鲜度检查(超过2秒弃仓) + SIGNAL_MAX_AGE_MS = 2000 + signal_age_ms = time.time() * 1000 - t_signal + if signal_age_ms > SIGNAL_MAX_AGE_MS: + logger.warning(f"[{symbol}] ❌ 信号过期: {signal_age_ms:.0f}ms > {SIGNAL_MAX_AGE_MS}ms,弃仓") + _log_event(db_conn, "warn", "trade", + f"信号过期弃仓 {direction} {symbol} | age={signal_age_ms:.0f}ms | score={score}", + symbol, {"signal_age_ms": round(signal_age_ms), "score": score}) + return None + + # 0.5 检查风控状态(读risk_guard写的状态文件) try: with open("/tmp/risk_guard_state.json") as f: risk_state = json.load(f)