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

(주식 자동 매매) 키움증권 OpenAPI - 체결정보요청(opt10003)

봄이오네 2022. 11. 16. 08:16
반응형
목 차
1. 들어가며
2. 사전준비
  1) KOA Studio에서 해당 화면번호 찾기
  2) KOA Studio에서 확인
3. 코드설명
4. 전체 코드 및 결과
5. 마치며

1. 들어가며

이 글에서는 키움증권 화면번호 0120 "미니체결" 내역을 출력해 보도록 하겠다.
키움OpenAPI의 KOA Studio에서는 체결정보요청(opt10003)을 이용한다.
→ <그림1>의 체결정보를 데이터프레임 형태로 출력할 것이다.

그림1. 키움 영웅문의 미니체결 화면

2. 사전준비

1) 먼저 KOA Studio에서 해당 화면의 내용을 찾아보자.

화면목록 > 미니주식체결 > TR이름 = opt10003 : 체결정보요청
→ opt10003 TR 정보를 이용한다.

그림2-1. 화면목록에서 체결정보요청 경로를 확인한다.

2) KOA Studio에서 확인

  • 종목코드를 입력하면, 시간/현재가/체결거래량이 나온다.
그림2-2. opt10003의 체결정보를 확인한다.


입력은 종목코드, 출력은 시간, 현재가, 전일대비, 체결거래량을 확인한다.
② 파이참(Pycharn)을 통해 입력해야 하는 코드이다.
(SetInputValue, CommRqData 등을 입력해야 한다.)
③ 종목코드는 아프리카TV(067167)를 입력한다.
④ 출력결과를 확인한다.


3. 코드설명

  • pandas 모듈을 활용하여 데이터프레임化 시키고, 데이터를 화면에 출력한다.
그림3-1. 로그인과 체결정보를 받아오는 코드


1줄~5줄 : 파이썬 변수/함수를 다루고,
동시성 처리, 이벤트 루프, 데이터프레임化를 위해
sys모듈, PyQt 모듈, pandas모듈을 임포트 한다.

7줄 : btl_system 클래스를 선언한다.
9줄~26줄 : 로그인을 진행한다.

(주식 자동 매매) 키움증권 OpenAPI 로그인

1. 들어가며 키움증권에서 제공하는 OpenAPI를 통해 키움서버에 접근하기 위해서는, 파이썬을 통해 OpenAPI에 접속하여 로그인할 수 있어야 한다. 당초 로그인 후 예수금 받기까지 진행하려고 했으

springcoming.tistory.com


12줄 : 28줄(rq_data_opt10003)에서 입력/요청한 데이터를
35줄(trdata_get) 데이터를 받기 위해, onreceivetrdata로 연결한다.
19줄 : 체결정보를 담기위해, 임의의 변수 self.dealed_information를 선언한다.

28줄 : rq_data_opt10003 임의의 함수를 선언한다.
30줄 : 키움OpenAPI에서 제공하는 SetInputValue함수를 이용하여 종목코드를 입력한다.
31줄 : 키움OpenAPI에서 제공하는 CommRqData함수를 이용하여 종목코드를
키움OpenAPI에 요청한다.
32줄~33줄 : tr_event_loop를 활용하여 데이터 입력/요청이 완료될 때까지,
이벤트 루프를 돌면서, 대기한다.

그림3-2. GetCommData로 키움증권에서 데이터를 받아온다.


35줄 : 데이터를 수신받기 위해 임의의 trdata_get 함수를 선언한다.
36줄 : 31줄에서 요청한 데이터가 opt_10003이면(if문)
37줄 : 받아올 수 있는 데이터 갯수를 rows에 넣는다.
38줄 : 데이터 갯수는 for문을 통해 받는다.

39줄~43줄 : 5가지 정보를 변수에 담는다.
* 5가지 : 체결시간, 체결가격, 전일대비, 대비율, 체결거래량

