개발 이야기/주식 자동 매매 프로그램

키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - 미체결 내역 조회 [Python]

제이온 (Jayon) 2021. 1. 25.

 

 

안녕하세요? 코딩중독입니다.

 

저번 시간에는 계좌평가잔고내역요청의 멀티데이터를 얻어오는 방법에 대해서 알아 보았습니다. 오늘은 미체결 내역을 조회하는 시간을 가져보겠습니다.

 

 

미체결 내역을 꼭 불러와야 할까?

사실, 주식을 어느정도 해 보신 분이라면 증권 어플에서 체결이 안 된 종목은 장이 끝나면 자동으로 취소해 준다는 사실을 알고 계실 겁니다. 하지만, 우리가 개발하려는 주식매매프로그램은 문제가 생겨서 장 중에 종료가 될 수 있습니다. 이때, 미체결 정보를 모르고 있다면 이어서 종목을 거래할 수가 없게 됩니다.

 

가령, 오전 10시에 삼성전자를 87,000원에 10주 매수하려고 하였으나, 오전 11시까지 3주밖에 매수를 못한 상황입니다. 하지만, 그래도 7주는 매수하려고 존버 중에 있습니다. 이때, 프로그램이 문제가 생겨서 종료되어 재시작한다면, 삼성전자를 7주 매수하려는 데이터는 증발하게 됩니다. 따라서, 프로그램이 시작할 때마다 미체결 내역을 얻어오고 거래를 이어서 할 수 있게끔 만들어 주어야 합니다.

 

 

KOA Studio 실습

KOA Studio를 실행하시고, 로그인한 다음에 TR 목록에 "실시간미체결요청"이라고 검색합시다.

 

 

 

 

위 사진과 같이 TR이 검색되는데, 중요한 점은 OUTPUT이 멀티데이터만 존재한다는 것입니다. 저번 시간에 했던 것과 마찬가지로 sPrevNext가 0인지 2인지 판단하여 연속조회하는 패턴을 반복하면 됩니다.

 

 

 

 

INPUT은 총 5가지로, 계좌번호, 전체종목구분, 매매구분, 종목코드, 체결구분이 있습니다. 여기서 전체종목구분을 0으로 하게 되면 모든 종목을 검사하는 것이므로 종목코드는 입력할 필요가 없습니다. 그 외에, 매매 구분은 0, 체결 구분은 1로 입력값으로 주시면 되겠습니다.

 

 

 

 

이런식으로 멀티 데이터가 나오는데, 우리는 여기서 주문번호, 종목코드, 종목명, 주문구분, 주문가격, 주문수량, 미체결수량, 체결량, 현재가, 주문상태에 대한 데이터를 가져올 것입니다.

 

제가 위에서 미체결된 아난티를 보면, 주문번호가 0054772, 종목코드는 025980, 주문구분은 +매수, 현재가는 -8210으로 되어있는 것을 알 수 있습니다. 여기서 주문번호는 앞에 쓸데없이 0이 붙었으므로 int() 처리를 하고, 주문구분과 현재가는 +와 -는 불필요하므로 모두 strip()을 통해 제거해 주면 됩니다.

 

 

전체 소스코드

 

 

__init__()

 

 

__init__()에서 달라진 점은 3가지가 있습니다.

 

첫 번째는 계좌 관련 이벤트 루프를 하나로 통합했다는 것입니다. 화면 번호도 돌려 쓰듯이, 이벤트 루프도 account_loop 하나만 가지고 계좌 번호, 예수금, 계좌평가잔고내역, 미체결내역을 받아올 때 사용하셔도 됩니다.

 

참고로, VS CODE에서 특정 문자열을 갖고 있는 모든 문자열을 다른 문자열로 대체할 때는 [CTRL] + [SHIFT] + [L]을 이용하시면 됩니다. 원하는 문자열을 드래그한뒤, [CTRL] + [SHIFT] + [L]을 누르시면 하나의 파일 내의 드래그한 문자열들이 선택되고, 드래그한 문자열을 다른 문자열로 수정하면 모두 일괄 수정이 됩니다. (출처 : hianna.tistory.com/360)

 

