1. 국내주식/1-2. 키움 OpenAPI (사용)

(주식 자동 매매) 키움증권 OpenAPI 예수금/주문가능금액 조회 (opw00001)

봄이오네 2022. 9. 22. 08:15
반응형

1. 들어가며

이전에는 키움증권 OpenAPI를 통해 키움서버에 로그인 하는 방법을 알아보았다.

이번 글에서는 로그인 후 키움증권 계좌의 예수금/주문가능금액을 구현하는 코드를 알아보자

 ※ 아래 계좌는 모의투자 계좌임을 미리 말씀드린다.

  • 예수금            : 주식거래를 위해 증권사의 계좌에 입금한 금액을 말함
  • 주문가능금액 : 계좌에 입금한 금액 중 구매한 주식금액을 제외하고 남은 금액(=투자가능금액)

2. KOA StudioSA에서 구현

  • KOA StudioSA에서는 아래의 그림과 같이 TR 요청을 통해, 예수금 및 주문가능금액을 얻는다.

    ① 키움 서버에 요청하는 TR번호 : opw00001(예수금상세현황요청)

    ② opw00001(TR요청)을 위해 얻어오는 결과물(예수금, 주식가능금액)

    ③ TR을 키움 서버에 요청하는 코드

        (③의 C++ 예제를, 파이썬으로 작성하는 경우 함수 앞에 dynamicCall을 붙여준다)

    ④ TR요청을 위해 입력하는 4가지 (계좌번호, 비번, 비번입력매체구분, 조회구분)

    ⑤  opw00001를 서버에 요청(③)하여, 결과물(⑤)을 얻었다.

< opw00001을 통해 예수금, 주문가능금액 조회 >


3. 코드 설명

  • 키움증권 OpenAPI에 접속/로그인
  • 예수금/주문가능금액을 키움서버에 요청(opw00001)하여 데이터 수신

    ※ 주의할 점은 KOA StudioSA의 ⑤번에서 확인했듯이,

       키움서버에서 받아오는 예수금 앞에 00000이 붙은 문자형(str)으로 받아온다.

       → 이 경우 lstrip("0")로 없애는 방법과 인수형(int)을 써서 변경하는 방법이 있는데,

            여기서는 인수형(int)으로 써서 0000을 제거할 예정이다.

            (주식 매매를 위해서는 언젠가는 str형을 int으로 고쳐주어야 하기 때문이다)

< 그림1. 계좌번호 입력 등 요청함수 >
< 그림2. 예수금과 주문가능금액을 받아오는 함수 >
< 그림3. 함수 실행의 결과값 (모의계좌) >

※ 로그인 관련 내용은 앞에서 이야기했으므로 생략한다.

https://springcoming.tistory.com/17

 

(주식 자동 매매) 키움증권 OpenAPI 로그인

1. 들어가며 키움증권에서 제공하는 OpenAPI를 통해 키움서버에 접근하기 위해서는, 파이썬을 통해 OpenAPI에 접속하여 로그인할 수 있어야 한다. 당초 로그인 후 예수금 받기까지 진행하려고 했으

springcoming.tistory.com

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줄의 "예수금"과 "주문가능금액"만 바꾸면

얼마든지 응용할 수 있을 것이다.

반응형