45줄~49줄 : 19줄에서 선언한 self.dealed_information에 데이터를 넣는다.
51줄 : self.dealed_information 정보를 데이터프레임化 시킨다.
53줄 : 51줄을 출력한다.

55즐~58줄 : 35줄의 이벤트 루프를 종료한다.
64줄 : 아프리카TV 종목코드(067160)를 넣어서,
28줄의 rq_data_opt10003 함수를 실행한다.


4. 전체 코드 및 결과

import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import pandas as pd

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_()

        self.dealed_information = {'time': [], 'dealed_price': [], 'yesterday_compare': [], 'up_down': [], 'pure_qty': []}

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

    def rq_data_opt10003(self, stock_code):
        print("62줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10003", "opt10003", 0, "1017")
        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_10003":
            rows = self.kiwoom.dynamicCall("GetRepeatCnt(QString, QString)", strcode, rqname)
            for i in range(rows):
                time_hours = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10003", "체결정보요청", i, "시간").strip()
                dealed_prices = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10003", "체결정보요청", i, "현재가").strip()))
                yesterday_compares = int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10003", "체결정보요청", i, "전일대비").strip())
                up_down = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10003", "체결정보요청", i, "대비율").strip()
                pure_qty = int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10003", "체결정보요청", i, "체결거래량").strip())

                self.dealed_information['time'].append(time_hours)
                self.dealed_information['dealed_price'].append(dealed_prices)
                self.dealed_information['yesterday_compare'].append(yesterday_compares)
                self.dealed_information['up_down'].append(up_down)
                self.dealed_information['pure_qty'].append(pure_qty)

                df_dealed_information = pd.DataFrame(self.dealed_information, columns=['time', 'dealed_price', 'yesterday_compare', 'up_down', 'pure_qty'])

            print(df_dealed_information)

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

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

    btl.rq_data_opt10003("067160")

    app.exec_()
    
    
# (expected result)
#       time     dealed_price  yesterday_compare up_down  pure_qty
# 0   155956         93000           5600         +6.41        14
# 1   155954         93000           5600         +6.41         3
# 2   155950         93000           5600         +6.41        20
# 3   155949         93000           5600         +6.41        32
# 4   155946         93000           5600         +6.41        10
# 5   155945         93000           5600         +6.41        10
# 6   155940         93000           5600         +6.41        32
# 7   155932         93000           5600         +6.41        10
# 8   155927         93000           5600         +6.41         2
# 9   155926         93000           5600         +6.41        10
# 10  155915         93000           5600         +6.41        39
# 11  155910         93000           5600         +6.41        50
# 12  155830         93000           5600         +6.41         5
# 13  155813         93000           5600         +6.41       100
# 14  155812         93000           5600         +6.41         4
# 15  155752         93000           5600         +6.41         1
# 16  155745         93000           5600         +6.41         3
# 17  155719         93000           5600         +6.41         8
# 18  155706         93000           5600         +6.41         1
# 19  155633         93000           5600         +6.41         8
# 20  155630         93000           5600         +6.41         5
# 21  155606         93000           5600   +6.41         1
# 22  155601         93000           5600   +6.41         3
# 23  155541         93000           5600   +6.41         1
# 24  155357         93000           5600   +6.41        24
# 25  155223         93000           5600   +6.41         1
# 26  155156         93000           5600   +6.41         1
# 27  155155         93000           5600   +6.41         5
# 28  155109         93000           5600   +6.41         6
# 29  154918         93000           5600   +6.41         1
그림4. 시간에 따라 체결가격, 전일대비, 체결량 등을 확인할 수 있다.

5. 마치며

키움증권 화면번호 0120에 있는 미니체결 내역을 받아오는 방법을 알아보았다.
키움OpenAPI에서는 opt10003 TR을 이용한다.
특정종목의 체결가, 체결정보 등이 필요한 경우 활용할 수 있다.

반응형