본문으로 건너뛰기

실시간 보유 (Open Positions)

Positions 페이지의 첫 번째 탭. 봇/수동 주문으로 생긴 살아있는 포지션을 1초 주기로 broker에서 동기화해 표시합니다.

📸 Open Positions 탭 (추후 자동 캡처 예정)

테이블 컬럼

컬럼의미
Asset자산군 배지 (crypto=amber, us=blue, kr=rose)
Symbol티커 (BTC/USDT, AAPL, 005930)
SideLONG (emerald) / SHORT (rose)
Entry Price평균 진입가
Current Price마지막 시세 (마크 가격)
Size보유 수량
Unrealized P&L미실현 손익 + % (양수 emerald / 음수 rose)
Stop Loss설정된 손절가 (없으면 )
Take Profit설정된 익절가
Strategy포지션을 만든 전략 이름
ActionClose 버튼 (Open 탭만)

Close 버튼

행 우측의 빨간 Close 버튼은 다음 동작을 수행합니다.

  1. window.confirm("Close position {symbol} {side}?") 확인
  2. POST /api/positions/{position_id}/close 호출
  3. 성공 시 queryClient.invalidateQueries(['positions']) → 테이블 즉시 갱신

서버는 현재 가격으로 시장가 청산하고 realized P&L을 RiskManager에 기록합니다.

새로고침 주기

동작주기
polling1s (TanStack Query refetchInterval)
WebSocket push활성화 시 즉시 (참고: WebSockets)

API 호출

curl -s -H "Authorization: Bearer $TOKEN" \
"http://localhost:8000/api/positions?asset_class=crypto"

응답:

[
{
"id": "9c1e...",
"symbol": "BTC/USDT",
"side": "LONG",
"entry_price": 67000,
"current_price": 67800,
"size": 0.05,
"unrealized_pnl": 40,
"unrealized_pnl_pct": 1.19,
"stop_loss": 65000,
"take_profit": 70000,
"strategy": "momentum",
"asset_class": "crypto",
"currency": "USDT",
"opened_at": "2026-04-26T01:00:00Z"
}
]

절대 룰

Stop Loss는 필수

모든 포지션은 entry 시 SL을 설정해야 합니다. RiskManager가 SL이 0이거나 음수인 신호를 거부합니다 (MISSING_STOP_LOSS).

자주 묻는 질문

Q. broker는 포지션이 있다는데 UI에서는 안 보입니다.
A. broker 응답이 BotManager.position_manager로 동기화되지 않은 상태일 수 있습니다. Reconciliation 페이지 참고.

Q. Close 버튼이 비활성화돼요.
A. 다른 close 요청이 진행 중이거나 봇이 미실행 상태입니다. BotControl을 확인하세요.

Q. KR 종목 가격이 USD로 표시됩니다.
A. UI는 자산군 currency에 맞춰 KRW로 자동 표시합니다. 표시 안 되면 새로고침 후 다시 확인하세요.

관련 페이지