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

(주식 자동 매매) 키움증권 OpenAPI - 미체결 주문내역 가져와서 주문취소하기 (2) (opt10075 + SendOrder)

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

1. 들어가며

지난 글에서는 OpenAPI를 활용하여 미체결 TR요청(opt10075)를 알아보았다.

받아온 데이터는 문자형이었고, 주문번호 앞에는 0이 붙어있었다.

맨 앞의 0은 int를 붙여서, 정수화 시키는 작업이 필요하다.

 

이번 글에서는 opt10075를 통해 받아온 주문번호를 통해

기 제출한 매도주문의 취소를 파이썬을 통해 실행하는 내용과

매도취소가 제대로 진행되었는지 확인하는 내용(미체결 주문 취소가 되었는지)을 알아보자.

< 그림1. 미체결 주문 취소 이후 "미체결내역"이 있는지 확인 결과, 취소되었는지 확인한 결과 >

 

키움증권 영웅문에서 매도주문을 직접 제출/체결되었다. (매도 주문번호가 생성됨)

파이썬에서 opt10075 함수를 실행하여 매도 주문번호를 알아낼 것이고

파이썬을 통해 SendOrder 매도취소를 실행할 것이다.


2. 사전 준비

미체결요청(opt10075)와 매도취소(SendOrder)는 각각 이전 글에서 설명하였다.

여기서 핵심은 미체결요청을 했을 때, 미체결 주문이 있으면(if)

그 매도주문을 취소해 달라는 내용이 파이썬에 구현되어야 한다.

 

즉, opt10075함수 안에 매도취소의 내용을 넣어주면,

    opt10075함수를 실행할 때, 매도취소까지 동시에 실행된다는 것이다.

→  동일 클래스 내에서, 1개 함수 내(a)에 또다른 함수(b)가 실행되는 명령어를 넣으면 된다.

 

이 개념이 중요한 이유는, 향후 패턴(알고리즘)을 토대로 주식을 매수할텐데,

여러가지 경우의 수가 나올 수 있다.

  • 주문 체결이 되고나서, 익절 라인에 도달한 경우 → 수익 실현한다.(시장가 매도)
  • 주문 체결이 되었으나 손절 라인에 도달한 경우 등 → 손절라인 도달하면 매도
  • 주문은 넣었으나 체결이 안되는 경우 → 미체결 내역이 존재하면, "주문 취소 필요"
  • 체결은 되었으나 횡보하는 경우 → 일정 시간 횡보하면, 시장가로 매도

위의 사례 뿐만 아니고, 여러가지 상황이 발생할 수 있는데,

각각의 경우에 대한 대응수단을 프로그램에 구현할 필요가 있다.

 

※ 아래는 미체결요청(opt10075)와 매도취소(SendOrder)에 대한 내용이다.

① 미체결요청(opt10075) 내용

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

 

② 매도취소(SendOrder)

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

 

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

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

springcoming.tistory.com


3. 코드 설명

  • 키움증권 OpenAPI에 접속/로그인
  • opt10075의 결과값(주문번호 등)을 받는 CommGetData에 매도취소 주문 실행문 작성

< 그림2-1. 로그인, SetInputValue 및 CommRqData 요청/입력 화면 >

 

※ 로그인 관련 내용은 생략한다.

 

21줄 ~ 22줄 : 계좌번호를 전역변수 선언하고, 변수에 계좌번호를 넣어준다.

31줄 ~ 36줄 : 67줄에서 전달하는 계좌번호와 종목코드를 받아주는 함수를 선언한다.                    

    * 33줄 전체종목구분(0은 전체 종목), 34줄 매매구분(0은 전체), 36줄 체결구분(1은 미체결)

37줄 : 31줄~36줄까지 서버에 입력한 데이터를, 키움서버에 요청한다.

 

< 그림2-2. 키움서버에서 데이터를 수신받기 위해 GetCommData 함수 및 SendOrder 실행 >

 

41줄 : 키움서버에서 수신받은 데이터를 변수에 담기 위해 함수 선언

