PYTHON/AUTO TRADE SYSTEM

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

  • -

지난 게시글에서 실시간 데이터를 얻어오는 방법과 def __getcommrealdata()를 사용해서 종목코드와 FID 번호를 전달하여 특정 FID 번호에 해당하는 데이터를 조회하는 방법까지 살펴봤다. 하지만 실질적으로 실제 거래에 사용하기 위해서는 해당 데이터를 확인하고 사용할 줄 알아야 하는데, 본인은 이 방법을 tableWidget을 사용해서 활용하고 있다.

 

 

tableWidget이 뭔데?

tableWidget은 단순하게 우리가 앞서 차트 데이터를 조회하고 저장하기 전에 앞서 사용했던 데이터프레임(DataFrame)과 동일한 형태의 데이터라고 보면 된다. 데이터프레임(DataFrame)은 특정 열과 특정 행에 해당하는 데이터를 정확하게 확인할 수 있는데, tableWidget 역시 마찬가지이다. 특정 위치에 데이터를 입력하고, 특정 위치의 데이터를 얻어오는 것이 모두 가능하다. 따라서 실시간 거래 중에 발생하는 실시간 데이터를 tableWidget에 입력되어 있는 여러 데이터와 비교해서 매수 함수나 매도 함수를 동작하도록 하기에 용이한 기능이라고 할 수 있다.

 

 

tableWidget을 제작해보자

우리는 이 tableWidget을 복잡한 코드를 사용하지 않고, qt designer를 사용해서 생성할 수 있다. 물론, 어느 정도 기본적인 행에 대한 정보 정도는 입력해줘야 한다. 왼쪽 사진의 좌측 하단에 표시해둔 빨간색 네모칸을 드래그해서 화면에 두면 tableWidget 객체가 생성되고, 해당 객체를 더블클릭하면 오른쪽 사진과 같은 [표 위젯 편집] 창이 뜬다. 

[표 위젯 편집] 창 내에서는 행과 열에 대해 설명하고 있는데, 우리는 열은 전혀 신경쓸 것이 없고 행만 신경쓰면 된다. 열과 행의 개념은 수학의 "행렬"에서 이야기하는 행과 열이니, 이 부분이 헷갈린다면 tableWidget의 열과 행은 DataFrame의 인덱스와 칼럼에 해당한다고 생각하면 된다. 단순하게 열은 인덱스 번호고, 행은 칼럼 이름이라고 생각해도 된다.

 

우리는 여기서 행을 제작해줄 것이다. 열은 코드를 통해 자동적으로 구현되도록 할 수 있으니 차치하고, 행을 생성해서 행 별로 이름을 입력해주면 되는 것이다.

우리는 실시간 데이터와 알고리즘에 의해 계산된 매수 예정가격 및 매도 예정 가격을 tableWidget 내에 입력하고 해당 데이터를 수시로 얻어다가 사용할 것이기 때문에, 지난 게시글에서 제작했던 실시간데이터 모두와 매수 예정가, 매도 예정가를 각각 두 개씩 만들어보도록 하겠다. 행의 순서는 상관없지만, 보기에 직관적으로 판단할 수 있기만 하면 된다. 본인은 아래와 같은 순서로 작성했고, 확인을 누르면 tableWidget 내에서도 아래와 같은 순서로 행의 이름들이 자리하게 된다.

 

 


728x90

 

 

tableWidget의 사용 방법

앞서 이야기했듯, tableWidget은 DataFrame과 동일한 기능을 수행한다고 봐도 무방하다. 우리는 DataFrame을 사용할 때 인덱스 번호와 칼럼 이름을 바탕으로 데이터에 접근했는데(  DataFrame.loc[index_num, column_name]  ), tableWidget 역시 그와 마찬가지로 인덱스 번호와 칼럼 이름이 필요하다. 다시 말해, 인덱스 번호에 해당하는 열의 번호와 칼럼 이름에 해당하는 행의 번호가 필요하다.

앞서 이야기했듯 열의 번호는 코드를 통해 구축할 수 있다고 설명했으니, 행의 번호에 대해서 먼저 알아보도록 하자. 행의 번호는 말 그대로 앞서 우리가 tableWidget에서 제작했던 행의 리스트 순서대로 0, 1, 2, 3, ....으로 이어지는 번호이다. 따라서 "종목코드" 행은 0번, "종목명" 행은 1번, "현재가" 행은 2번이라는 것이다. 하지만 조금만 생각해보면 이것들을 하나하나 0, 1, 2, 3이라는 값을 입력하기에는 떠오르는 문제점이 하나 있다. 바로 행의 순서가 변경되거나 새로운 행이 기존의 행 사이에 추가됐을 경우이다.

