목 차
1. 들어가며
2. 사전설명
3. 코드 설명
4. 전체 코드 및 결과
5. 마치며
1. 들어가며
이번 글에서는 키움증권 OpenAPI에서 화면번호 opt10005(주식일주월시분요청)을 알아볼 것이다.
opt10005는 날짜, 시가/고가/저가/종가 등을 제공한다.
* 거래량, 체결강도, 외인보유, 외인비중 등은 KOA Studio에서 제공한다고는 하는데,
값을 실제로 받을 수는 없어 아쉽다.
2. 사전설명
KOA Studio에서 접속/로그인하여 데이터를 확인해보자.
① 입력/출력 : 종목코드를 입력하고, 날짜/시가/고가/종가 등을 받아올 수 있다.
② KOA Studio에서 종목코드(005930)을 입력한다.
③ 출력되는 데이터는 날짜, 시가/고가/종가 등을 받아온다.
3. 코드 설명
키움증권 OpenAPI에 로그인하여 데이터 입력/요청 및 데이터를 수신하는 방법을 알아보자.
1줄~4줄 : 동시성 처리, 로그인을 위해 sys모듈, PyQt 모듈을 임포트하자.
6줄~23줄 : 로그인을 처리한다.
11줄 : 25줄(rq_data_opt10005) 및 32줄(trdata_get) 함수를 연결한다.
25줄 : 종목코드 입력(27줄) 및 데이터 요청(28줄)한다.
32줄~49줄 : 키움증권의 GetCommData 함수를 통해 시간, 시가, 고가 등을 받아온다.
51줄~66줄 : 시간, 시가, 고가 등을 출력한다.
77줄 : "005930" 코드번호를 25줄의 rq_data_opt10005 함수를 실행한다.
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_opt10005(self, stock_code):
print("77줄에서 입력받은 종목코드를 키움서버에 요청합니다.""\n")
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt_10005", "opt10005", 0, "1019")
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_10005":
data_time = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "날짜").strip()
open_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "시가").strip()))
high_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "고가").strip()))
low_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "저가").strip()))
close_price = abs(int(self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "종가").strip()))
yesterday_price = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "대비").strip()
up_down = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "등락률").strip()
qty = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "거래량").strip()
intensive = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "체결강도").strip()
foreigner_bou = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "외인보유").strip()
foreigner_bijung = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식일주월시분요청", 0, "외인비중").strip()
foreigner_pure_buying = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식호가요청", 0, "외인순매수").strip()
agency_pure_buying = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", "opt10005", "주식호가요청", 0, "기관순매수").strip()
print(f"날짜는 {data_time}입니다.""\n")
print(f"시가는 {open_price}원 입니다.")
print(f"시가는 {high_price}원 입니다.")
print(f"시가는 {low_price}원 입니다.")
print(f"종가는 {close_price}원 입니다.""\n")
print(f"대비는 {yesterday_price}원 입니다.")
print(f"등락률는 {up_down}% 입니다.")
print(f"거래량은 {qty}주 입니다.")
print(f"체결강도는 {intensive}% 입니다.""\n")
print(f"외인보유는 {foreigner_bou}주 입니다.")
print(f"외인비중은 {foreigner_bijung}% 입니다.")
print(f"외인순매수는 {foreigner_pure_buying}주 입니다.")
print(f"기관순매수는 {agency_pure_buying}주 입니다.""\n")
try:
self.tr_event_loop.exit()
except AttributeError:
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
btl = btl_system()
btl.rq_data_opt10005("005930")
app.exec_()
# (expected result)
77줄에서 입력받은 종목코드를 키움서버에 요청합니다.
# 날짜는 20221111입니다.
# 시가는 63100원 입니다.
# 시가는 63200원 입니다.
# 시가는 62300원 입니다.
# 종가는 62900원 입니다.
# 대비는 원 입니다.
# 등락률는 % 입니다.
# 거래량은 20037163주 입니다.
# 체결강도는 % 입니다.
# 외인보유는 주 입니다.
# 외인비중은 % 입니다.
# 외인순매수는 주 입니다.
# 기관순매수는 주 입니다.
5. 마치며
키움증권 OpenAPI의 TR의 opt10005를 통해 "주식일주월시분요청"을 알아보았다.
아쉬운 점은,
KOA Studio에서 체결강도, 외인보유 외인순매수 등을 제공한다고 했는데,
실제로는 받을 수 없는게 아쉽다. ㅠ
'1. 국내주식 > 1-1. 국내주식 연구일지' 카테고리의 다른 글
(국내주식) 2023년 호가가격단위 개선 등 매매제도 변경 (0) | 2023.01.20 |
---|---|
(주식 자동 매매) 키움증권 주식 호가창 및 주식주문 체결순서 설명 (0) | 2022.11.17 |
(엑셀) ROW, MAX, INDEX, MATCH 함수를 이용하여 동적데이터의 표 마지막값 찾기 (0) | 2022.11.06 |
(엑셀) INDEX 함수, MATCH 함수, COUNTIF함수를 이용하여 중복데이터 제거하기 (0) | 2022.11.05 |
(엑셀) INDEX 함수 및 MATCH 함수를 이용하여 데이터 찾기 (0) | 2022.11.04 |
(파이썬) for문 활용 (5) eval 모듈 활용 (패턴 업데이트 방법) (0) | 2022.10.25 |
(파이썬) threading와 time 모듈로 특정 시간마다 반복 실행 (2) 클래스 내에서 실행하고 일정시간 경과 후 종료하기 (0) | 2022.10.24 |
(파이썬) for문 활용 (4) eval 모듈을 활용하여 문자형(str)을 list형으로 타입 전환하기 (0) | 2022.10.22 |