본문 바로가기
무모한 도전-주식 인공지능 만들기

pytrader를 만드는 실습에 들어가기-15-

by 인터넷떠돌이 2018. 12. 4.
반응형

안녕하세요?


지난 포스팅에서 pytrader를 개발하는 과정의 3일차 단계인 계좌정보를 가지고 오는 것을 완성했는데, 이번 포스팅에서 부터는 4일차 과정에 해당하는 단계를 밟고자 합니다. 물론 이 과정도 이런저런 사정이 있어서 한번에 시원하게 해결이 되지는 않았는데, 그래도 어떻게 해서 프로그램을 작동 시키고, 그 과정을 포스팅 하고자 합니다.



먼저 Qt Designer를 실행시켜서, 기존의 유저 인터페이스 아래에 있는 새로운 Group Box를 추가하도록 하고, 여기다가도 Table Widget을 추가하도록 합니다. 그리고 나서 column(행)에다가 '주문유형', '호가구분', '수량', '가격', '상태'라고 6개의 행을 추가해 주도록 합니다.



그리고 이번에는 pytrader.py와 pytrader.ui가 있는 폴더에다가 buy_list.txt라는 텍스트 문서 파일을 만들고, 또 다른 텍스트 파일인 sell_list.txt파일을 새로만들기를 통해서 만들어 줍니다.



먼저 매수를 위한 리스트를 만들어 주는데, 일단 세미콜론(;)을 기준으로 해서, 각각의 항목을 구분하게 해 주고, 일단 먼저 매수라고 적혀 있는 부분은 주문유형이고, 위에서 만들어준 GUI와 같은 순서로 종목의 코드부터 하나하나 적어 놓도록 합니다.



그리고 나서 이번에는 sell_list.txt라고 해서, 매도를 위한 리스트를 만들어 주도록 합니다. 일단 여기서도 순서는 위에서 만든 매수 리스트와 마찬가지이며, 가격은 시장가를 했기 때문에 역시 지정하지 않은 0으로 처리해 줍니다.



이제 pytrader.py파일을 수정하는 단계에 들어갔습니다. 먼저 주식시장이 마감이 되었는지 알아보기 위해서, 위 스크린샷처럼 trade_stocks_done이라는 변수가 False 선언을 해 주도록 합니다.



그 다음으로 추가를 하는 메소드는 먼저 trade_stocks(self): 라는 메소드라는 것으로, 간단하게 말하면, 앞서 만들어 놓은 buy_list.txt와 sell_list.txt의 지시내용에 기초를 해서, 각각 매수와 매도를 수행하는 메소드입니다. 일단 위 스크린샷에서 나와 있는 내용은 가장 먼저 주목해야 하는 것은 open()이라는 함수인데, 'rt'라고 해서 읽는 모드로 open(열기)를 하라는 식으로 미리 만들어 놓은 txt파일을 열어보는 것 입니다.



그 다음의 자동 매매를 위한 메소드는 위 스크린샷과 같습니다. 일단 기존의 콤보박스-최초로 설치한 콤보박스에서 나와있는 계좌번호를 가져오라 .Text()라는 함수로 가지고 오며, 이를 for문을 써서 리스트로 되어 있는 buy_list를 가지고서 하나하나 분리라고 해야 할까요? 이런 단계를 밟게 됩니다. 


for 변수 in 리스트형식 변수

변수 = 리스트 형식 변수의 0번째 요소

변수 = 리스트 형식 변수의 1번째 요소

변수 = 리스트 형식 변수의 2번째 요소

                 .

                 .

                 .


이런 식으로 어떻게 하는 것이 가능한데, 문제는 위에서 언급한 리스트 형식 변수의 0번째 요소라는 것이 여기서는 1첫번째 txt파일에 있던 줄을 의미하게 되는 것 입니다. 그리고 여기서는 이렇게 1줄 씩 분리하는 것이 성공했다면, 다음으로 하는 것은 아래와 같은 방식을 따라 갑니다.


변수2 = 변수.split(';')

항목1 = 변수2[1]

항목2 = 변수2[2]

         .

         .

         .


이렇게 하는 식으로 하나하나 send_order라고 kiwoom.py에 있는 메소드를 사용하는 단계에 들어가게 됩니다. 당연 여기서 위에서 하나하나 분리해 놓은 항목1, 항목2 같은 것이 사용이 되게 되는 것 입니다.



이어서 같은 작업을 sell_list에서도 해 줍니다. 차이점이 있다면, 위에서는 buy_list.txt에서 가지고 왔지만, 여기서는 sell_list.txt에서 가지고 온 데이터를 바탕으로 작업을 한다는 것 입니다. 그리고 send_order에서는 계좌를 뜻하는 account옆에 있는 1이라는 주문값을, 매도를 뜻하는 2로 바꾼점이 차이점 입니다.



