주식자동매매 44강. 실시간 자동매매 구현(5), 원하는 종목 실시간 현재가 키움 서버에 요청하기
본문 바로가기

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

주식자동매매 44강. 실시간 자동매매 구현(5), 원하는 종목 실시간 현재가 키움 서버에 요청하기

반응형

43강에서 DB에 만들어진 종목을 가져오는 기능을 구현해 보았습니다. 이번 강의에서는 DB에서 가져온 종목에 대한 현재가, 거래량 등의 다양한 정보를 키움 서버에 요청해 보겠습니다.

 

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

 

1. FID 번호 가져오기

 키움 서버로 원하는 값에 대한 정보를 요청하기 위해서는 FID 번호가 반드시 필요합니다. FID번호가 무엇인지 그리고 FID 번호를 모아 놓은 코드를 42강에 공유해 드렸으니, 반드시 본인만의 스크립트에 복사/붙여넣기 하십시오(간단하죠?).

 

 스크립트 이름은 kiwoomTpye.py라 생성하였으며, 그 아래 42강에 공유해드린 코드를 붙여 넣기만 하시면 됩니다. 혹시 스크립트 생성을 하지 못하시는 분들은 1강부터 정주행 하시길 권해드립니다.

kiwoomTpye.py 스크립트 생성
kiwoomTpye.py 스크립트 생성

 - REALTYPE에 주식체결을 보시면 체결시간의 FID 번호는 20, 현재가는 10....이라는 FID 번호가 다 모아져 있습니다. 

 

 FID 번호를 모아둔 스크립트를 생성하였으니, kiwoomType.py을 매수/매도 기능을 하는 Qthread_3.py에서 사용할 수 있도록 모든 기능을 가져옵니다.

 

kiwoomType.py 기능 가져오기
kiwoomType.py 기능 가져오기

 - from kiwoomType improt * : kiwoomTpye에 있는 클래스의 모든 기능을 가져오겠다.

 

 다음으로 kiwoomType의 RelaType()기능을 간략히 사용할 수 있도록 아래와 같이 코딩합니다.

 

kiwoomType의 RealType()기능 가져오기
kiwoomType의 RealType()기능 가져오기

 RealType()에는 체결시간/현재가/전일대비/거래량 등의 다양한 요청에 대한 FID 번호가 입력되어 있습니다.

 

2. DB에 입력된 종목의 실시간 "거래구분" 데이터 키움 서버에 요청하기

 42강에서 SetRealReg라는 함수에 대하여 아~주 자세히 설명하였으며, 이번에 이 함수를 사용하여 원하는 정보를 키움 서버로 요청해 보겠습니다. 우선 원하는 종목에 대한 "거래 구분" 데이터를 얻기 위해서는 스크린 번호가 필요합니다.

 

실시간 "거래구분" 데이터 키움서버에 요청하기
실시간 "거래구분" 데이터 키움서버에 요청하기

 

- self.screen_num = 5000 : 초기 스크린 번호를 5000으로 하였습니다. 한 종목당 하나의 스크린 번호 할당을 위해 self.screen_num += 1이라는 코딩도 추가해 두었습니다. 즉,  한 종목에 대한 "거래 구분" 데이터를 요청할 때마다 스크린 번호를 1씩 증가시켜, 각 종목마다 1개의 스크린을 할당합니다.

 - for code in self.k.portfolio_stock_dict.keys() : self.k를 이용하여 싱글턴 스크립트에 접속 후 portfolio_stock_dict에 있는 각 종목 코드를 하니씩 빼내어 code에 입력시킵니다.

 - fid = self.realType.REALTYPE["주식체결"]["체결시간"] : FID 번호를 가져오기 위해 self.realType을 이용해 RealType()에 접속 후 REALTYPE 딕셔너리에 저장된 주식체결의 체결시간 FID 번호를 가져옵니다. 20을 가져올 것입니다.

 - self.k.kiwoom.dynamicCall("setRealReg(Qstring, Qstring, Qstring, Qstring, self.screen_num, code, fids, "1") : 42강에서 정말 자세히 설명드렸습니다. 그래도 설명드리겠습니다. self.k를 이용해 싱글턴에 접속 후 키움 서버로 명령 전송을 위한 kiwoom.dynamicCall 함수를 사용합니다. 그리고 setRealReg를 이용해 원하는 종목을 등록하는데 이때, 스크린 번호, 원하는 종목 코드, FID 번호, 연속받기)를 입력합니다. 이때, 가장 중요한 것이 저희는 "체결시간"에 대한 FID 번호 20만 요청하였죠? 하지만 키움 서버에서는 친절하게 체결시간의 FID 번호 중 하나만 요청하여도 기타 정보인 "현재가", "거래량"등의 20가지가 넘은 다양한 데이터를 넘겨줍니다. 즉, 하나씩 하나씩 모든 정보를 요청할 필요가 없습니다.

 

 여기까지 하시면 우리가 원하는 종목을 모아둔 portfolio_stock_dict에 저장된 모든 종목의 "거래구분" 데이터를 요청하신 것입니다. 하지만.. 우리는 한 가지 안전장치를 해 두셔야 됩니다. 혹시 프로그램이 종료될 경우 "우리 컴퓨터"에서만 실시간 데이터 요청이 종료된 것이지 키움 서버에 등록된 실시간 정보 요청 값은 종료된 것이 아닙니다. 즉, 제작된 프로그램을 켜자마자 "우리 컴퓨터"에서 아직 등록하지도 않은 실시간 데이터 값들이 키움 서버로부터 밀려 들어와 컴퓨터에 에러가 발생할 수 있습니다. 

3. 안전장치 구현

혹시 모를 상황에 대비하여 키움 서버로 요청한 모든 실시간 데이터 요청을 끊습니다. 아래 KOA Studio를 보시면 SetRealRemove()함수를 사용할 경우 실시간시세 요청을 키움 서버로 부터 해지한다고 합니다. 우리는 모든 화면번호와 종목코드에 대하여 해지를 하기 위해서 아래 그림처럼 SetRealRemove(ALL, ALL)을 키움서버로 전송합니다.

 

KOA Studio 실시간 요청 해지 요청
KOA Studio 실시간 요청 해지 요청

 

실시간 요청 해지 요청 코딩
실시간 요청 해지 요청 코딩

 위 코딩을 보시면 KOA Studio와 동일하게 적어 넣으시면 되고, "거래구분" 데이터를 요청하기 전에 작성하셔야 됩니다.

 

4. 요약 및 전체 코드 공유

 (1) FID 번호를 가져왔습니다.

 (2) DB에 저장된 데이터에 대하여 실시간 "거래구분" 데이터를 요청하였습니다.

 (3) 혹시 모를 안전사항으로 실시간 데이터 요청한 것을 모두 해지 시키는 코드를 작성하였습니다.

 

반응형

 

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
반응형

.link_tit