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)