Files
Hydra-Engine/hydra/cli/status.py
2026-03-30 13:19:11 +09:00

61 lines
2.4 KiB
Python

import typer
import httpx
from hydra.config.settings import get_settings
app = typer.Typer(help="시스템 상태 확인")
@app.callback(invoke_without_command=True)
def status():
"""HYDRA 상태 확인."""
settings = get_settings()
try:
h = httpx.get("http://127.0.0.1:8000/health", timeout=5)
s = httpx.get(
"http://127.0.0.1:8000/status",
headers={"X-HYDRA-KEY": settings.hydra_api_key},
timeout=5,
)
r = httpx.get(
"http://127.0.0.1:8000/risk",
headers={"X-HYDRA-KEY": settings.hydra_api_key},
timeout=5,
)
p = httpx.get(
"http://127.0.0.1:8000/pnl",
headers={"X-HYDRA-KEY": settings.hydra_api_key},
timeout=5,
)
typer.echo(f"[정상] 서버 상태 정상 | 프로필: {s.json()['profile']} | 가동시간: {h.json()['uptime_seconds']}")
risk = r.json()
ks = "ACTIVE" if risk["kill_switch_active"] else "NORMAL"
typer.echo(f"Kill Switch: {ks} | 일일 손익(리스크): {risk['daily_pnl_pct']*100:.2f}%")
pnl = p.json()
sign = lambda v: "+" if v >= 0 else ""
typer.echo(
f"\n=== 손익 현황 ===\n"
f" 실현 손익 (누적): {sign(pnl['realized_total'])}{pnl['realized_total']:,.4f} USDT\n"
f" 실현 손익 (오늘): {sign(pnl['daily_realized'])}{pnl['daily_realized']:,.4f} USDT\n"
f" 미실현 손익: {sign(pnl['unrealized'])}{pnl['unrealized']:,.4f} USDT\n"
f" 총 손익: {sign(pnl['total_pnl'])}{pnl['total_pnl']:,.4f} USDT\n"
f" 체결 거래 수: {pnl['trade_count']}"
)
if pnl["positions"]:
typer.echo("\n -- 오픈 포지션 --")
for pos in pnl["positions"]:
lev = f" {pos['leverage']}x" if pos.get("leverage", 1) > 1 else ""
upnl = pos.get("unrealized_pnl", 0)
typer.echo(
f" [{pos['market']}] {pos['symbol']} {pos['side'].upper()}{lev} "
f" 수량: {pos['qty']} 평균단가: {pos['avg_price']} "
f"미실현: {sign(upnl)}{upnl:,.4f}"
)
else:
typer.echo("\n 오픈 포지션 없음")
except httpx.ConnectError:
typer.echo("[오류] 서버 오프라인")