주식자동매매 45강. 실시간 자동매매 구현(6), 실시간 장 운영 상태 확인 요청 및 관련 데이터 수신
본문 바로가기

주식 자동매매 강의/기초반(모든 코딩의 뿌리)

주식자동매매 45강. 실시간 자동매매 구현(6), 실시간 장 운영 상태 확인 요청 및 관련 데이터 수신

반응형

44강에서 DB에 등록된 조목의 실시간 현재가 등을 키움 서버에 요청하는 법을 알아보았습니다. 이번 강의에서는 실시간 장 운영 상태 확인 요청 및 관련 데이터 수신을 할 수 있는 방을 만들어 보겠습니다.

 

[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.

1. 장 운영 상태 확인 요청

 차 후에 장 시작하기 전/중/후에 해야 할 일들이 있을 수 있습니다. 예를 들어 장이 종료되자마자 우리가 원하는 종목을 검색하는 알고리즘이 돌아가게끔 만든다던 지, 장 시작 전 DB 데이터를 읽어 들인다던지 등의 행위를 진행할 수 있습니다.

 장 운영 상태 확인 요청은 44강에서 배운 것과 동일하나 FID 번호만 다를 뿐입니다.

실시간 장 운영 상태 확인
실시간 장 운영 상태 확인

 위 그림을 확인하시면 SetRealReg 함수를 이용하여 우리가 원하는 실시간 데이터를 요청 합니다. 코드는 아래와 같습니다.

  -  self.screen_start_stop_real :  스크린 번호는 "300"으로 할당 하였습니다.

  - " " : 종목 코드번호는 필요 없기 때문에 공란입니다.

  - self.realType.REALTYPE["장시작시간"]["장운 영구분"] : 장운영구분 215 코드를 가져옵니다.

 

실시간 장 운영구분 FID 번호
실시간 장 운영구분 FID 번호

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

반응형

.link_tit