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

키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - 예수금 조회 (2) [Python]

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

 

 

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

 

저번 시간에는 예수금 조회를 하기 위한 이론적인 내용을 알아 보았습니다. 오늘은 본격적으로 소스코드를 작성해 보겠습니다.

 

 

전체 소스코드

 

 

__init__()

 

 

__init__()에서 달라진 점은 몇 가지가 보입니다.

 

전에 로그인을 하는 과정에서 이벤트 루프를 수행하였는데, 트랜잭션을 요청할 때도 반드시 이벤트 루프를 걸어줘야합니다. 그리고 예수금 관련 변수와 화면 번호 변수가 추가되었습니다. 마지막으로, 초기 작업에 예수금 관련된 정보를 얻어오는 함수가 생겼네요.

 

 

event_collection()

 

 

제가 전에 로그인 과정을 설명할 때는 이러한 이벤트와 슬롯을 연결하는 코드를 login()에 넣었습니다. 하지만, 트랜잭션 요청을 할 때에도 이벤트와 슬롯이 연결해 주어야하므로 get_deposit_info() 함수에 넣기보다는 차라리 이벤트와 슬롯을 연결하는 담당 구역을 만들자고 생각하여 event_collection() 함수를 정의하였습니다.

 

 

트랜잭션 요청 함수

 

 

우리는 opw00001에 해당하는 '예수금상세현황요청'에 대한 요청 결과를 받아오고 싶습니다. 먼저, 이것의 입력값이 무엇인지 판단해야합니다. 저번 시간에 봤듯이, 입력값으로는 계좌번호, 비밀번호, 비밀번호매체구분, 조회구분이 있습니다. 이것들을 SetInputValue() 함수를 사용하여 서버에 데이터를 송신하면 됩니다.

 

적절한 입력값들을 모두 서버에 데이터를 송신하였다면, 이제 CommRqData() 함수를 통해 트랜잭션 요청을 하면 됩니다. 그리고 이 이후에 반드시 이벤트 루프를 수행하셔야 합니다. 안그러면 이벤트 함수를 호출하기 전에 데이터 흐름이 꼬일 수 있습니다. 트랜잭션을 요청하면, OnReceiveTrData()에서 이벤트가 발생하여 tr_slot() 함수로 요청 결과를 획득할 수 있습니다. 그리고 이 tr_slot() 안에서 GetCommData() 함수를 사용하여 트랜잭션의 OUPUT 중 원하는 데이터만 가져올 수 있습니다. 저는 예수금,  출금가능금액, 주문가능금액만 필요해서 3가지만 뽑아 왔습니다. 물론, 자율적으로 더 필요한 정보를 가져오셔도 괜찮습니다. 원하는 데이터를 모두 가져왔으면 이벤트 루프를 해제합니다.

 

참고로, tr_slot에서 sScrNo는 "1000", sRQName은 "예수금상세현황요청", sTrCode는 "opw00001", sRecordName과 sPrevNext는 빈 값으로 날아옵니다. 여기서 sRecordName은 인자로 넘긴 것이 없으니 빈 값인건 그렇다치더라도 sPrevNext는 "0"이 아니라 빈 값인 ""으로 날아온 것은 조금 의아합니다. 이것은 현재 조사 중에 있으나, 원인을 알고 계시는 분은 댓글로 남겨 주시면 감사하겠습니다.

 

어쨌거나 우리는 싱글데이터만 다루고 있으므로, GetCommData()의 nIdx 인자는 0으로 넘기면 첫 페이지만 조회하는 것이라서 괜찮습니다.

 

마지막으로, 사용한 화면 번호를 cancel_screen_number() 함수를 통해 끊어내면 됩니다.

 

 

출력 결과

글씨가 좀 잘 보이게 하기 위해서 콘솔로 접속하였습니다. 참고로, VS CODE에서는 [CTRL] + [SHIFT] + [C]를 누르면 콘솔이 열리며, "python main.py"라고 입력하면 메인 함수가 실행됩니다.

 

 

 

 

여기서 메뉴의 이름을 조금 바꿨습니다. 개인 정보 조회라는 표현이 어색하게 느껴져서 사용자 정보 조회정도로 수정하였습니다. 물론 이것은 개인 취향이므로 자유롭게 설정하시길 바랍니다.

 

그 다음, 3번을 입력합니다.

 

 

 

 

잘 나오는군요. 이렇게 예수금, 출금 가능 금액, 주문 가능 금액이 출력되면 성공입니다.

 

 

프로그램 실행 중 생기는 오류

(1) code runner

간혹가다 VS CODE에서 code runner로 실행하면 읽기 전용이라고 입력을 못하는 경우가 있는데, 설정을 하나 해 주시면 됩니다.

 

먼저, 좌측 상단 [File] - [Preferences] - [settings]에 들어갑니다. 그리고 입력창에 "code-runner.runInTerminal"라고 검색합니다.

 

 

 

 

여기서 아래 체크 박스에 체크해 주면 code runner 상에서도 입력이 가능합니다.

 

 

(2) 조회에 사용한 계좌비밀번호를 입력하십시오. (44)

이건 SetInputValue()의 인자로 직접 비밀번호를 넘기신 분에 해당할 것 같습니다. 보통 모의투자 계좌는 비밀번호가 "0000"인데, 이것을 그대로 인자로 넘기면 오류가 발생할 수도 있습니다. 그럴 때는 저처럼 비밀번호를 공백으로 넘기시거나, 직접 계좌 비밀번호를 설정해 주셔야 합니다.

 

계좌 비밀번호 설정은 KOA Studio에서 하셔도 되고, 코드를 실행하셨을 때 해도 됩니다. 둘 중에 뭘하든 우측 하단에 보면 키움api 아이콘이 보입니다.

 

 

 

 

이 네모박스 친 곳에 마우스 우클릭한다음 [계좌비밀번호 저장]을 누릅니다.

 

 

 

 

여기서 원하시는 비밀번호 4자리를 입력하고, [등록] 버튼을 누르고 AUTO를 체크하고 닫기를 눌러줍니다. 이상하게, AUTO 체크를 안하면 비밀번호 등록이 안 되어 있더라고요. 참고로, 이 과정을 하게 되면 로그인할 때마다 비밀번호를 치지 않아도 자동으로 로그인됩니다.

 

 

정리

지금까지 예수금을 조회하는 소스코드를 작성해 보았습니다. 다음 시간에는 우리가 투자한 금액의 수익률을 보여주는 계좌평가잔고내역에 대한 내용을 다룰 것입니다. 보통, 증권 어플에 보면 계좌잔고 혹은 계좌 탭에 들어갔을 때, 본인의 수익률과 매수한 종목들의 매수 금액과 수익률을 보여 줍니다. 저는 이것을 구현하는 것이 목표입니다.

 

또한, 키움증권 api에서는 직접 확인 결과 한 페이지에 데이터를 20개까지만 조회가 가능하다는 것을 알게 되었습니다. 계좌평가잔고내역은 싱글 데이터와 멀티 데이터를 모두 다룰 것이기때문에 다음 포스팅을 읽기 전에 꼭 모의투자 계좌에 21개 이상의 서로 다른 종목을 매수해 두시길 바랍니다.

 

 

출처

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

 

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

 

(깃허브) github.com/programgarden

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

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

댓글

추천 글