42줄 : 수신받은 데이터(rqname)이 'opt_10075'이면

43줄 ~ 45줄 : 계좌번호, 코드번호, 주문번호(원주문번호가 아님), 주문수량 등 4가지를 받아온다.

 

48줄 : 이 글의 첫번째 핵심이다. 59줄에서 선언한 sendorder함수를 실행하라는 내용이다.

           같은 클래스에 있는, 각각 다른 함수(메서드 Method)를 활용하는 방법은,

           클래스명.함수(변수)를 넣어주면 된다.

          → 65줄에서 btl_system()를 btl에 인스턴스를 진행하였기 때문에,

               btl.함수명(변수)를 넣어주어서 매수 관련 명령어를 실행하는 것이다.

 

    ※ 48줄에서 1번째 인수(계좌번호)는 43줄에서 얻어왔고,

                        4번째 인수(숫자 4)는 "주문유형"으로 매도취소는 4번이다.

                        5번째 인수(코드번호)는 44줄에서 얻어왔고,

                        9번째 인수(주문번호)는 45줄에서 얻어왔다.

          → 즉, 매도취소를 위한 모든 인수를 얻어온 것이다.

 

54줄 ~ 57줄 : 이 글의 두번째 핵심이다. 46줄에서 받아온 미체결내역에서의 주문수량이다.

<그림2-3>에서 "주문량"을 말한다.

→ 영웅문 화면번호 0341에서는 실시간 미체결 내역을 볼 수 있다.

 

주문량이 0이상이면, "미체결 내역이 남아 있다"는 뜻이다

→ 더 정확하게 이야기 하면, "미체결 수량"을 체크해야 하지 않았나 생각된다.

     장이 진행되는 시간 동안, 급하게 "미체결 잔고"에서

     주문량 or 미체결수량으로 검사할지 고민했는데.... 지금 생각하면 약간 아쉽다.

 

     뭐, 기 제출한 내역이 취소되지 않으면, 주문량이든 미체결수량이든

     "주문번호"가 "미체결 잔고"에 남아있다는게 중요하기 때문에

      미체결주문의 존재 여부를 확인할 때 등 대세에는 지장없어 보인다.     

     (미체결 수량으로 바꾸어서 미체결수량이 0이상이면, 주문이 남았다고 보면 된다)

< 그림2-3. 실시간 계좌관리에서 확인한 결과, 매도주문이 아직 미체결 계좌에 남아있다 >

59줄 ~ 61줄 : 매수/매도/매수취소/매도취소 등을 위해 sendorder함수를 만든다.

                        → 48줄에서 실행한 sendorder 함수는 59~61줄에서 만든 함수이다.

67줄 : 31줄의 rq_dtat_opt10075 함수를 실행하기 위해

           계좌번호(deposit_num)와 종목명("067160")을 기재한다.

            (종목코드 067160은 아프리카TV)

 

위의 명령어대로 실행하면, 

화면번호 0341에는 당초 매도주문한 3주의 주문이 취소된다.

화면번호 0351에서 아프리카TV 3주가 OpenAPI에 의해 취소된 것을 알 수 있다.

 

< 그림2-4. 아프리카TV 매도주문이 취소된 화면 >

 

4. 마치며

이 글에서는 미체결 내역 조회하여,

미체결 내역이 있으면 "미체결내역"을 취소하는 내용이다.

   ※ 위에서 설명한 내용은 실시간 계좌잔고(화면번호 0341)에 주문이 있을 때

       실행해 보아도 되고,

       장마감이라도, 46줄에서 미체결수량 받는 내용으로 수정하여 실행하면,

        "미체결내역이 없습니다"라는 내용을 출력할 수 있을 것이다.

 

참고로, 정정주문은 시도해보지 않을 것이다.

정정주문보다는 취소 후 매도 주문을 해도 매매할 때 크게 지장이 없을 거 같다.

 

주식매매가 생각처럼 되면 얼마나 좋겠는가?

발생할 수 있는 모든 경우에 대응하지는 못하겠지만,

예측가능한 경우라면 어느정도 대응은 필요하다고 본다.

반응형