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

(주식 자동 매매) 키움증권 OpenAPI - 신용매매동향요청(opt10013)

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

1. 들어가며

지난 글에서는 opt 100011의 신주인수권 전체시세요청하는 방법을 알아보았다.

 

이번 글에서는 opt 10013를 통해 신용매매동향요청을 알아볼 것이다.

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

그림1. 화면번호 0141의 종목별 신용매매동향 화면

 

※ 참고로, opt 10012(주문체결요청)은 KOA Studio에서 지원되지 않는다.

그림2. opt 10012는 미지원


2. 사전설명

아래 <그림3>의 KOA Studio에서 입력 내역 및 수신 내역을 확인할 수 있다.

SetInputValue 함수와 CommRqData 함수를 이용한다.

그림3. KOA Studio에서 제공/수신받는 데이터 내역


3. 코드 설명

KOA Studio 로그인 및 키움서버 접속을 통해

데이터를 요청/수신받으면 된다.

그림4-1. 로그인 및 데이터 요청하는 화면

 

1줄 ~ 23줄 : 필요한 모듈을 불러오고, KOA Studio에 접속/로그인 한다.

25줄 ~ 32줄 : 62줄의 명령어를 통해 실행되는 rq_data_opt10013 함수를 정의한다.

                      SetInputValue 함수 및 CommRqData 함수를 이용하여,

                      필요한 내용을 서버에 각각 입력/요청한다.

 

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

 

34줄~ 56줄 : 키움서버로부터 데이터를 수신받는다.

                      <그림3>의 받아오는 데이터를 확인한다.

                       날짜, 현재가, 거래량, 신규/상품/잔고 등이다.

 

62줄 : 25줄의 함수를 실행할 명령어이다.

          (25줄~32줄까지, 키움서버에 데이터를 서버에 입력/요청한다)

 

그림4-3. 수신받은 데이터를 출력한 화면


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_opt10013(self, stock_code, data, gubun):
        print("62줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "일자", data)
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "조회구분", gubun)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10013", "opt10013", 0, "1013")
        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_10013":
            for i in range(0,2):
                data = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "일자").strip()
                current_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "현재가").strip()))
                qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "거래량").strip()
                new = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "신규").strip()
                sanghwan = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "상환").strip()
                jango = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "잔고").strip()
                money = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10013", "신용매매동향요청", i, "금액").strip()

                print(f"날짜는 {data} 입니다.")
                print(f"현재가은 {current_price} 입니다.")
                print(f"거래량은 {qty} 입니다.")
                print(f"신규는 {new} 입니다.")
                print(f"상환는 {sanghwan} 입니다.")
                print(f"잔고는 {jango} 입니다.")
                print(f"금액은 {money} 입니다.""\n")

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

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

    btl.rq_data_opt10013("005930", "20221223", "1")

    app.exec_()
    
# (expected resutl)
# 62줄에서 입력받은 종목코드를 키움서버에 요청합니다.

# 날짜는 20221222 입니다.
# 현재가은 59100 입니다.
# 거래량은 10720630 입니다.
# 신규는 195837 입니다.
# 상환는 168353 입니다.
# 잔고는 7658408 입니다.
# 금액은 467100 입니다.

# 날짜는 20221221 입니다.
# 현재가은 58000 입니다.
# 거래량은 10356971 입니다.
# 신규는 79260 입니다.
# 상환는 101767 입니다.
# 잔고는 7631790 입니다.
# 금액은 465769 입니다.

5. 마치며

opt 10013(신용매매동향요청)을 통해 신용매매 동향에 대해 알아보았다.

매매에서는 활용할 가능성은 지극히 적지만,

어떤 화면에서 어떤 명령어를 통해 받아오는지 정도는 알아두자.

반응형