두 번째는 미체결 내역을 받아올 딕셔너리 변수가 정의되었고, 세 번째는 미체결 내역을 얻어오는 함수가 추가되었습니다.

 

 

트랜잭션 요청 함수

 

 

not_signed_account() 함수는 아까 실습때 설명드린 것과 동일하게 입력값을 설정하면 됩니다. 중요한 점은 이벤트루프를 중복해서 실행하면 안되므로 isRunning() 함수를 통해 한 번만 작동하게 해야합니다.

 

 

 

 

형식은 계좌평가잔고내역요청의 멀티데이터를 가져오는 것과 똑같습니다. 처음에 GetRepeatCnt() 함수를 통해 미체결 종목이 몇 개가 있는지 확인하고, 그 횟수만큼 원하는 데이터를 GetCommData() 함수를 이용하여 가져옵니다. 그리고 key 값을 주문번호로 하여 딕셔너리에 값을 넣어주는 것이죠. 이때, key를 종목코드가 아닌 주문번호를 한 이유는 동일한 종목에 대해서 다른 주문 번호로 미체결 데이터가 생길 수 있기 때문입니다. 마지막으로, 연속조회할 필요가 없다면 화면 번호를 끊어주고 이벤트 루프를 종료합니다.

 

제가 참고한 책에 따르면 GetRepeatCnt() 함수를 통해 한 번에 가져올 수 있는 최댓값은 100이라고 합니다.

 

출력 과정 (선택)

이 부분도 제가 출력을 이쁘게 하기 위하여 beautifulTable 라이브러리를 사용하였습니다. 굳이 표로 만들지 않으실 분은 자유롭게 출력하셔도 됩니다.

 

 

 

 

먼저, 기존에 있던 make_table() 함수의 구조를 살짝 바꿨습니다. 인자로 sRQName을 넘겨서 그 값에 따라 테이블의 형태가 바뀌도록 설계하였습니다.

 

표에서 종목코드는 필요하지 않을 것 같아서 그 외에 9가지 데이터를 넣어주고, 주문번호를 기준으로 오름차순 정렬하였습니다.

 

 

출력 결과

 

 

미체결 내역을 조회하는 메뉴가 추가되었습니다. 한 번 5번을 입력하여 메뉴를 실행해 봅시다.

 

 

 

 

멀티 데이터인 미체결 내역이 잘 출력되는 것을 보실 수 있습니다.

 

 

추가로 장이 끝나자마자 미체결 내역이 사라지지는 않고, 다음 날이 되어야 미체결 내역이 사라집니다.

 

 

 

 

정리

지금까지 실시간미체결내역을 조회하는 방법을 알아보았습니다. 그리고 오늘의 포스팅으로 이미 있는 계좌 정보를 받아오는 작업은 끝났습니다. 다음 시간부터는 그랜빌의 매수신호 4법칙을 이용하여 유망한 종목으로 포트폴리오를 구성해 보겠습니다.

 

 

수정 사항

계좌 담당 이벤트 루프 변수명을 account_loop라고 위에서 설명하였는데, account_event_loop로 수정하였습니다.

 

 

출처

프로그램 동산(장용준)님이 집필하신 '손가락 하나 까딱하지 않는 주식 거래 시스템 구축' 교재를 참고하여 작성하였습니다.

 

그 외에 프로그램 동산님은 깃허브, 카페, 유튜브를 운영 중이십니다. 굉장히 도움이 되는 내용이 많으니 참고하셔도 좋을 것 같습니다.

 

(깃허브) github.com/programgarden

(유튜브) www.youtube.com/channel/UCq7fsrxP6oi6vnYgPkw92jg

(네이버 카페) cafe.naver.com/programgarden

댓글

추천 글