1. 국내주식/1-2. 키움 OpenAPI (사용)

(주식 자동 매매) 키움증권 OpenAPI - 미체결 주문을 SendOrder 함수로 취소하기 (3) 주문번호와 원주문번호 구분 필요

봄이오네 2022. 10. 8. 08:09
반응형

1. 들어가며

지난 글에서는 키움증권 OpenAPI의 SendOrder 함수를 이용하여

미체결 주문을 취소했다.

 

이번 글에서는 이미 제출한 주문에 대한 취소주문에 적용되는 번호가

"주문번호"인지 "원주문번호"인지 구분을 할 것이다.

 

구분이 필요한 이유는,

필자도 지금껏 취소할 때 들어가는 주문번호는 "원주문번호"라고

착각했기 때문인다.

→ 실제 취소할 때,

     필요한 번호는 매도주문 당시 부여받은 "주문번호"이다.

 

위 착각을 일으키는 결정적인 이유는,

안타깝게도 Koa Studio와 개발가이드에

혼동 소지가 있는 내용을 기재하였기 때문이다.


2. 검토 배경

지난번에도 설명했지만, SendOrder함수의 9개 변수 중 3개는 제대로 넣어주어야 한다.

    * 3개 : 주문유형(1매수, 2매도, 4매도취소 등), 종목코드, 원주문 번호

 

위의 SendOrder함수를 프로그램에 적용하려고

opt10075(미체결요청)을 활용하여 원주문 번호를 가져와서

주문을 취소를 하려고 했는데,

아.뿔.사...... 취소가 안된다.

 

Koa Studio와 OpenAPI 개발가이드에서 설명한 "원주문 번호"를

SendOrder함수에 넣었는데, 왜 취소가 안되는 걸까?

 

https://springcoming.tistory.com/43?category=1048804 

 

(주식 자동 매매) 키움증권 OpenAPI - 미체결 주문을 SendOrder 함수로 취소하기 (2) 취소주문 테스트

1. 들어가며 지난 글에서는 삼성전자의 매도주문에 대해 취소하는 내용을 알아보았다. 이미 제출된 매도주문(원주문 번호)을 취소하기 위해서는, OpenAPI에서 제공하는 SendOrder함수를 이용하여야

springcoming.tistory.com


3. Koa Studio와 OpenAPI 개발가이드의 내용 확인

1) Koa Studio에서 변수 확인

아래 <그림1>은 Koa Studio에서  SendOrder함수에 대한 설명이다.

9번째 인수에는 "원주문번호"를 넣어라고 한다.

 

< 그림1. KOA Studio에서는 취소주문시에도 원주문번호로 안내하고 있다 >

 

2) 개발가이드에서 확인

아래  <그림2>에서도 키움증권 OpenAPI의 SendOrder함수에 대한 설명에서도,

원주문 번호를 넣어라고 한다.

< 그림2. OpenAPI 개발가이드에서도 취소주문일 때에도 원주문번호로 안내 >


4. 테스트 진행 사유

위의 <그림1> 및 <그림2>에 따라 원주문 번호를 넣으면 주문이 취소될까?

 

필자는 분명 지난 시간 매도주문 취소를 할 때, 코드번호를 넣어주고

취소를 성공한 사례를 설명하였다.

생각해보니, 그 때도 "매도 제출시 부여받은 주문번호"를 SendOrder의 9번째 변수에 넣었다.

 

매도취소를 할 때는 분명히 "매도 주문시 부여받은 코드번호"를 넣어주었는데,

Koa Studio와 OpenAPI 개발가이드에서는 "원주문 번호"를 넣어라고 하니,

어떤 장단에 맞혀야 하는건가?

뭐, 이렇게 막힐 때는 직접 실험해 보는 수 밖에 없다.


5. 테스트 결과

테스트는 매도주문을 제출해 두고나서,

원주문번호 및 매도주문번호를 각각 입력 후 각각 실행해 보았다.

 

1) 원주문 번호 입력  취소되지 아니함

카카오(035720) 5개 매도 주문을 넣었고,

opt10075에서 제공하는 "원주문번호"를 넣고 매도 취소했으나, 취소 안됨

 

개발가이드에서 말한대로 opt10075에서 수신받은 원주문 번호 입력해도

매도 취소가 되지 아니한다.

그 이유는 opt10075에서 제공하는 "원주문번호"를 000000으로 주어지기 때문이다.

 

아래 <그림3-1>에서도 매도주문(①)을 하고, SendOrder 함수를 이용하여 취소 시도를 하였으나,

실시간계좌관리(②)에서는 취소되지 아니하였고,

주문체결내역(③)에서도 취소 메시지가 뜨지 않는다.

→ opt10075에서 받는 원주문 번호는 <개발가이드>에서 말하는 "원주문 번호"는 아닌 것이다!

 

< 그림3-1. 주문번호(①)가 아닌, 원주문 번호를 입력하니, 매도주문이 취소되지 아니한다 >

 

2) 매도주문시 부여받은 주문번호 → 매도주문 취소됨

카카오(035720) 5개 매도 주문을 넣었고,

opt10075에서 제공하는 "주문번호"를 넣고 매도 취소 시도함 → 매도주문 취소 성공!

 

아래 <그림3-1>에서도 매도주문(①)을 하고, SendOrder 함수를 이용하여 취소 시도를 하였으나,

실시간계좌관리(②)에서는 취소되지 아니하였고,

주문체결내역(③)에서도 취소 메시지가 뜨지 않는다.

→ opt10075에서 받는 원주문 번호는 "매도시 부여받은 코드번호이다"

 

< 그림3-2. 주문번호(①)를 넣고 실행하니, 매도주문이 취소되었다 >


6. 파이참에서 확인

다음 글에서 설명할 opt10075(미체결 요청) 관련하여

미체결 내역이 있을 때,

주문번호(order_num)과 원주문번호(orgorder_num)을 print를 해보았다.

 

order_num : 141596

orgorder_num : 0000000

< 그림4. opt10075를 통해 받은 "주문번호"와 "원주문번호" 현황 >


7. 마치며

원래 이 글은 opt10075(미체결요청) 설명을 하고, 글을 전개했어야 했다.

또한, SendOrder함수 관련해서는 글을 2번만 쓰려고 했다.

 

그런데, 실제 주문을 넣으려고 opt10075를 실행하여 받은 "원주문번호"로는

주문이 삭제되지 않으면서,

그때부터 매도취소시,

SendOrder의 "원주문번호" = opt10075 "원주문번호"와 같을까?

의문이 들기 시작한 것이다.

 

결론은 

SendOrder의 "원주문번호"는 

opt10075에서 매도주문 시 부여받은 주문번호를 말하는 것이다.

 

이로써, SendOrder함수에 대한 설명을 끝내려고 한다.

다음 글에서는 TR요청 중 주문번호를 받기 위한 opt10075를 알아볼 것이다.

반응형