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

(주식 자동 매매) 키움증권 OpenAPI - 업종프로그램요청(opt10010)

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

1. 들어가며

이전 글에서는 TR 10009(주식기관요청)을 활용하는 방법을 알아보았다.

TR 10009 관련 키움증권 OpenAPI에서는

 기관기간누적, 기관일변순매매, 외국인지분율 등을

 제공하지 않아 수진받지 못하는 아쉬움이 있었다.

 

이번 글에서는 KOA Studio에서 삼성전자(005930) 관련

전체차익위탁 매도/매수/순매수를 알아볼 것이다.


2. 사전 설명

KOA Studio에서 TR번호는 10010(업종프로그램 요청)이다.

아래 <그림> 과 같이, KOA Studio에 접속 후 삼성전자(005930)을 입력하면,

화면 하단에서 위탁 매도/매수/순매수 데이터를 받아온다.

 

다만, 차익/비차익 위탁매도수량 등은 키움에서 제공하지 않는 것 같다.

그림1. KOA Studio에서 "업종프로그램요청"을 받는 TR번호는 10010에 해당한다.


3. 코드 설명

키움증권 OpenAPI를 통해 받아오는 코드를 알아보자.

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

 

1줄~23줄 : 관련 모듈 및 로그인과 관련된 내용이다.

                  (앞 글과 설명이 겹치는 관계로 여기서는 생략한다.)

25줄~30줄 : 51줄의 실행 명령어에 대해, 실행되는 임의르 함수를 만든다.

                    키움에서 제공하는 SetInputValue 및 CommRqData를 활용하여,

                    종목코드를 키움서버에 각각 입력/요청한다.

 

그림2-2. GetCommData 함수를 활용하여 데이터를 받아온다.

 

31줄 ~ 43줄 : GetCommData 함수를 활용하여,

                       27줄~28줄의 SetInputValue 및 CommRqData를 통해

                      종목코드를 입력/요청한 데이터를 수신받는다.

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


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_opt10010(self, stock_code):
        print("51줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10010", "opt10010", 0, "1010")
        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_10010":
            sell_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10010", "업종프로그램요청", 0, "전체차익위탁매도수량").strip()
            buy_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10010", "업종프로그램요청", 0, "전체차익위탁매수수량").strip()
            pure_buy_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10010", "업종프로그램요청", 0, "전체차익위탁순매수수량").strip()

            print(f"전체차익위탁매도 수량은 {sell_qty} 입니다.")
            print(f"전체차익위탁매수 수량는 {buy_qty}입니다.")
            print(f"전체차익위탁순매수 수량는 {pure_buy_qty} 입니다.")

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

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

    btl.rq_data_opt10010("005930")

    app.exec_()
    
    
    (expected result)
# 전체차익위탁매도 수량은 5122391 입니다.
# 전체차익위탁매수 수량는 2830433입니다.
# 전체차익위탁순매수 수량는 -2551459 입니다.

5. 마치며

TR 10010(업종프로그램요청)을 통해 전체차익위탁 매도/매수/순매수 수량을 알아보았다.

키움증권에서 동 내용을 어디에서 확인할 수 있는지는 찾을 수 없었다.

프로그램 매매에 관심이 있다면, 참고하면 될 것 같다.

 

반응형