feat: risk_guard读前端紧急指令并执行

- 每5秒检查/tmp/risk_guard_emergency.json
- close_all: 触发全平熔断
- block_new: 禁止新开仓(warning状态)
- resume: 恢复正常交易
- 读完立即删除文件防重复执行
- 记录操作人+时间
This commit is contained in:
root 2026-03-02 10:06:50 +00:00
parent fe754cf628
commit 7e8f83fd5a

View File

@ -390,6 +390,49 @@ def check_auto_resume():
write_risk_state() 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(): async def main():
@ -411,6 +454,9 @@ async def main():
# 0. 检查自动恢复 # 0. 检查自动恢复
check_auto_resume() check_auto_resume()
# 0.5 检查前端紧急操作指令
await check_emergency_commands(session, conn)
# 1. 今日亏损检查 # 1. 今日亏损检查
realized_r, consecutive = check_daily_loss(conn) realized_r, consecutive = check_daily_loss(conn)
unrealized_r = await check_unrealized_loss(session) unrealized_r = await check_unrealized_loss(session)