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

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

봄이오네 2022. 9. 21. 08:28
반응형

1. 들어가며

키움증권에서 제공하는 OpenAPI를 통해 키움서버에 접근하기 위해서는,
파이썬을 통해 OpenAPI에 접속하여 로그인할 수 있어야 한다.
 
당초 로그인 후 예수금 받기까지 진행하려고 했으나,
그렇게 되면, 로그인을 위한 코드를 제대로 알 수 없기에
순수하게 로그인 코드를 설명한다.
 
 ※ 이 글 이후부터는 로그인 관련 내용은 별도 설명을 하지 아니할 예정이다.


2. 코드 설명

   - 1줄 : sys는 파이썬의 변수 혹은 함수를 다룬다.
   - 2줄 : PyQt5.QAxContainer은 QtWidget를 호출하기 위해 임포트함
   - 3줄 : PyQt5.QtWidgets는 동시성 처리을 위해 임포트함
   - 4줄 : PyQt5.QtCore는 14줄~15줄의 로그인 이벤트 루프 및 실행할 때 필요하다.
   - 6줄 : class btl_system이라는 클래스를 선언
   - 7줄 : def __init__는 클래스 내에서 제일 처음 실행된다.
   - 8줄 : QAxWidget를 활용해 레지스트리에 등록된 "KHOPENAPI.KHOpenAPICTrl.1"를 통해
              OpenAPI를 실행한다.
   - 11줄 : 로그인과 관련된 17번줄의 함수와 이벤트함수를 연결해 준다
   - 13줄 : PyQt5에서 제공하는 dynamicCall()함수를 통해 로그인을 요청하는 함수인 CommConnect()를 실행
         * dynamicCall()는 사용자가 키움 서버에 데이터를 요청할 때 사용
   - 14줄~15줄 : 로그인 하는 동안(13줄) 다음 코드 실행 방지
   - 17줄 : 로그인을 위해 정의한 OnEventConnect 함수 (11줄과 연결)
   - 22줄 : 로그인이 성공(18줄) 되었든 실패(20줄)되었든,
               14~15줄에서 실행한 이벤트 루프 종료
   - 25줄 : QApplication은 프로그램이 작동하게 만드는데, 이는 프로그램의 이벤트 루프를 시작하고 유지함
                * QApplication(sys.argv)을 app에 인스턴스화 시켰음(넣어주었음)
   - 26줄 : btl_system() 클래스 호출하였고, btl 변수에 인스턴스함
   - 27줄 : app이 종료되지 아니하고 이벤트 루프 실행
               → app.exec_()이 없으면, OpenAPI가 로그인되고 1번만 데이터를 받고 종료됨

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("연결되었습니다.")

        self.kiwoom.OnEventConnect.connect(self.OnEventConnect)

        self.kiwoom.dynamicCall("CommConnect()")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    def OnEventConnect(self, err_code):
        if err_code == 0:
            print("로그인에 성공하였습니다.")
        else:
            print("로그인에 실패하였습니다.")
        self.login_event_loop.exit()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    btl = btl_system()
    app.exec_()

3. 마치며

로그인 함수 코드를 설명하였다.
각각의 줄이 뜻하는 의미를 알고 있으면,
향후 코드를 짤 때 수월함을 느낄 수 있을 것이다.

반응형