금융/증권사API

로그인하기 , 기본정보 요청 함수

씩씩한 IT블로그 2021. 2. 13. 23:36
반응형

이벤트 메소드와 일반 메소드를 사용하여 로그인 및 기본정보 요청 함수를 작성해 본다.

 

전체 FLOW

출처 - 파이썬으로 배우는 알고리즘 트레이딩

 

소스코드

import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *

class KiwoomAPI:
    def __init__(self):
        # QAxWidget 객체 (키움 api연결)
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")

        # 이벤트함수
        self.kiwoom.OnEventConnect.connect(self.myOnEventConnect)  # 로그인
        self.kiwoom.OnReceiveTrData.connect(self.myOnReceiveTrData)  # 통신 관련

        # 로그인 요청함수
        print("로그인 요청")
        self.kiwoom.dynamicCall("CommConnect()")

    def getData(self):
        # 데이터 요청 함수
        print("데이터요청")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", "005385")  # (아이템명, 입력값)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, QString, QString)", "test_opt10001", "opt10001", "0", "0101")
        # ( sRQName(사용자구분), sTrCode(Tran명), nPrevNext(0:조회 2:연속), sScreenNo(화면번호) )
        # TR종류는 KOA스튜디오에서 확인가능
        # 화면목록은 KOA스튜디옹서 확인가능

    def myOnEventConnect(self, nErrCode):
        if nErrCode == 0:
            print('로그인 성공')
            # 로그인이 성공한 후 데이터를 받아와야 정상 동작한다.
            self.getData()
        else:
            print('로그인 실패')

    def myOnReceiveTrData(self, sScrNo, sRQName, sTrCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSplmMsg):
        print("데이터 수신 성공")
        # sScrNo(화면번호), sRQName(사용자구분), sTrCode(Tran명), sRecordName(레코드명), sPreNext(연속조회 유무) , 나머지 4개는 현재버전에서 사용x
        if sRQName == 'test_opt10001':
            print("화면번호 사용자구분 tran명 레코드명 연속조회유무")
            print(sScrNo,sRQName,sTrCode,sRecordName,sPreNext)

            name = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "종목명")
            volume = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "거래량")
            price = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "현재가")
            # ( strTrCode(tran코드), strRecordName(레코드명), nIndex(복수데이터 인덱스), strItemName(아이템명) )
            # 아이템명은 koa studio에 해당 tr의 output 에서 확인가능

            print(name.lstrip(), volume.lstrip(), price.lstrip())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    test = KiwoomAPI()
    app.exec_()

(output)

 

주의할점

처음에 기본 정보데이터를 요청하는 함수인 getData()함수를 생성자에서 실행시키고 에러가 났다.

이는 getData함수에 있는 setinputvalue함수와 commrqdata함수가 로그인이 완료된 후 수행되어야 하는 함수이기 때문으로 보인다.

따라서 getData()함수를 로그인의 완료가 보장된 로그인이벤트 함수 myOnEventConnect 내부에서 실행시켰고 문제를 해결할 수 있었다.

 

* QeventLoop를 이용한 해결은 아래의 글에서 설명한다.

sosoeasy.tistory.com/415

 

QeventLoop를 이용한 로그인하기 , 기본정보 요청 함수

 문제파악 주식 기본정보를 가져오기 위해선 로그인이 선행되어야 한다. 하지만 로그인하는데 잠깐의 시간이 걸리고, 그 시간보다 빨리 코드가 실행되면 오류가 발생한다. sosoeasy.tistory.com/413에

sosoeasy.tistory.com

 

반응형