주문 내역과 취소/정정 레코드 (KIS 와의 차이)¶
토스증권 Open API 는 취소/정정 “요청”을 별도의 주문 레코드로 제공하지 않습니다.
이로 인해 get_today_order_history 등 주문 내역 조회 결과가 KIS 와 다르게 나타납니다.
KIS 와 동일한 형태의 결과를 기대하는 코드(취소/정정 레코드 수 세기, req_type /
org_order_no 기반 주문 체인 추적 등)는 토스에서 동작하지 않으므로 주의가 필요합니다.
KIS 동작¶
KIS 는 취소/정정 요청마다 새로운 주문번호를 가진 별도 레코드 가 내역에 추가되며,
req_type (CANCEL/MODIFY)과 org_order_no 로 원주문과 연결됩니다.
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='', ...),
# ] <- 취소 레코드가 별도로 존재
토스 동작¶
토스는 취소가 원주문의 상태를 바꾸는(in-place) 방식입니다.
취소: 원주문이
CANCELED상태로 바뀌고canceledAt이 채워질 뿐, 내역에 취소 레코드가 추가되지 않습니다.cancel_order응답에는 원주문과 다른 주문 ID (취소 요청 ID)가 반환되지만, 이 ID는 주문 내역 조회에 나타나지 않습니다.정정: 새로운 주문 ID가 발급되고 원주문은
REPLACED상태가 됩니다. 하지만 새 주문 레코드에 원주문을 가리키는 필드가 없어 조회만으로는 정정 체인을 복원할 수 없습니다.따라서
StockOrder변환 시req_type은 항상NEW,org_order_no는 항상None입니다.
t_oid = toss.create_order("225570", OrderSide.BUY, 1, OrderType.LIMIT, 7500)
toss.cancel_order(t_oid) # 원주문과 다른 취소 요청 ID 반환 (내역에는 미노출)
toss.get_today_order_history()
# [
# StockOrder(order_no=t_oid, req_type=NEW, org_order_no=None, is_pending=False, ...),
# ] <- 원주문 1건만 조회됨 (취소 레코드 없음)
Warning
라이브 검증에서 취소된 주문의 canceledAt 이 orderedAt 과 동일한 값으로
내려오는 사례가 관찰되었습니다. 실제 취소 시각으로 신뢰하지 마세요.
영향 및 대응¶
취소/정정 레코드 수를 세는 코드는 동작하지 않습니다. 토스의 주문 내역 건수는 원주문(및 정정으로 새로 생긴 주문) 수와 같습니다.
취소 여부 확인: 원주문을
get_order(주문번호)로 재조회하여is_pending == False이고filled_quantity가 주문 수량보다 작으면 취소(또는 기간 만료)된 것입니다. 응답의CANCELED/REPLACED등 원시 status 값은StockOrder로 직접 노출되지 않습니다.정정 체인 추적:
update_order가 반환한 새 주문번호를 호출 측에서 직접 보관해야 합니다.
관련 API¶
TossSimpleDomesticStock —
cancel_order/update_order/get_today_order_historyTossSimpleOverseasStock —
cancel_order/update_order/get_today_order_history/get_order_history