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

(주식 자동 매매) 키움증권 OpenAPI - 신주인수권 전체시세요청(opt10011)

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

1. 들어가며

이전 글에서는 삼성전자(005930)의 전체차익위탁 매도/매수/순매수 데이터를
받아오는 방법을 알아보았다.

이번 글에서는 키움증권에서 제공하는
신주인수권 전체시세요청에 대해 알아볼 것이다.

영웅문에서 제공하는 화면번호는 0298이다.

그림1. 신주인수권 전체시세 현황 (화면번호 0298)

2. 사전준비

1) 화면목록에서 찾는 경로

KOA Studio에서 "신주인수권" 관련 내용을 찾아보자
< 그림2-1 >에서 확인하였듯이,
(경로) 화면목록 > [0298] 신주인수권시세 < TR이름=OPT10011 : 신주인시권전체시세요청

그림2-1. KOA Studio의 화면목록에서 opt10011을 찾는 경로

2) TR목록에서 찾는 경로

  • INPUT으로 신주인수권구분을 "00"을 입력하면,
  • OUTPUT으로 종목코드, 종목명, 현재가 등을 받을 수 있다.
그림2-2. TR10011 목록에서 INPUT / OUTPUT을 각각 확인한다.

3. 코드 설명

OpenAPI에 접속하여, opt10011을 통해 신주인수권전체 시세를 요청한다.

그림3-1. 로그인 및 데이터 입력/요청 하면 화면

1줄~23줄 : 필요 모듈의 임포트 및 로그인을 위한 내용으로,
앞에서 설명을 많이 하였으므로 여기서는 설명을 생략한다.
25줄~30줄 : 56줄에서 입력한 명령어를 실행할 때, 실행되는 함수(25줄)이다.
SetInputValue 및 CommRqData 함수를 이용한다.

그림3-2. 데이터를 수신받는 화면


32줄~45줄 : GetCommData 함수를 통해
종목코드, 종목명, 현재가, 최우선매도/매수 호가 등을 수신받는다.
56줄 : 25줄의 함수(rq_data_opt10011)를 실행한다.


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_opt10011(self, gubun):
        print("55줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "신주인수권구분", gubun)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10011", "opt10011", 0, "1011")
        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_10011":
            for i in range(0,2):
                stock_code = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10011", "신주인수권전체시세요청", i, "종목코드").strip()
                stock_name = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10011", "신주인수권전체시세요청", i, "종목명").strip()
                current_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10011", "신주인수권전체시세요청", i, "현재가").strip()))
                first_sell_hoga = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10011", "신주인수권전체시세요청", i, "최우선매도호가").strip()
                first_buy_hoga = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10011", "신주인수권전체시세요청", i, "최우선매수호가").strip()

                print(f"종목코드는 {stock_code} 입니다.")
                print(f"종목명은 {stock_name} 입니다.")
                print(f"현재가는 {current_price} 입니다.")
                print(f"최우선매도호가는 {first_sell_hoga} 입니다.")
                print(f"최우선매수호가는 {first_buy_hoga} 입니다.""\n")

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

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

    btl.rq_data_opt10011("00")

    app.exec_()
    
    
    (expected result)
# 종목코드는 J0003021C 입니다.
# 종목명은 대유플러스 12WR 입니다.
# 현재가는 227 입니다.
# 최우선매도호가는 +238 입니다.
# 최우선매수호가는 -227 입니다.

# 종목코드는 J00121218 입니다.
# 종목명은 금호전기 31WR 입니다.
# 현재가는 69 입니다.
# 최우선매도호가는 +72 입니다.
# 최우선매수호가는 69 입니다.

5. 마치며

신주인수권 전체시세요청의 TR을 알아보았다.
실제 투자시 활용할 일은 별로 없을 거 같긴 하지만,

OpenAPI를 통해 키움서버에서 데이터를 받아오는
방법을 익히는 차원에서 설명하였다.

반응형