1. 국내주식/1-3. 키움 OpenAPI (기타)

(주식 자동 매매) 키움증권 OpenAPI - 시세표성정보요청(opt10007)

봄이오네 2022. 11. 25. 08:05
반응형
목 차
1. 들어가며
2. 사전설명
3. 코드설명
4. 전체 코드 및 설명
5. 마치며

1. 들어가며

이번 글에서는 입력한 종목의

전일종가, 전일거래량, 상한가, 하한가 등의 데이터를 받아올 방법을 알아보자.


2. 사전설명

KOA Studio를 살펴보도록 하자.

KOA Studio에 접속하고, 시세표성정보요청(opt10007)을 설명을 보면,

종목코드(005930)을 입력하면, 데이터를 받아온다.

그림1. opt10007(시세표성정보요청)을 활용하여 데이터를 받아온다.

 

 

① 입력/출력된 정보를 미리 확인하자.

     입력은 종목코드(005930)이고, 종목명, 종목코드, 날짜, 상한가 등이 출력된다.

② 키움증권의 SetInputValue 함수, CommRqData 함수를 이용한다.

③ 종목코드를 입력한다.

④ 키움증권 OpenAPI에서 제공하는 데이터를 보여준다.


3. 코드설명

  • 키움증권 OpenAPI에 접속/로그인하여 데이터를 받아온다.

그림2-1. 키움증권 OpenAPI에 접속/로그인한다.

1줄~4줄 : 키움증권 OpenAPI에 접속/로그인을 위해,

                 sys모듈, PyQt5 모듈을 임포트한다.

10줄 : 18줄의 로그인 함수를 연결한다.

11줄 : 25줄~30줄(데이터 요청)을 32줄(데이터 수신)로 연결한다.

18줄~23줄 : 키움증권 OpenAPI어 로그인한다.

 

25줄~30줄 : 키움증권 OpenAPI에서 제공하는

                    SetInputValue 및 CommRqData를 활용하여,

                    종목코드를 입력 및 요청한다.

 

그림2-2. 데이터를 수신한다.

 

32줄 : 데이터를 받기위해 임의의 함수를 선언한다.

33줄 : 받아온 데이터가 27줄의 opt_10007이면

34줄~45줄 : 종목명, 종목코드, 날짜, 시간, 전일종가/가격, 상한가, 하한가 등을 받아온다.

47줄~56줄 : 34줄~45줄의 데이터를 출력한다.

67줄 : 25줄의 함수를 실행한다.


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")

        self.kiwoom.OnEventConnect.connect(self.login_Connect)
        self.kiwoom.OnReceiveTrData.connect(self.trdata_get)

        print("로그인 요청!")
        self.kiwoom.dynamicCall("CommConnect()")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    def login_Connect(self, nErrCode):
        if nErrCode == 0:
            print('로그인 성공하였습니다!')
        else:
            print('로그인 실패하였습니다!')
        self.login_event_loop.exit()

    def rq_data_opt10007(self, stock_code):
        print("67줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10007", "opt10007", 0, "1021")
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    def trdata_get(self, sScrNo, rqname, strcode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSplmMsg):
        if rqname == "opt_10007":
            stock_name = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "종목명").strip()
            stock_code = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "종목코드").strip()

            date = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "날짜").strip()
            time = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "시간").strip()
            yesterday_close = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "전일종가").strip()))
            yesterday_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "전일거래량").strip()
            up_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "상한가").strip()))
            down_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "하한가").strip()))

            current_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "현재가").strip()))
            today_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10007", "시세표성정보요청", 0, "거래량").strip()

            print(f"종목명은 {stock_name} 입니다.")
            print(f"종목코드는 {stock_code}입니다.""\n")
            print(f"날짜는 {date} 입니다.")
            print(f"시간은 {time} 입니다.")
            print(f"전일종가는 {yesterday_close}원 입니다.")
            print(f"전일거래량은 {yesterday_qty}주 입니다.""\n")
            print(f"상한가는 {up_price}원 입니다.")
            print(f"하한가는 {down_price}원 입니다.""\n")
            print(f"현재가는 {current_price}원 입니다.")
            print(f"거래량은 {today_qty}주 입니다.""\n")

            try:
                self.tr_event_loop.exit()
            except AttributeError:
                pass

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

    btl.rq_data_opt10007("005930")

    app.exec_()
    
    
# (expected result)
# 종목명은 삼성전자 입니다.
# 종목코드는 005930입니다.

# 날짜는 20221118 입니다.
# 시간은 160000 입니다.
# 전일종가는 61400원 입니다.
# 전일거래량은 13298296주 입니다.

# 상한가는 79800원 입니다.
# 하한가는 43000원 입니다.

# 현재가는 61800원 입니다.
# 거래량은 12236503주 입니다.

5. 마치며

종목코드 입력을 통해 날짜, 시간, 상한가, 하한가 등

받아오는 방법을 알아보았다.

 

실제 거래에서 필요성이 적지만,

KOA Studio에서 데이터를 어떻게 받아오는지

감만 잡도록 하자.

 

반응형