From 7e8f83fd5a7268916b3c438584a6c1b7fffcd67d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Mar 2026 10:06:50 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20risk=5Fguard=E8=AF=BB=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E7=B4=A7=E6=80=A5=E6=8C=87=E4=BB=A4=E5=B9=B6=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 每5秒检查/tmp/risk_guard_emergency.json - close_all: 触发全平熔断 - block_new: 禁止新开仓(warning状态) - resume: 恢复正常交易 - 读完立即删除文件防重复执行 - 记录操作人+时间 --- backend/risk_guard.py | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/backend/risk_guard.py b/backend/risk_guard.py index 712fdf2..0841646 100644 --- a/backend/risk_guard.py +++ b/backend/risk_guard.py @@ -390,6 +390,49 @@ def check_auto_resume(): write_risk_state() +# ============ 前端紧急指令处理 ============ + +EMERGENCY_FILE = "/tmp/risk_guard_emergency.json" + +async def check_emergency_commands(session, conn): + """读取前端发的紧急操作指令并执行""" + try: + with open(EMERGENCY_FILE) as f: + cmd = json.load(f) + # 读完立即删除,防止重复执行 + os.remove(EMERGENCY_FILE) + except FileNotFoundError: + return + except Exception: + return + + action = cmd.get("action") + user = cmd.get("user", "unknown") + logger.info(f"📩 收到紧急指令: {action} (操作人: {user})") + + if action == "close_all": + await trigger_circuit_break(session, conn, f"人工紧急全平 (操作人: {user})", "close_all") + + elif action == "block_new": + risk_state.block_new_entries = True + risk_state.status = "warning" + risk_state.circuit_break_reason = f"人工禁止新开仓 (操作人: {user})" + write_risk_state() + logger.warning(f"🟡 人工禁止新开仓 (操作人: {user})") + + elif action == "resume": + risk_state.status = "normal" + risk_state.block_new_entries = False + risk_state.reduce_only = False + risk_state.circuit_break_reason = None + risk_state.circuit_break_time = None + write_risk_state() + logger.info(f"✅ 人工恢复交易 (操作人: {user})") + + else: + logger.warning(f"⚠ 未知紧急指令: {action}") + + # ============ 主循环 ============ async def main(): @@ -411,6 +454,9 @@ async def main(): # 0. 检查自动恢复 check_auto_resume() + # 0.5 检查前端紧急操作指令 + await check_emergency_commands(session, conn) + # 1. 今日亏损检查 realized_r, consecutive = check_daily_loss(conn) unrealized_r = await check_unrealized_loss(session)