주식자동매매 46강. 실시간 자동매매 구현(7), 장시작시간/장운영구분 데이터 받아오기
본문 바로가기

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

주식자동매매 46강. 실시간 자동매매 구현(7), 장시작시간/장운영구분 데이터 받아오기

반응형

45강에서 실시간 장운영상태 확인 요청 및 관련 데이터를 받아오는 방을 만들었었죠? 이번 강의에서는 데이터를 받아오는 방을 구성하여 장운영상태를 가져오도록 하겠습니다.

 

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


1. 장운영상태 데이터 가져오기
장 운영상태 데이터를 받아오면 장 상태에 따라 아래와 같은 숫자를 반환합니다.
- 장시작전 : "0"
- 장시작 : "3"
- 동시호가 : "2"
- 장종료 : "4"
위의 데이터를 받아오게 되면 다양한 방법으로 응용할 수 있습니다. 예를 들어 장 시작 전에 DB 데이터를 가져온다던지, 장 종료 후 종목 선정하는 프로그램을 가동한다던지 등의 다양한 응용이 가능합니다.


45강에서 아래 그림과 같이 실시간 데이터를 받아오는 방 realdata_slot을 만들었었죠? 그럼 저 방에 장운영상태 데이터를 받아오는 코딩을 해보겠습니다.

44강. 실시간 데이터 받아오기
45강. 실시간 데이터 받아오기

 

장운영상태 데이터를 받아오기
장운영상태 데이터를 받아오기


-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까지의 데이터들이 입력됩니다.

GetCommRealData
GetCommRealData

- 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("장 마감했습니다.")
반응형

.link_tit