다음으로는 한줄한줄 읽은 리스트형 데이터인 buy_list에서 모두 읽어들이는 것이 완료가 되었으니 '매수전'이라는 항목을 '주문완료'라고 바꾸어 주라는 것 입니다. 역시 같은 내용이 sell_list에서도 적용이 되며, 여기서는 open()함수에서 wt라는 쓰기가능으로 열고, write()라는 함수로 그대로 적어주도록 합니다.



이제 다음의 위젯은 유저 인터페이스를 보기좋게 가공하기 위한 메소드를 불러 오도록 합니다. 여기서는 나와 있는 load_buy_sell_list(self): 라는 메소드입니다. 여기서는 각각 buy와 sell 리스트를 불러와서 라인별로 읽어 주도록 하며, 그리고 리스트형 변수인 buy_list와 sell_list의 요소 갯수를 세는 len()함수를 이용해서 얼마나 숫자가 있는지를 보고, 마지막으로 위에서 추가해 준 tableWidget의 rowCount를 지정해 주도록 합니다.



다음은 위 코드는 buy_list에서 나온 데이터를 테이블 위젯 안에다가 집어넣는 과정이라고 보면 됩니다.



마찬가지로 다음은 sell_list에서 있는 자료 항목을 가져다가 테이블 위젯에다가 집어넣는 과정을 보여주고 있는 것 입니다.



다음은 오전 9시를 넘어가 있다 = 주식시장이 열려있는 시간이고, 위에서 설정해 놓은 trade_stocks_done이 false라면 그대로 거래를 진행하라고 코드에서 명령을 하고 있습니다.



그런데 시작하자 마자 에러가 떴습니다. 뭐라고 해야 할까요? 이제는 하다보니, 에러 없이 넘어가는 것이 없다는 생각이 들 정도입니다.




어디가 문제인가 했더니, 코드를 입력하면서 모르고, 자리를 잘못 맞추어서 생긴 문제였습니다. 그래서 하나하나 일일히 위치를 옮겨야 했습니다.



그리고 나서 왜 에러 메세지가 나왔는 부분이 이제서야 사라진 것을 확인할 수 있었습니다. 이제 또 프로그램을 작동시켜 보도록 합니다.



그러나 이번에는 buy_list.txt가 없다는 메세지가 뜨는 것 입니다. 저는 분명히 새로 만들기를 이용해서 텍스트 문서 파일을 만들었는데, 이게 무슨 소리일까요?



알고보니, 만들어 놓은 파일의 이름이 파일이름.txt.txt라는 형식으로 되어 있어서 벌어지는 에러였습니다. 이 에러는 위 스크린샷에서 보이는 것처럼 그냥 파일의 이름을 바꾸어 주는 것으로 어떻게 해결을 할 수 있었습니다.



다음으로는 또 다른 에러가 나왔는데, 이건 책에서 나와 있는 구절이 에러였습니다. tableWidget_4가 아니라 tableWidget_3로 바꾸어야 했습니다.



일단 Ctrl + F 키를 눌러서 모든 tableWidget_4를 찾아낸 다음, 하나하나 tableWidget_3로 바꾸어 주고서야 이 에러는 더 이상 일어나지 않았습니다.



그러자 이번에는 지난번 포스팅에서도 나왔는 kiwoom이라는 변수 때문에 또 에러가 떴습니다. 이 에러역시 제가 kiwoom을 모두 K로 바꾸고 나서야 해결이 되었습니다.




일단 프로그램을 실행 시키자, 위 스크린샷처럼 하나하나 내용물이 제대로 뜨는 것을 확인할 수 있었습니다. 그리고 매수가 제대로 일어는 났는지, 주식의 보유량이 늘어난 것을 볼 수 있었습니다.



그리고 키움증권 홈페이지에 가서, 한번 거래내역을 봐서, 거래가 일어난 것 까지는 확인할 수 있었습니다.



buy_list.txt를 열어서 주문이 완료가 된 것도 확인할 수 있었습니다.



그리고 이어서 매도 주문도 처리가 된 것을 볼 수 있었습니다.



그러나 여기서 중대한 문제가 생겼습니다. 어떻게 된 것인지 매수 주문 5개는 모두 다 일어났는데, 매도 주문은 1개도 일어나지 않은 것 입니다. 분명히 txt파일 상에서는 처리가 되었다고 하지만, 실제 키움증권의 서버에는 요청이 들어가지 않았다는 이야기가 나오는 것인지도 모르겠습니다.

반응형