.. _toss_order_history: 주문 내역과 취소/정정 레코드 (KIS 와의 차이) ============================================ 토스증권 Open API 는 **취소/정정 "요청"을 별도의 주문 레코드로 제공하지 않습니다.** 취소는 원주문의 상태만 ``CANCELED`` 로 바뀌는(in-place) 방식입니다. PyQQQ SDK 는 주문 내역 조회 시 취소된 주문에서 취소 정보를 **별도 레코드로 분리해** KIS 와 같은 형태로 반환하지만, 아래와 같은 차이/한계가 있으므로 주의가 필요합니다. KIS 동작 -------- KIS 는 취소/정정 요청마다 **새로운 주문번호를 가진 별도 레코드** 가 내역에 추가되며, ``req_type`` (``CANCEL``/``MODIFY``)과 ``org_order_no`` 로 원주문과 연결됩니다. .. code-block:: python kis.create_order("225570", OrderSide.BUY, 1, OrderType.LIMIT, 7500) # '0017931600' kis.cancel_order("0017931600") # '0017935300' kis.get_today_order_history() # [ # StockOrder(order_no='0017935300', req_type=CANCEL, org_order_no='0017931600', ...), # StockOrder(order_no='0017931600', req_type=NEW, org_order_no='', ...), # ] <- 취소 레코드가 고유한 주문번호를 가짐 토스 동작 --------- - **취소**: 원주문이 ``CANCELED`` 상태로 바뀌고 ``canceledAt`` 이 채워질 뿐, API 내역에 취소 레코드가 추가되지 않습니다. ``cancel_order`` 응답에는 원주문과 다른 주문 ID (취소 요청 ID)가 반환되지만, 이 ID는 주문 내역 조회에 나타나지 않습니다. - **정정**: 새로운 주문 ID가 발급되고 원주문은 ``REPLACED`` 상태가 됩니다. 하지만 새 주문 레코드에 원주문을 가리키는 필드가 없어 조회만으로는 정정 체인을 복원할 수 없습니다. SDK 는 주문 내역 조회(``get_today_order_history``/``get_order_history``)에서 취소된 주문을 두 레코드로 분리해 반환합니다: .. code-block:: python t_oid = toss.create_order("225570", OrderSide.BUY, 1, OrderType.LIMIT, 7500) toss.cancel_order(t_oid) toss.get_today_order_history() # [ # StockOrder(order_no=None, req_type=CANCEL, org_order_no=t_oid, price=0, ...), # StockOrder(order_no=t_oid, req_type=NEW, org_order_no=None, ...), # ] <- 취소 정보가 별도 레코드로 분리됨 취소 레코드의 필드: - ``order_no``: ``None`` — 취소 요청 ID 가 조회로 제공되지 않음 - ``org_order_no``: 원주문 번호 (KIS 와 동일한 체인 표현) - ``price``: ``0`` (KIS 취소 레코드와 동일) - ``quantity``: 취소된(미체결) 수량 — 부분 체결 후 취소 시 미체결분만 - ``order_time``: ``canceledAt`` (없으면 ``orderedAt``) .. warning:: 라이브 검증에서 취소된 주문의 ``canceledAt`` 이 ``orderedAt`` 과 동일한 값으로 내려오는 사례가 관찰되었습니다. 취소 레코드의 ``order_time`` 을 실제 취소 시각으로 신뢰하지 마세요. KIS 와의 잔여 차이 ------------------ - **취소 레코드에 고유 주문번호가 없습니다.** ``order_no`` 는 ``None`` 이므로 취소 레코드를 주문번호로 재조회할 수 없습니다. - **정정 체인은 복원되지 않습니다.** 정정으로 생성된 주문도 ``req_type=NEW``, ``org_order_no=None`` 으로 반환됩니다. 추적이 필요하면 ``update_order`` 가 반환한 새 주문번호를 호출 측에서 직접 보관해야 합니다. - **분리는 주문 내역 조회에만 적용됩니다.** ``get_order(주문번호)`` 는 취소된 주문이라도 원주문 1건만 반환합니다. 관련 API -------- - :doc:`TossSimpleDomesticStock ` — ``cancel_order`` / ``update_order`` / ``get_today_order_history`` - :doc:`TossSimpleOverseasStock ` — ``cancel_order`` / ``update_order`` / ``get_today_order_history`` / ``get_order_history``