본문 바로가기
파이썬으로 주식 거래 시스템 구축

CHAPTER 4. 계좌 정보 가져오기 두 번째 이야기

by Dimas 2020. 7. 6.

저번 게시글에서는 키움 프로그램에 로그인하여 계좌번호를 받아왔다.

이번 게시글은 저번 게시글에 이어 예수금 정보를 가져오는 과정을 진행한다.

 

KOAStudio에서 좌측 하단에 보면 TR 목록 이 있다. 여기서 TR은 '트랜잭션'을 의미한다.

트랜잭션 목록을 살펴보면 코드 오른쪽에 트랜잭션의 이름이 나와 있다.

우리는 이들 중에서 'opw00001 : 예수금상세현황요청' 트랜잭션을 사용한다.

opw00001 트랜잭션의 OUTPUT에는 '싱글데이터'와 '멀티데이터'가 있는데 트랜잭션 요청 한 번으로 조회할 수 있으면 '싱글데이터', 주식의 일봉, 주봉 데이터 등과 같이 트랜잭션 요청 한 번으로는 받아올 수 없는 데이터는 '멀티데이터'이다.

멀티데이터를 요청하는 과정은 싱글데이터보다 복잡하고, 여러 단계를 거쳐야 한다.

먼저 무엇을 요청할 것인지 정보들을 작성한다. 여기서 작성한 정보들은 dynamicCall을 이용하여 시그널을 보내면 키움 서버는 어떤 요청인지 인식을 한다.

다음으로 계좌번호와 같은 기본적인 정보들을 작성한다. 코드에서는 SetInputValue 함수에 기본적인 정보들을 입력한다.

마지막으로 요청하고자 하는 트랜잭션의 코드를 CommRqData 함수에 작성하고, dynamicCall을 이용해 키움 서버로 요청한다.

책에서는 이러한 정보들을 작성하는 과정을 '전문을 작성한다' 라고 말하며, '전문'으로 표기하기로 하였다.

두 번째 단계에서 말한 기본적인 정보들은 속성을 참고하면 될 것 같다.

 

KOA Studio에서 예수금 싱글데이터 확인하는 방법은 책을 참고하도록 하자. 

 

KOA Studio에서 예수금을 조회했던 과정을 파이썬 코드로 작성한 것이다.

detail_account_info 함수는 예수금 요청 시그널을 포함하는 함수다.

함수의 인자에는 sPrevNext를 사용하는데, "0"은 첫 페이지를, "2"는 다음 페이지를 의미한다. 초기 값은 "0"으로 설정하였으며, 조회할 데이터가 더 있다면 sPrevNext를 "2"로 변경해서 받아야 한다.

만약 받아올 데이터가 25개, 한 페이지에 출력되는 데이터가 20개라면 "0"으로 설정하여 20개를 받아오고, "2"로 변경하여 다시 요청해서 나머지 5개를 받아오면 된다.

이어서 살펴볼 것은 SetInputValue 이다. SetInputValue는 KOA Studio에서 조회할 때 봤던 함수다. 이 함수는 두 개의 인자를 받으며, 그에 맞춰서 "계좌번호", self.account_num과 같은 형태로 데이터를 할당한다.

opw00001 트랜잭션에 있던 기본 정보들을 SetInputValue에 입력하여 전문을 완성한다.

모의 투자는 비밀번호가 0000으로 통일되어 있고, 비밀번호입력매체구분 역시 00으로 통일된 값을 작성하고 조회구분을 입력한다. 조회 구분은 추정조회와 일반조회가 있는데, 모든 거래대금 정산이 이뤄지는 예수금을 얻기 위해 추정조회를 의미하는 "1"을 입력한다.

서버로 TR 요청을 보낼 때는 CommRqData를 이용하고 인자로는 3개의 String과 1개의 int를 담아서 보낸다.

