PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (7) - tableWidget 사용하기 ③

  • -

지난 게시글에서는 실시간 등록이 이루어지는 동시에 해당 종목코드의 데이터가 tableWidget에 등록되도록 설정했다. 이번 게시글에서는 실시간 데이터가 발생하는 경우에 곧바로 tableWidget 내에 해당 실시간 데이터를 입력하도록 하는 코드를 구축할 예정이다.

 

 

소름끼치게 간단하다.

이전에 실시간 등록을 하는 시점에서 tableWidget에 종목코드(item_code)를 입력하도록 하는 코드를 작성했는데, 그 과정에서   self.tableWidget.setItem(row_num, column_num, DATA)  와 같은 구조로 데이터를 입력할 수 있다는 걸 확인했다. 실시간 데이터를 등록하는 것 역시 위와 같은 구조의 코드를 구축하여 기능을 구현할 수 있다.
※ Line : 17~23

    """실시간 데이터 수신 구간"""
    def receive_realdata(self, jongmokcode, realtype, realdata):

        if realtype == "주식체결":
            now = self.__getcommrealdata(jongmokcode, 10)
            acc_vol = self.__getcommrealdata(jongmokcode, 13)
            acc_tvol = self.__getcommrealdata(jongmokcode, 14)
            open = self.__getcommrealdata(jongmokcode, 16)
            high = self.__getcommrealdata(jongmokcode, 17)
            low = self.__getcommrealdata(jongmokcode, 18)
            turnover = self.__getcommrealdata(jongmokcode, 31)
            strength = self.__getcommrealdata(jongmokcode, 228)
            gubun = self.__getcommrealdata(jongmokcode, 290)

            print(f"[{jongmokcode}] NOW:{now}, HIGH:{high}, LOW:{low}, OPEN:{open}, ACC VOL:{acc_vol}, ACC TVOL:{acc_tvol}, TURNOVER:{turnover}, STRENGTH:{strength}, GUBUN:{gubun}")

            self.tableWidget.setItem(row_num, dv.tableWidget_now, QTableWidgetItem(str(now)))
            self.tableWidget.setItem(row_num, dv.tableWidget_gubun, QTableWidgetItem(str(gubun)))
            self.tableWidget.setItem(row_num, dv.tableWidget_strength, QTableWidgetItem(str(strength)))
            self.tableWidget.setItem(row_num, dv.tableWidget_open, QTableWidgetItem(str(open)))
            self.tableWidget.setItem(row_num, dv.tableWidget_high, QTableWidgetItem(str(high)))
            self.tableWidget.setItem(row_num, dv.tableWidget_low, QTableWidgetItem(str(low)))
            self.tableWidget.setItem(row_num, dv.tableWidget_turnover, QTableWidgetItem(str(turnover)))

 

 

 

뭔가 이상하다. 열 번호는 어디서 구해오라는 거냐?

tableWidget에 데이터를 입력하기 위해서는 열과 행의 번호를 전달해줘야 하는데, 행의 번호는 이전 게시글에서   import  했던 dv 내 변수 값들을 사용할 수 있지만, 열의 번호는 어디서 구해오기가 쉽지 않다. 어떻게 얻어올 수 있을까?

지난 게시글에서 살펴봤던 도식인데, 이걸 거꾸로 돌아가면 된다. 그냥 깔끔하게 정리하자면,   [self.tableWidget]  의 데이터는 곧   [self.setrealreg]  변수의 데이터와 동일하다고 보면 된다. 따라서 row_num은   self.setrealreg  내의 index 번호가 되는 것이다. 우리가 특정 데이터프레임(DataFrame) 내에서 조건을 걸어서 우리가 원하는 데이터를 얻어오는 방법 역시 지난 게시글에서 살펴봤었다.
※ Line : 17

    """실시간 데이터 수신 구간"""
    def receive_realdata(self, jongmokcode, realtype, realdata):

        if realtype == "주식체결":
            now = self.__getcommrealdata(jongmokcode, 10)
            acc_vol = self.__getcommrealdata(jongmokcode, 13)
            acc_tvol = self.__getcommrealdata(jongmokcode, 14)
            open = self.__getcommrealdata(jongmokcode, 16)
            high = self.__getcommrealdata(jongmokcode, 17)
            low = self.__getcommrealdata(jongmokcode, 18)
            turnover = self.__getcommrealdata(jongmokcode, 31)
            strength = self.__getcommrealdata(jongmokcode, 228)
            gubun = self.__getcommrealdata(jongmokcode, 290)

            print(f"[{jongmokcode}] NOW:{now}, HIGH:{high}, LOW:{low}, OPEN:{open}, ACC VOL:{acc_vol}, ACC TVOL:{acc_tvol}, TURNOVER:{turnover}, STRENGTH:{strength}, GUBUN:{gubun}")

            row_num = self.setrealreg.index[self.setrealreg['item_code'] == jongmokcode].item()
            self.tableWidget.setItem(row_num, dv.tableWidget_now, QTableWidgetItem(str(now)))
            self.tableWidget.setItem(row_num, dv.tableWidget_gubun, QTableWidgetItem(str(gubun)))
            self.tableWidget.setItem(row_num, dv.tableWidget_strength, QTableWidgetItem(str(strength)))
            self.tableWidget.setItem(row_num, dv.tableWidget_open, QTableWidgetItem(str(open)))
            self.tableWidget.setItem(row_num, dv.tableWidget_high, QTableWidgetItem(str(high)))
            self.tableWidget.setItem(row_num, dv.tableWidget_low, QTableWidgetItem(str(low)))
            self.tableWidget.setItem(row_num, dv.tableWidget_turnover, QTableWidgetItem(str(turnover)))

 

 

 

