# 개인 WebSocket 주문 명령

`wss://api-ws.btxpro.co.kr/v1/user/stream`에 연결한 뒤 초기 snapshot을 소비하고 명령을 보냅니다. 연결 시 read, 모든 주문 명령에는 trade 권한이 필요합니다. 서버는 실행 직전에 키와 권한을 다시 확인합니다.

## 공통 형식

```json
{ "id": "bot-7:create:1042", "op": "order.create", "args": {} }
```

`id`는 `[A-Za-z0-9._:-]+`에 맞는 최대 64자 문자열입니다. 같은 연결에서 처리 중인 ID를 재사용하면 `DUPLICATE_COMMAND_ID`입니다. 완료되거나 재연결한 뒤의 재전송을 막아주는 값은 아닙니다.

서버는 한 연결의 명령을 수신 순서대로 실행합니다. 이벤트 수신과 명령 응답 수신은 동시에 처리해야 합니다.

## order.create

```json
{
  "id": "bot-7:create:1042",
  "op": "order.create",
  "args": {
    "symbol": "BTC-USDT",
    "walletId": 21,
    "side": "buy",
    "type": "limit",
    "timeInForce": "GTC",
    "quantity": "0.100000000",
    "price": "65000.000000000"
  }
}
```

주문 필드는 REST의 [CreateOrderRequest](/api-docs/generated/schemas.md#schema-createorderrequest)와 같습니다. 현재 지정가 GTC만 지원합니다.

## order.cancel

```json
{
  "id": "bot-7:cancel:1043",
  "op": "order.cancel",
  "args": { "orderId": "987654" }
}
```

이 명령의 args에는 `orderId`만 전달합니다. `walletId`, `symbol`은 REST 단건 취소에서만 선택적으로 사용합니다. 일괄 취소는 REST `DELETE /v1/orders`를 사용합니다.

## order.amend

```json
{
  "id": "bot-7:amend:1044",
  "op": "order.amend",
  "args": { "orderId": "987654", "price": "66000.000000000" }
}
```

현재 원자적 정정을 지원하지 않습니다. [정정 요청 모델](/api-docs/generated/schemas.md#schema-userstreamamendorderargs)의 필드로 요청해도 `AMEND_NOT_SUPPORTED`를 반환하며 원래 주문을 변경·취소하지 않습니다. 취소 후 새 주문 생성은 별개 작업이며 중간 체결 위험이 있습니다.

## 성공·오류 응답

아래 성공 응답의 `data`는 핵심 필드만 표시했습니다. 전체 응답은 [UserStreamCommandResponse](/api-docs/generated/schemas.md#schema-userstreamcommandresponse)를 확인하세요.

```json
{
  "event": "response",
  "id": "bot-7:create:1042",
  "op": "order.create",
  "data": { "orderId": "987654", "status": "open" },
  "serverTime": 1783420800123
}
```

```json
{
  "event": "error",
  "id": "bot-7:amend:1044",
  "op": "order.amend",
  "error": {
    "code": "AMEND_NOT_SUPPORTED",
    "message": "The trading engine does not support atomic order amendment."
  },
  "serverTime": 1783420800123
}
```

`response`·`error`에는 이벤트 sequence가 없습니다. `id`로 명령을 찾아 완료 처리합니다. 주문 이벤트는 response보다 먼저 도착할 수도 있습니다.

결과를 받지 못하고 연결이 끊기면 생성·취소 명령을 자동 재전송하지 마세요. [새 snapshot과 REST 조회로 상태를 대조](/api-docs/websocket/recovery.md)합니다.
