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

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

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

 

 

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

 

저번 시간에는 로그인 상태를 확인하고, 개인정보를 조회하고 로그아웃하는 방법을 알아보았습니다. 오늘은 예수금을 조회하는 방식을 소개하겠습니다.

 

 

트랜잭션과 화면 번호의 개념

이번 포스팅에서 반드시 알고가야하는 두 가지 개념이 있습니다. 전자는 트랜잭션(TR)이고, 후자는 화면 번호입니다.

 

사실 트랜잭션은 DB에서도 쓰이는 용어로, 키움증권 api에서는 트랜잭션을 '서버와 데이터를 주고받을때 정의한 약속된 규약이며 입력 부분(Input)과 데이터를 수신하는 출력 부분(Output)을 가지고 있는 것.이라고 설명하고 있습니다. 이때, 트랜잭션 요청 한 번으로 조회할 수 있는 데이터를 싱글 데이터라고 하고, 여러 번 반복해서 요청해야하는 데이터를 멀티 데이터라고 합니다.

 

 

화면 번호는 키움증권 api에 따르면 아래와 같습니다.

 

화면번호는 서버에 조회나 주문등 필요한 기능을 요청할때 이를 구별하기 위한 키값으로 이해하시면 됩니다. 0000(혹은 0)을 제외한 임의의 숫자를 사용하시면 되는데 개수가 200개로 한정되어 있기 때문에 이 개수를 넘지 않도록 관리하셔야 합니다. 만약 사용하는 화면번호가 200개를 넘는 경우 조회 결과나 주문 결과에 다른 데이터가 섞이거나 원하지 않는 결과가 나타날 수 있습니다.

 

 

트랜잭션 요청을 이용한 통신 처리 과정 - KOA Studio 실습

이전에 설명하였던 시그널, 이벤트, 슬롯보다 약간 더 복잡합니다. 트랜잭션을 이용한 통신 처리 과정을 바로 설명하기보다는, KOA Studio로 트랜잭션 요청을 해 봅시다.

 

 

 

 

위 사진과 같이 좌측 하단에 있는 [TR 목록]을 클릭하면, opt10001, opt10002, ... 와 같은 트랜잭션 목록이 쭉 나옵니다.

 

여기서, opw00001을 검색해 봅니다.

 

 

 

 

그렇다면, 왼쪽에 'opw00001 : 예수금상세현황요청'이 보일 것이고, 오른쪽에는 사용 방식이 나와 있습니다. 이제, 좌측 상단에 있는 [파일] - [Open API 접속]을 누르셔서 로그인을 합니다.

 

 

 

 

로그인이 끝났다면, 소스코드 오른쪽에 있는 속성창을 봅니다. 여기에 적절한 입력값을 주고, 조회를 누르면 트랜잭션 요청에 의한 싱글데이터를 얻어올 수 있습니다.

 

계좌번호에는 본인의 계좌번호를, 비밀번호는 " " (공백)을, 비밀번호입력매체구분에는 00을, 조회구분에는 2를 입력하고, 조회를 누릅니다. (참고로, 비밀번호는 실제 비밀번호로 넘겨도 되고 안 넘겨도 됩니다.)

 

 

 

 

이렇게 정상적으로 조회가 성공하였습니다. 여기서 주의깊게 보셔야하는 부분은 금액에 앞부분이 0000...으로 채워진다는 점입니다. 추후에 소스코드에서 int() 함수를 통해 문자열을 정수로 바꿔야 앞의 0000..이 사라집니다.

 

 

트랜잭션 요청을 이용한 통신 처리 과정 - 이론

위에 실습 과정을 통해 트랜잭션 요청이 무엇인지 대충 감은 잡으셨을 듯합니다. 이제는 실제로 소스코드를 작성해야하는데, 그전에 트랜잭션 요청을 이용한 통신 처리 과정을 살펴보겠습니다.

 

먼저, 어떠한 트랜잭션을 요청할 것인지 트랜잭션의 종류를 선택합니다. 만약, 예수금상세현황요청인 opw00001을 선택한다면, 필요한 입력값인 계좌번호, 비밀번호, 비밀번호입력매체구분, 조회구분을 기억해 둡니다.

 

그리고 SetInputValue() 함수를 이용하여 위에서 말한 입력 정보를 입력하고, dynamicCall() 함수를 통해 서버에 데이터를 전송합니다.

 

