44강에서 DB에 등록된 조목의 실시간 현재가 등을 키움 서버에 요청하는 법을 알아보았습니다. 이번 강의에서는 실시간 장 운영 상태 확인 요청 및 관련 데이터 수신을 할 수 있는 방을 만들어 보겠습니다.
[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.
1. 장 운영 상태 확인 요청
차 후에 장 시작하기 전/중/후에 해야 할 일들이 있을 수 있습니다. 예를 들어 장이 종료되자마자 우리가 원하는 종목을 검색하는 알고리즘이 돌아가게끔 만든다던 지, 장 시작 전 DB 데이터를 읽어 들인다던지 등의 행위를 진행할 수 있습니다.
장 운영 상태 확인 요청은 44강에서 배운 것과 동일하나 FID 번호만 다를 뿐입니다.
위 그림을 확인하시면 SetRealReg 함수를 이용하여 우리가 원하는 실시간 데이터를 요청 합니다. 코드는 아래와 같습니다.
- self.screen_start_stop_real : 스크린 번호는 "300"으로 할당 하였습니다.
- " " : 종목 코드번호는 필요 없기 때문에 공란입니다.
- self.realType.REALTYPE["장시작시간"]["장운 영구분"] : 장운영구분 215 코드를 가져옵니다.
- "0" : 연속 조회가 필요 업식 때문에 0을 입력합니다.
위의 코딩을 하면, 장 시작 전/중/후를 알 수 있습니다. 46강 정도에 전/중/후를 어떻게 구분하는지 강의해 드리겠습니다.
2. 관련 데이터 수신
우리는 원하는 종목 실시간 현재가 및 실시간 장 운영 상태 등을 키움 서버에 요청하였습니다. 따라서 이를 받아들일 수 있는 공간을 만들어야겠죠?
아래 그림과 같이 OnReceiveRealData를 통해 실시간으로 넘어오는 데이터를 self.realdata_solt으로 전달합니다. 15강에서 배운 OnReceiveTrData가 기억나시면 이제 코딩이 80% 적응되신 겁니다.
3. 요약 및 관련 코드 공유
오늘 강의는 44강과 상당히 유사하고, 15강의 Tr데이터 받아오는 코드와도 유사하기에 간략히 설명 후 넘어가겠습니다. 이번 강의 목적은 실시간 장 운영상태 확인 및 관련 실시간 데이터를 받아오는 방을 만드는 것입니다. 감사합니다.
import os # 현재 디렉토리 확인 기능
from PyQt5.QtCore import * # 쓰레드 함수를 불러온다.
from kiwoom import Kiwoom # 로그인을 위한 클래스
from kiwoomType import *
class Thread3(QThread):
def __init__(self, parent): # 부모의 윈도우 창을 가져올 수 있다.
super().__init__(parent) # 부모의 윈도우 창을 초기화 한다.
self.parent = parent # 부모의 윈도우를 사용하기 위한 조건
################## 키움서버 함수를 사용하기 위해서 kiwoom의 능력을 상속 받는다.
self.k = Kiwoom()
##################
################## 사용되는 변수
account = self.parent.accComboBox.currentText() # 콤보박스 안에서 가져오는 부분
self.account_num = account
# 계좌번호 가져오는 부분은 Qthread_3 분리 시 로그인 후 계좌번호를 가져오는 함수로 교체된다. Lecture_0529.py
################# 매수관련 변수
self.Load_code() # 매수 종목/금액/수량 가져오기
####### 주문 전송 시 필요한 FID 번호
self.realType = RealType() # 실시간 FID 번호를 모아두는 곳
######################################################################
###### 등록된 계좌 전체 해제하기(작동 정지 되었을 때 등록 정보를 다 끊어야 한다.)
self.k.kiwoom.dynamicCall("SetRealRemove(QString, QString)", ["ALL", "ALL"])
######################################################################
######################################################################
###### 선정된 종목 등록하기 : 키움서버에 리얼 데이터 등록하기
self.screen_num = 5000
for code in self.k.portfolio_stock_dict.keys(): # 포트폴리오에 저장된 코드들을 실시간 등록
fids = self.realType.REALTYPE['주식체결']['체결시간'] # 주식체결에 대한 모든 데이터를 로드할 수 있다.
self.k.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", self.screen_num, code, fids, "1") # 실시간 데이터를 받아오기 위해 각 코드들을 서버에 등록(틱 변화가 있으면 데이터 송신)
self.screen_num += 1
# print("실시간 등록 : %s, 스크린번호 : %s, FID 번호 : %s" % (code, screen_num, fids))
print("종목등록 완료")
print(self.k.portfolio_stock_dict.keys())
######################################################################
###### 현재 장 상태 알아보기 (장 시작 / 장 마감 등)
self.screen_start_stop_real = "300" # 장시 시작 전/후 상태 확인용 스크린 번호
self.k.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", self.screen_start_stop_real, '', self.realType.REALTYPE['장시작시간']['장운영구분'], "0") # 장의 시작인지, 장 외인지등에 대한 정보 수신
###### 실시간 슬롯 (데이터를 받아오는 슬롯을 설정한다)
self.k.kiwoom.OnReceiveRealData.connect(self.realdata_slot) # 실시간 데이터를 받아오는 곳
def Load_code(self):
if os.path.exists("dist/Selected_code.txt"):
f = open("dist/Selected_code.txt", "r", encoding="utf8")
lines = f.readlines() # 여러 종목이 저장되어 있다면 모든 항목을 가져온다.
screen = 4000
for line in lines:
if line != "": # 만약에 line이 비어 있지 않다면
ls = line.split("\t") # \t(tap)로 구분을 지어 놓는다.
t_code = ls[0]
t_name = ls[1]
curren_price = ls[2]
dept = ls[3]
mesu = ls[4]
n_o_stock = ls[5]
profit = ls[6]
loss = ls[7].split("\n")[0]
self.k.portfolio_stock_dict.update({t_code: {"종목명": t_name}})
self.k.portfolio_stock_dict[t_code].update({"현재가": int(curren_price)})
self.k.portfolio_stock_dict[t_code].update({"신용비율": dept})
self.k.portfolio_stock_dict[t_code].update({"매수가": int(mesu)})
self.k.portfolio_stock_dict[t_code].update({"매수수량": int(n_o_stock)})
self.k.portfolio_stock_dict[t_code].update({"익절가": int(profit)})
self.k.portfolio_stock_dict[t_code].update({"손절가": int(loss)})
self.k.portfolio_stock_dict[t_code].update({"주문용스크린번호": screen}) # 아래 내용을 업데이트
screen += 1
f.close()
'주식 자동매매 강의 > 기초반(모든 코딩의 뿌리)' 카테고리의 다른 글
주식자동매매 47강. 실시간 자동매매 구현(7), 실시간 주식체결 정보 가져오기(매우 중요) (2) | 2022.06.14 |
---|---|
주식자동매매 46강. 실시간 자동매매 구현(7), 장시작시간/장운영구분 데이터 받아오기 (6) | 2022.06.14 |
주식자동매매 44강. 실시간 자동매매 구현(5), 원하는 종목 실시간 현재가 키움 서버에 요청하기 (4) | 2022.06.10 |
주식자동매매 43강. 실시간 자동매매 구현(5), DB에 저장된 종목 가져오기 (12) | 2022.06.09 |
주식자동매매 42강. 실시간 자동매매 구현(4), KOA Studio 실시간 데이터 가져오기 개념 설명 (2) | 2022.06.09 |