책의 설명도 좋지만 완벽한 이해를 위해 키움 API 사이트에서 메서드 설명을 가져왔다. ( https://download.kiwoom.com/web/openapi/kiwoom_openapi_plus_devguide_ver_1.1.pdf )

sRQName은 TR 설명(opw00001 에서는 '예수금상세현황요청')을 적는 건 줄 알았는데 책을 보니 정해진 게 아니며 원하는 대로 작성하는 요청 이름이다. 라고 나와있는 걸 보면 내가 식별할 수 있게끔 변경해도 괜찮은 것 같다. 어쩌면 DB에서 필드의 이름을 As로 바꾸는 느낌일까 싶다.

이젠 키움 서버로 TR을 요청했으니 반환된 데이터를 받아줄 슬롯이 필요하다. KOA Studio의 [개발가이드] - [조회와 실시간 데이터처리]에 있는 OnReceiveTrData 함수를 사용한다.

event_slots 메소드에 추가한다.
KOA Studio에서 찾은 OnReceiveTrData() 함수

솔직히 일단 책 보고 따라 썼는데 무슨 얘기인지 모르겠다. 영어를 몰라서 그런가..

OnReceiveTrData() 함수의 인자들인 sScrNo, sRQName, sTrCode, sRecordName, sPrevNext가 전달된다.

sRQName은 내가 설정하면 된다고 했었는데 여기서 작성하거나 보기 편하게 설정하면 되는 것 같다.

GetCommData를 이용해 예수금을 받아온 후 (KOA Studio에서 보았듯이 00000001000000처럼 앞에 0이 무수히 많이 들어있다) 값을 int형으로 형변환 시켜준다.

GetCommData 메소드 설명

예수금 중 얼마나 사용할지 비율을 정하고

self.use_money = float(self.deposit) * self.use_money_percent

use_money_percent 가 실수형이니까 맞춰준 것 같다. 참고로 use_money_percent 는 __init__() 함수에서 미리 선언한 바 있다.

예수금 중 사용할 금액들 또한 4 종목 이상 매수할 수 있게 4로 나누어줬다.

동일한 방법으로 출금가능금액 까지 받아온 후 현재까지 코드의 출력 결과는 다음과 같다.

책에서는 계좌번호가 안 나오고 예수금상세현황요청 이라는 sRQName이 나왔지만 책을 따라한 내 코드에는 어느 곳에도 저 부분을 프린트하는 코드는 없었다. 책을 다시 훑어봤지만 저걸 출력하는 코드가 없어서 그냥 이대로 가기로 했다. print 하나 잘못되었다고 프로그램이 문제 되진 않으니 말이다.

암튼 예수금을 안전하게 수신했다면 스크린 번호를 지워야 한다. 그렇지 않으면 키움에서 해당 스크린 번호를 계속 인식하고 있기 때문에 불필요한 요청인 상태로 남아있기 때문이란다. 요청했던 스크린 번호의 연결을 끊을 때는 DisconnectRealData(String) 함수를 사용한다.

 

이번 게시글은 여기까지다. 지금까지 구현한 kiwoom.py의 전체 코드는 다음과 같다.

이거 캡쳐하느라 모니터 설정 세로로 변경하고 몸 기울여서 겨우 한 장으로 캡쳐했는데 혹시 스크롤 아래로 내려가면서 캡쳐할 수 있는 프로그램 아시는 분은 댓글 부탁드립니다 ㅠㅠ

 

한 장으로 담기 위해서 위에 import부분과 class 선언 부분은 제외하였습니다.

 

오늘은 여기까지...

 

이 카테고리 게시글들은 아래 책을 따라하는 후기로, 자세한 내용은 아래 책과 저자의 유튜브를 참고하시고, 예제소스는 저자의 깃헙에서 확인하실 수 있습니다.

책 정보 : https://book.naver.com/bookdb/book_detail.nhn?bid=16330702

 

손가락 하나 까딱하지 않는 주식 거래 시스템 구축(위키북스 프로그래밍 & 프랙티스 시리즈 23)

매일 주식만 바라보던 일상에서 해방되어 가족 또는 친구들과 행복한 시간을 보내길 바랍니다!24시간 자동으로 주식을 분석하고 거래하는 시스템을 구축하는 방법을 배우고 나머지 시간은 더 ��

book.naver.com

 

저자 유튜브 : www.youtube.com/watch?v=1lHzaihEb48&list=PLDtzZPtOGenaSknTbsb6x6L39V0VPz_rS&index=2&t=0s

( 위 유튜브는 이 책을 설명해주는 재생목록의 첫 번째 영상입니다.)

 

저자 Github : https://github.com/programgarden

 

programgarden - Overview

책 : 24시간 운영 가능한 주식투자 시스템 구축하기[파이썬으로 만드는 자동 트레이딩 시스템] 유튜브: 프로그램 동산 학습코드 자료입니다. - programgarden

github.com

예제 소스는 저자의 깃허브에서 확인하실 수 있습니다.

 

위 3개의 링크는 매 게시글마다 올라갈 예정입니다.