오류가 발생할 수 있다.

실시간 데이터를 얻어오는 과정에서 발생할 수 있는 오류는 상당히 다양하다. 예를 들어, 실시간 등록 버튼을 누르지 않더라도 어떤 동작에 의해 실시간으로 등록되는 경우들이 있다. 가장 대표적인 예시가 차트 데이터를 조회하는 경우가 해당되는데, 차트 데이터를 조회하는 것만으로도 실시간으로 등록되어 실시간 데이터가 발생하게 된다.

하지만 우리는 차트 데이터를 요청하는 경우에는 tableWidget 데이터의 전신이 되는   self.setrealreg  변수 내에 종목코드 데이터를 추가하도록 하는 기능을 구현하지 않았고, 구현해줄 필요도 없다. 이 경우 tableWIdget 내에 특정 종목의 데이터가 입력될 자리가 없음에도 불구하고 특정 종목의 실시간 데이터가 발생함으로 인해   UnboundLocalError  가 발생한다.

다음으로, 우리는 row_num이라는 데이터를   self.setrealreg  변수 내에서 조회하는데, 동일한 상황에서 실시간으로 등록되지 않은 종목의 index 번호를 얻고자 할 경우   ValueError  가 발생한다.

이러한 오류들은 단순하게   try:  문과   except:  문을 통해 해결할 수 있으니, 걱정하지 말고 아래의 코드를 보도록 하자.
※ Line : 17, 27~30

    """실시간 데이터 수신 구간"""
    def receive_realdata(self, jongmokcode, realtype, realdata):

        if realtype == "주식체결":
            now = self.__getcommrealdata(jongmokcode, 10)
            acc_vol = self.__getcommrealdata(jongmokcode, 13)
            acc_tvol = self.__getcommrealdata(jongmokcode, 14)
            open = self.__getcommrealdata(jongmokcode, 16)
            high = self.__getcommrealdata(jongmokcode, 17)
            low = self.__getcommrealdata(jongmokcode, 18)
            turnover = self.__getcommrealdata(jongmokcode, 31)
            strength = self.__getcommrealdata(jongmokcode, 228)
            gubun = self.__getcommrealdata(jongmokcode, 290)

            print(f"[{jongmokcode}] NOW:{now}, HIGH:{high}, LOW:{low}, OPEN:{open}, ACC VOL:{acc_vol}, ACC TVOL:{acc_tvol}, TURNOVER:{turnover}, STRENGTH:{strength}, GUBUN:{gubun}")

            try:
                row_num = self.setrealreg.index[self.setrealreg['item_code'] == jongmokcode].item()
                self.tableWidget.setItem(row_num, dv.tableWidget_now, QTableWidgetItem(str(now)))
                self.tableWidget.setItem(row_num, dv.tableWidget_gubun, QTableWidgetItem(str(gubun)))
                self.tableWidget.setItem(row_num, dv.tableWidget_strength, QTableWidgetItem(str(strength)))
                self.tableWidget.setItem(row_num, dv.tableWidget_open, QTableWidgetItem(str(open)))
                self.tableWidget.setItem(row_num, dv.tableWidget_high, QTableWidgetItem(str(high)))
                self.tableWidget.setItem(row_num, dv.tableWidget_low, QTableWidgetItem(str(low)))
                self.tableWidget.setItem(row_num, dv.tableWidget_turnover, QTableWidgetItem(str(turnover)))

            except UnboundLocalError:
                pass
            except ValueError:
                pass

 

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.