45강에서 실시간 장운영상태 확인 요청 및 관련 데이터를 받아오는 방을 만들었었죠? 이번 강의에서는 데이터를 받아오는 방을 구성하여 장운영상태를 가져오도록 하겠습니다.
[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.
1. 장운영상태 데이터 가져오기
장 운영상태 데이터를 받아오면 장 상태에 따라 아래와 같은 숫자를 반환합니다.
- 장시작전 : "0"
- 장시작 : "3"
- 동시호가 : "2"
- 장종료 : "4"
위의 데이터를 받아오게 되면 다양한 방법으로 응용할 수 있습니다. 예를 들어 장 시작 전에 DB 데이터를 가져온다던지, 장 종료 후 종목 선정하는 프로그램을 가동한다던지 등의 다양한 응용이 가능합니다.
45강에서 아래 그림과 같이 실시간 데이터를 받아오는 방 realdata_slot을 만들었었죠? 그럼 저 방에 장운영상태 데이터를 받아오는 코딩을 해보겠습니다.
-if sRealType == "장시작시간" : 만약 sRealType이 "장시작시간"일 경우 아래 코드를 실행합니다.
- fid = self.realType.REALTYPE[sRealType]["장운영구분] : 장운영구분 fid 번호를 가져옵니다. 45강에서 코딩하셨죠?
- value = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid) : 실시간 데이터를 받아오기 위해서는 GetCommRealData를 사용해야 합니다. sCdoe와 fid 번호만 넣으면 되겠죠? 그러면 value에 상황에 맞춰 앞서 설명드린 0~4까지의 데이터들이 입력됩니다.
- if value == "0" : 만약 value가 "0"의 값을 가지면 print("장 시작 전")이라는 메시지를 보내는데, 여기에 다양한 응용 코딩이 가능합니다. 차 후에 심화 편에서 다양한 응용을 다루도록 하겠습니다.
- elif .... : 다양한 데이터들을 각 상황에 맞게 받아온 후 프로그램이 실행되게 합니다.
2. 요약 및 코드 공개
오늘은 장시작시간 중 장운영구분을 받아오는 코딩을 해보았습니다. 45강과 연결해서 보면 정말 생각보다 쉽게 느껴지실 겁니다. 다음 강의에서는 이 강의의 꽃인 실시간 데이터를 받아와 우리가 원하는 가격에 매수/매도를 하고 차트도 그려보고 재미있는 것들을 진행해 보겠습니다. 다들 파이팅하고 힘내 십시오. 강의가 종막에 가까워지고 있습니다.
이 기본 강의가 끝나면, 정말 재미있는 컨텐츠들을 할 생각입니다. 예로 단테의 밥그릇 페턴 만들기/급등주 포착하기 등을 할 터이니 기대해 주십시오. 단, 이런 단편적인 기술로는 절대 주식시장에서 성공하지 못하니 저희는 항상 업그레이드하고 공부해야 됩니다. 저도 이 강의를 진행하면서 지나쳤던 부분들을 다시 공부하면서 새삼스럽게 느끼는 것이 많이 있습니다. 여러분들도 복습 열심히 하셔서 코딩뿐만 아니라 많은 부도 성취하시기 바랍니다.
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) # 실시간 데이터를 받아오는 곳
self.k.kiwoom.OnReceiveChejanData.connect(self.chejan_slot) # (주문접수, 체결통보)=0, (잔고변경) = 1 데이터 전송
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()
def realdata_slot(self, sCode, sRealType, sRealData): # 실시간으로 서버에서 데이터들이 날라온다.
if sRealType == "장시작시간":
fid = self.realType.REALTYPE[sRealType]['장운영구분']
# 실시간시세 데이터 수신 이벤트인 OnReceiveRealData() 가 발생될때 실시간데이터를 얻어오는 함수
value = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid)
if value == '0':
print("장 시작 전")
elif value == '3':
print("장 시작")
elif value == '2':
print("장 종료, 동시호가로 넘어감감")
elif value == '4':
print("장 마감했습니다.")
'주식 자동매매 강의 > 기초반(모든 코딩의 뿌리)' 카테고리의 다른 글
주식자동매매 48강. 실시간 자동매매 구현(8), 실시간 종목 원하는 가격에 매수하기 (12) | 2022.06.15 |
---|---|
주식자동매매 47강. 실시간 자동매매 구현(7), 실시간 주식체결 정보 가져오기(매우 중요) (2) | 2022.06.14 |
주식자동매매 45강. 실시간 자동매매 구현(6), 실시간 장 운영 상태 확인 요청 및 관련 데이터 수신 (12) | 2022.06.13 |
주식자동매매 44강. 실시간 자동매매 구현(5), 원하는 종목 실시간 현재가 키움 서버에 요청하기 (4) | 2022.06.10 |
주식자동매매 43강. 실시간 자동매매 구현(5), DB에 저장된 종목 가져오기 (12) | 2022.06.09 |