만약 1번 행에 있는 "종목명"행이 없었다고 가정해보도록 하자. 그렇다면 "종목코드"가 0번 행이고 그 다음의 1번 행에는 "현재가"행이 위치했을 것이고 맨 마지막 11번째 행에는 "거래회전율"이 위치했을 것이다. 이 때 우리는 아래와 같은 코드를 구축했을 것이다.
※ row_num, 뒤에 있는 숫자와 그 뒤의 초록색 "" 문자열만 확인하자.

self.tableWidget.setItem(row_num, 0, "종목코드")
self.tableWidget.setItem(row_num, 1, "현재가")
self.tableWidget.setItem(row_num, 2, "장구분")
self.tableWidget.setItem(row_num, 3, "체결강도")
self.tableWidget.setItem(row_num, 4, "매수가(1)")
self.tableWidget.setItem(row_num, 5, "매수가(2)")
self.tableWidget.setItem(row_num, 6, "매도가(1)")
self.tableWidget.setItem(row_num, 7, "매도가(2)")
self.tableWidget.setItem(row_num, 8, "시가")
self.tableWidget.setItem(row_num, 9, "고가")
self.tableWidget.setItem(row_num, 10, "저가")
self.tableWidget.setItem(row_num, 11, "거래회전율")

 

이 때 만약 "종목코드" 뒤에 "현재가"가 아닌 "종목명"을 추가하고 싶다면, 1번으로 입력되어 있는 "현재가"의 행 번호를 2번으로 바꾸는 동시에 뒤의 2번은 3번으로, 뒤의 3번은 4번으로, 뒤의 11번은 12번으로 모두 다 하나하나 변경해줘야 하는 불편함이 있을 것이다. 다시 말해, 아래와 같은 코드로 변경해줘야 할 것이다.

self.tableWidget.setItem(row_num, 0, "종목코드")
self.tableWIdget.setItem(row_num, 1, "종목명")
self.tableWidget.setItem(row_num, 2, "현재가")
self.tableWidget.setItem(row_num, 3, "장구분")
self.tableWidget.setItem(row_num, 4, "체결강도")
self.tableWidget.setItem(row_num, 5, "매수가(1)")
self.tableWidget.setItem(row_num, 6, "매수가(2)")
self.tableWidget.setItem(row_num, 7, "매도가(1)")
self.tableWidget.setItem(row_num, 8, "매도가(2)")
self.tableWidget.setItem(row_num, 9, "시가")
self.tableWidget.setItem(row_num, 10, "고가")
self.tableWidget.setItem(row_num, 11, "저가")
self.tableWidget.setItem(row_num, 12, "거래회전율")

 

이 tableWidget을 사용하는 지점이 실시간 데이터에만 존재한다면 모를까, 다른 위치에서도 참조했었다면 모든 tableWidget을 찾아서 값들을 올바르게 변경해줘야 정상적으로 동작할 것이다. (상상만 해도 골치아픈 작업이다.) 따라서 우리는 tableWidget 내에 있는 데이터의 행 번호를 별도로 지정해줄 예정이다. 바로 이전에 생성했던 valuable 폴더 내에서 _df.py 파일이 아닌 또 다른 파일을 생성해주도록 하자. (사용할 이름은 dummy_variable이다.)

그 후에 해당 파일 내에서 아래와 같이 행 이름과 행의 번호들을 연결하는 변수들을 생성해주자. 즉, tableWidget_itemcode는 tableWidget 객체의 "종목코드" 행을 의미하는 행 번호로, 0을 입력해주는 것이다.

"""dummy_variable.py"""

tableWidget_itemcode = 0
tableWidget_itemname = 1
tableWidget_now = 2
tableWidget_gubun = 3
tableWidget_strength = 4
tableWidget_buy_one = 5
tableWidget_buy_two = 6
tableWidget_sell_one = 7
tableWidget_sell_two = 8
tableWidget_open = 9
tableWidget_high = 10
tableWidget_low = 11
tableWidget_turnover = 12

 

우리는 이 변수들을 이용해서 tableWIdget을 조금 더 간편하게 사용할 수 있게 된다. 다시 말해, 앞서 설명했던 것처럼 모든 코드를 찾아서 하나하나 수정해줄 필요 없이 dummy_variable.py 파일 내에서 행 이름에 해당하는 변수의 값을 변경해주면 된다는 것이다. 

 

 


728x90
반응형
Contents

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

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