Skip to content

Commit b6c6860

Browse files
committed
Handle case-insensitive API response fields in pending order cancellation tasks
- Update `kis.py` to support case-insensitive matching for API response fields like `odno`, `pdno`, and `sll_buy_dvsn_cd` during order filtering and cancellation. - Add warnings for missing order numbers during task processing. - Ensure compatibility for both domestic and overseas pending order cancellations.
1 parent e4bb79a commit b6c6860

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

app/tasks/kis.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -381,10 +381,11 @@ async def _cancel_domestic_pending_orders(
381381
# sll_buy_dvsn_cd: 01=매도, 02=매수
382382
target_code = "02" if order_type == "buy" else "01"
383383

384-
# 해당 종목의 주문만 필터링
384+
# 해당 종목의 주문만 필터링 (필드명 대소문자 모두 확인)
385385
target_orders = [
386386
order for order in all_open_orders
387-
if order.get('pdno') == stock_code and order.get('sll_buy_dvsn_cd') == target_code
387+
if (order.get('pdno') or order.get('PDNO')) == stock_code
388+
and (order.get('sll_buy_dvsn_cd') or order.get('SLL_BUY_DVSN_CD')) == target_code
388389
]
389390

390391
if not target_orders:
@@ -395,9 +396,15 @@ async def _cancel_domestic_pending_orders(
395396

396397
for order in target_orders:
397398
try:
398-
order_number = order.get('ord_no')
399-
order_qty = int(order.get('ord_qty', 0))
400-
order_price = int(float(order.get('ord_unpr', 0)))
399+
# API 응답 필드명이 소문자 또는 대문자일 수 있음
400+
order_number = order.get('odno') or order.get('ODNO') or order.get('ord_no') or order.get('ORD_NO')
401+
order_qty = int(order.get('ord_qty') or order.get('ORD_QTY') or 0)
402+
order_price = int(float(order.get('ord_unpr') or order.get('ORD_UNPR') or 0))
403+
404+
if not order_number:
405+
logger.warning(f"주문번호 없음 ({stock_code}): order={order}")
406+
failed += 1
407+
continue
401408

402409
await kis.cancel_korea_order(
403410
order_number=order_number,
@@ -1113,10 +1120,11 @@ async def _cancel_overseas_pending_orders(
11131120
# sll_buy_dvsn_cd: 01=매도, 02=매수
11141121
target_code = "02" if order_type == "buy" else "01"
11151122

1116-
# 해당 종목의 주문만 필터링
1123+
# 해당 종목의 주문만 필터링 (필드명 대소문자 모두 확인)
11171124
target_orders = [
11181125
order for order in all_open_orders
1119-
if order.get('pdno') == symbol and order.get('sll_buy_dvsn_cd') == target_code
1126+
if (order.get('pdno') or order.get('PDNO')) == symbol
1127+
and (order.get('sll_buy_dvsn_cd') or order.get('SLL_BUY_DVSN_CD')) == target_code
11201128
]
11211129

11221130
if not target_orders:
@@ -1127,8 +1135,14 @@ async def _cancel_overseas_pending_orders(
11271135

11281136
for order in target_orders:
11291137
try:
1130-
order_number = order.get('odno')
1131-
order_qty = int(order.get('ft_ord_qty', 0))
1138+
# API 응답 필드명이 소문자 또는 대문자일 수 있음
1139+
order_number = order.get('odno') or order.get('ODNO') or order.get('ord_no') or order.get('ORD_NO')
1140+
order_qty = int(order.get('ft_ord_qty') or order.get('FT_ORD_QTY') or 0)
1141+
1142+
if not order_number:
1143+
logger.warning(f"주문번호 없음 ({symbol}): order={order}")
1144+
failed += 1
1145+
continue
11321146

11331147
await kis.cancel_overseas_order(
11341148
order_number=order_number,

0 commit comments

Comments
 (0)