목 차
1. 들어가며
2. 사전설명
3. 코드설명
4. 전체 코드 및 결과
5. 마치며
1. 들어가며
이번 글에서는 키움증권에서
주식기관요청(opt10009)을 통해 기관기간 누적량 등을 받아오는 방법을 알아보자
키움증권 영웅문에서 화면번호 0258(기관매매동향-종목별 기관매매추이)에 해당한다.
2. 사전설명
1) KOA Studio에서 영웅문의 화면번호 0258을 확인할 수 있다.
2) KOA Studio에서 opt10009 TR요청을 통해 기관매매동향을 확인할 수 있다.
① KOA Studio에서 입력/수신받은 데이터를 확인할 수 있다.
② OpenAPI의 SetInputValue 및 CommRqData를 활용한다.
③ 아프리카TV의 종목코드(067160)을 입력한다.
④ 받아온 데이터 출력 결과이다.
3. 코드설명
키움증권 OpenAPI 접속/로그인을 통해 데이터를 받아온다.
1줄~4줄 : 동시성 처리, 로그인 등을 위해 sys 모듈,PyQt5 모듈을 임포트한다.
8줄~23줄 : OpenAPI에 로그인한다.
25줄~30줄 : 키움증권 OpenAPI에서 제공하는 SetInputValue 및 CommRqData 함수를 통해
데이터 입력/요청한다.
32줄 : 데이터 수신을 위해 임의의 trdata_get 함수를 선언한다.
33줄 : 28줄에서 요청하는 데이터가 opt_10009이면,
34줄~40줄 : 종가, 전일대비 가격, 기관 수량 등을 받아온다.
42줄~48줄 : 날짜, 종가 등을 출력한다.
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_opt10009(self, stock_code):
print("59줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10009", "opt10009", 0, "1023")
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_10009":
date = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "날짜").strip()
close_price =abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "종가").strip()))
yesterday_updown = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "대비").strip()
agenct_qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "기관기간누적").strip()
agent_deal = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "기관일변순매매").strip()
foreinger_deal = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "외국인일변순매매").strip()
foreinger_percent = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10009", "주식기관요청", 0, "외국인지분율").strip()
print(f"날짜는 {date} 입니다.")
print(f"종가는 {close_price}원 입니다.""\n")
print(f"전일대비 가격은 {yesterday_updown}원 입니다.")
print(f"기관기간누적은 {agenct_qty}주 입니다.")
print(f"기관일변순매매은 {agent_deal}주 입니다.")
print(f"외국인일변순매매는 {foreinger_deal}주 입니다.""\n")
print(f"외국인지분율은 {foreinger_percent}% 입니다.")
try:
self.tr_event_loop.exit()
except AttributeError:
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
btl = btl_system()
btl.rq_data_opt10009("067160")
app.exec_()
# (expected result)
# 날짜는 20221118 입니다.
# 종가는 88900원 입니다.
# 전일대비 가격은 -1300원 입니다.
# 기관기간누적은 주 입니다.
# 기관일변순매매은 주 입니다.
# 외국인일변순매매는 주 입니다.
# 외국인지분율은 % 입니다.
5. 마치며
OpenAPI를 통해 주식기관요청(opt10009) 정보를 받아오는 방법을 알아보았다.
코드는 올바르게 입력했으나,
기관기간누적, 기관일변순매매, 외국인일변순매매 등의 정보를
받아오지 않는게 아쉽다.
기관보유수량 등을 받아오는 정보는 향후 연구해 보고 싶다.
그 날이 빨리오길 기원한다! ^^
'1. 국내주식 > 1-3. 키움 OpenAPI (기타)' 카테고리의 다른 글
(주식 자동 매매) 키움증권 OpenAPI - 신용매매동향요청(opt10013) (0) | 2022.12.24 |
---|---|
(주식 자동 매매) 키움증권 OpenAPI - 신주인수권 전체시세요청(opt10011) (0) | 2022.12.23 |
(주식 자동 매매) 키움증권 OpenAPI - 업종프로그램요청(opt10010) (0) | 2022.12.22 |
(주식 자동 매매) 키움증권 OpenAPI - 주식외국인요청(opt10008) (0) | 2022.11.26 |
(주식 자동 매매) 키움증권 OpenAPI - 시세표성정보요청(opt10007) (0) | 2022.11.25 |
(주식 자동 매매) 키움증권 OpenAPI - 주식시분요청(opt10006) (0) | 2022.11.20 |
(주식 자동 매매) 키움증권 OpenAPI - 체결정보요청(opt10003) (0) | 2022.11.16 |
(주식 자동 매매) 키움증권 OpenAPI - 거래명세원 받기(opt10002) (0) | 2022.10.17 |