1. 들어가며
이전에는 키움증권 OpenAPI를 통해 키움서버에 로그인 하는 방법을 알아보았다.
이번 글에서는 로그인 후 키움증권 계좌의 예수금/주문가능금액을 구현하는 코드를 알아보자
※ 아래 계좌는 모의투자 계좌임을 미리 말씀드린다.
- 예수금 : 주식거래를 위해 증권사의 계좌에 입금한 금액을 말함
- 주문가능금액 : 계좌에 입금한 금액 중 구매한 주식금액을 제외하고 남은 금액(=투자가능금액)
2. KOA StudioSA에서 구현
- KOA StudioSA에서는 아래의 그림과 같이 TR 요청을 통해, 예수금 및 주문가능금액을 얻는다.
① 키움 서버에 요청하는 TR번호 : opw00001(예수금상세현황요청)
② opw00001(TR요청)을 위해 얻어오는 결과물(예수금, 주식가능금액)
③ TR을 키움 서버에 요청하는 코드
(③의 C++ 예제를, 파이썬으로 작성하는 경우 함수 앞에 dynamicCall을 붙여준다)
④ TR요청을 위해 입력하는 4가지 (계좌번호, 비번, 비번입력매체구분, 조회구분)
⑤ opw00001를 서버에 요청(③)하여, 결과물(⑤)을 얻었다.
3. 코드 설명
- 키움증권 OpenAPI에 접속/로그인
- 예수금/주문가능금액을 키움서버에 요청(opw00001)하여 데이터 수신
※ 주의할 점은 KOA StudioSA의 ⑤번에서 확인했듯이,
키움서버에서 받아오는 예수금 앞에 00000이 붙은 문자형(str)으로 받아온다.
→ 이 경우 lstrip("0")로 없애는 방법과 인수형(int)을 써서 변경하는 방법이 있는데,
여기서는 인수형(int)으로 써서 0000을 제거할 예정이다.
(주식 매매를 위해서는 언젠가는 str형을 int으로 고쳐주어야 하기 때문이다)
※ 로그인 관련 내용은 앞에서 이야기했으므로 생략한다.
https://springcoming.tistory.com/17
11줄~12줄 : 로그인 이벤트 및 trdataa_get이벤트를 연결해준다.
* 이벤트 : 사용자의 입력내용을 키움서버에서 수신받아서, 사용자에게 반환하는 것을 연결
21줄~27줄 : 사용자가 "예수금"과 "주문가능금액"을 받기 위해,
KOA StudioSA에서 입력을 요청한 4가지 작성하여, 키움서버에 요청
* 4가지 정보 : 계좌번호, 비밀빈호, 비밀번호입력매체구분, 조회구분
* dynamicCall 함수 : PyQt5에서 제공하며, 키움서버에 데이터를 송수신하는 기능이 있음
SetInputValue 함수 : 키움에서 제공하며, 사용자가 데이터를 받기 위해 필수 입력하는 내용
CommRqData 함수 : 키움에서 제공하며, SetInputValue에서 입력 내용을 키움서버에 전달
※ SetInputValue 함수 ① SetInputValue은 파이썬 주식자동매매 시스템에서 dynamicCall과 함께 쓰인다. ② KOA StudioSA에 의하면, SetInputValue 함수는 문자형의 2개 인자값이 필요 (C++ 기준) SetInputValue(“계좌번호”, “계좌번호 10자리) (파이썬 기준) dynamicCall(SetInputValue(QString,QString), “계좌번호”, deposit_name) ③ 즉, “계좌번호”로 설정된 내용에 deposit_name를 입력 ※ CommRqData 함수 ① CommRqData은 파이썬 주식자동매매 시스템에서 dynamicCall과 함께 쓰인다. ② KOA StudioSA에 의하면, CommRqData 함수는 문자형 3개와 인수형 1개가 필요 (C++ 기준) CommRqData(“요청내용”, “TR이름”, “연속조회여부”, “화면번호”) (파이썬 기준) dynamicCall("CommRqData(QString,QString,int,QString)", "opw00001", "opw00001", 0, "5982") * 화면번호(5982)는 임의로 지정가능 ③ 즉, “계좌번호”로 설정된 내용에 deposit_name를 입력했음을 키움서버에 알려준다. |
38줄~48줄 : TR요청에 대해 결과값을 받아온다
* GetCommData 함수 : 키움에서 제공하며, CommRqData를 통해 키움에 전달된 입력내용을
키움서버에서 이벤트(실행)되게 하고 나서, 결과값을 돌려줌
* 41~42줄 : KOA StudioSA에서 보듯이 많은 정보를 받아오는데,
필요한 2가지(예수금, 주문가능금액)만 변수에 담아서 출력한다.
※ GetCommData 함수 ① GetCommData은 파이썬 주식자동매매 시스템에서 dynamicCall과 함께 쓰인다. ② KOA StudioSA에 의하면, GetCommData 함수는 문자형 3개와 인수형 1개가 필요 (C++ 기준) GetCommData(“요청내용”, “TR이름”, “연속조회여부”, “요청명”) (파이썬 기준) dynamicCall("GetCommData(QString,QString,int,QString)", "rqname", "strcode", 0, "예수금") dynamicCall("GetCommData(QString,QString,int,QString)", "rqname", "strcode", 0, "주문가능금액") ③ 즉, 예수금과 주문가능금액을 받아온다. |
55줄 : 23~27까지의 SetInputValue에 들어갈 4가지 입력값을 넣어준다.
* 4가지 정보 : 계좌번호, 비밀빈호, 비밀번호입력매체구분, 조회구분
4. 전체코드
import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class btl_system():
def __init__(self):
self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
print("1")
self.kiwoom.OnEventConnect.connect(self.login_Connect)
self.kiwoom.OnReceiveTrData.connect(self.trdata_get)
print("2")
print("로그인 요청")
self.kiwoom.dynamicCall("CommConnect()")
self.login_event_loop = QEventLoop()
self.login_event_loop.exec_()
print("3")
def getdata1(self, deposit_name, pw, pw_mc, search5):
print("계좌번호 및 비밀번호 등을 입력/서버에 요청")
self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "계좌번호", deposit_name)
self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "비밀번호", pw)
self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "비밀번호입력매체구분", pw_mc)
self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "조회구분", search5)
self.kiwoom.dynamicCall("CommRqData(QString,QString,int,QString)", "opw00001", "opw00001", 0, "5982")
print("4")
def login_Connect(self, nErrCode):
if nErrCode == 0:
print('로그인 성공')
print("5")
else:
print('로그인 실패')
self.login_event_loop.exit()
def trdata_get(self, sScrNo, rqname, strcode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSplmMsg):
if rqname == 'opw00001':
print("6")
deposit_money = int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", rqname, strcode, 0, "예수금"))
invest_money = int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", rqname, strcode, 0, "주문가능금액"))
print("7")
print(deposit_money) # 결과값 출력하는 곳
print(invest_money) # 결과값 출력하는 곳
print("예수금은 {}입니다.". format(deposit_money)) # 결과값 출력하는 곳
print("주문가능금액은 {}입니다.".format(invest_money)) # 결과값 출력하는 곳
if __name__ == "__main__":
app = QApplication(sys.argv)
btl = btl_system()
print("10")
btl.getdata1("계좌번호 10자리", "0000", "00", "2")
print("11")
app.exec_()
5. 마치며
로그인 후 예수금과 주문가능금액을 받아오는 코드를 구현해 보았다.
주의해야 할 점은 KOA StudioSA에서 반환해주는 값은 문자형(str)으로 제공해 주기 때문에,
향후 인수형(int)으로 바꾸어 주어야 한다. (41줄~42줄)
그리고 전체코드(4번)에는 본인의 계좌번호를 넣어주면 된다.
키움에서 제공하는 opw00001 TR요청 본인에게 필요한 내용은
41줄~42줄의 "예수금"과 "주문가능금액"만 바꾸면
얼마든지 응용할 수 있을 것이다.
'1. 국내주식 > 1-2. 키움 OpenAPI (사용)' 카테고리의 다른 글
(주식 자동 매매) 키움증권 OpenAPI - 1분봉 데이터 실시간 받기(opt10080) (2) | 2022.10.05 |
---|---|
(주식 자동 매매) 키움증권 OpenAPI - SendOrder함수를 이용하여 매수/매도하기 (0) | 2022.10.01 |
(주식 자동 매매) 키움증권 OpenAPI 매수한 4종목의 매수가격, 매수량 받아오기(opt10085) (0) | 2022.09.28 |
(주식 자동 매매) 키움증권 OpenAPI 종목의 현재가를 전역변수에 담기(opt10001) (0) | 2022.09.27 |
(주식 자동 매매) 키움증권 OpenAPI 4종목 현재가 조회(opt10001) (0) | 2022.09.26 |
(주식 자동 매매) 키움증권 OpenAPI 현재가 조회(opt10001) (0) | 2022.09.25 |
(주식 자동 매매) 키움증권 OpenAPI 로그인 (0) | 2022.09.21 |
(주식 자동 매매) 키움증권 OpenAPI/KOAStudio 설명 (1) | 2022.09.18 |