이후, 요청하려는 트랜잭션의 정보를 CommRqData() 함수에 작성하고, dynamicCall() 함수를 통해 서버에 데이터를 전송함으로써 트랜잭션을 요청합니다. 키움 서버에서는 이제 트랜잭션의 코드를 참조해서 개발자가 어떤 데이터를 요청하는지 판단한 다음, 요청한 데이터를 접근하기 위한 트랜잭션의 입력값들이 잘 적혀있는지 확인합니다.

 

마지막으로, 위 과정이 성공적으로 진행되었다면 키움 서버에서 요청한 데이터를 찾아서 OnReceiveTrData() 이벤트가 발생시킵니다. 그리고 이 이벤트가 끝나기 전에 슬롯을 통해 데이터를 획득할 수 있는데, 이 슬롯 내부에서 GetCommData() 함수를 활용해야합니다.

 

 

설명 자체는 길어서 난해해 보이는데, 막상 함수를 하나 하나 살펴보고 소스코드를 작성한다면 어렵지 않습니다.

 

 

트랜잭션 요청을 이용한 통신 처리 과정 - 사용될 함수

 

 

SetInputValue() 함수는 인자가 2개가 있고, 전자는 Input의 이름, 후자는 입력값입니다. 예를 들어, 조회구분을 입력해야한다면, SetInput("조회구분", "2")와 같이 인자로 주어야한다는 것입니다. 이때, SetInputValue()의 인자의 자료형을 보면, BSTR인데 이것은 String에 해당합니다. 따라서, 조회구분할 때 sValue로, 2가 아닌 "2"로 설정해야합니다.

 

 

 

 

CommRqData() 함수는 실제로 트랜잭션을 요청하는 함수입니다. 인자로는 총 4개가 있는데 하나씩 살펴보겠습니다.

 

sRQName은 사용자구분명이라고 되어 있는데 별 거 아니고, 내가 무엇을 요청한건지 구분하기 위해서 이름을 붙여주는 것입니다. sTrCode는 opw00001과 같은 트랜잭션 코드이고, nPrevNext은 연속 조회 여부입니다. nPrevNext의 값이 0이면 한 번만 조회하는 것이고, 2는 연속 조회하는 것인데, 조회할 페이지가 여러 개 있다면 2로 설정해야합니다. 마지막으로, sScreenNo는 화면 번호이고, 우리가 임의의 4자리를 넣어주면 됩니다. 여기서도 자료형이 nPrevNext 외에 모두 String이라는 것에 유의하셔야 합니다.

 

 

 

 

CommRqData() 함수를 통해 트랜잭션 요청을 성공적으로 하였다면, OnReceiveTrData() 이벤트가 발생합니다. 이 이벤트 과정에서 요청 결과를 받아오려면 인자로 슬롯을 넘겨야합니다. 그리고 슬롯에는 위 이벤트의 적절한 인자를 넣어주어야 합니다.

 

사용하는 인자로는 sSCrNo, sRQName, sTrCode, sRecordName, sPrevNext가 있습니다. 우리가 사용한 트랜잭션에 따르면, sRecordName만 빈 값이고, 나머지는 CommRqData의 인자들이 그대로 들어오게 될 것입니다.

 

다만, 여기서 sPrevNext가 문자열입니다. 그래서 CommRqData() 함수의 인자로 사용한 nPrevNext는 long이어서 문제가 되지 않을까싶었는데 프로그램은 잘 작동하였습니다. 이 부분은 멀티데이터때 자세히 설명하겠습니다.

 

 

 

 

이제, GetCommData() 함수를 통해 원하는 데이터를 얻어올 수 있습니다. 슬롯에서 이 함수를 사용하면 됩니다. 만약, 싱글데이터 중 "예수금" 정보를 갖고오고 싶다면, GetCommData(sTrCode, sRQName, 0, "예수금")과 같이 인자를 설정하는 것입니다. 지금은 싱글데이터만을 다룰 것이기때문에 nIndex는 0으로 지정하시면 됩니다.

 

 

 

 

마지막으로 이전에 사용하였던 화면 번호로 설정한 실시간 데이터를 해지해 주어야 합니다. 인자는 화면 번호이고, 단순히 dynamicCall() 함수를 통해 서버에 요청하면 됩니다.

 

 

정리

지금까지 트랜잭션 요청하는 과정과 사용될 함수에 대해 알아보았습니다. 실제 소스코드 작성은 다음 포스팅에서 하겠습니다.

 

 

출처

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

 

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

 

(깃허브) github.com/programgarden

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

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

댓글

추천 글