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

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

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

안녕하세요?


지난번 포스팅에서 개발3일차를 위해서 Qt Designer에서 유저 인터페이스에 손을 보았는 것까지 포스팅을 했습니다. 이제는 이 유저 인터페이스가 작동할 수 있도록 적절하게 파이썬 스크립트를 짜 주는 일에 들어가야 하는데, 일단 작성까지는 하기는 했는데, 실행에서 에러가 발생하였습니다.



먼저 kiwoom.py에 위 스크린샷과 같이 get_server_gubun()이라는 메소드를 추가해 주도록 합니다. 이 메소드는 모의투자 서버와 실서버의 데이터가 차이점이 있어서 구분하는 메소드를 만들어야 한다고 합니다. 저야 자세히는 모르지만, 일단 모의투자 서버에서는 소수점을 포함을 한 값이 넘어오는데, 실제 주식투자를 하는 서버에서는 소수점을 포함한 데이터가 오지 않기 때문에, 구분해야 하는 이유가 발생한다고 합니다.



다음으로는 TR을 키움증권의 서버에 보내서, TR데이터를 받으면, 여기서 받은 TR에 따라서 작동하는 메소드를 달리 해야 합니다. 일단 OPW00018라는 TR은 대다수의 계좌정보를 가지고 올 수 있지만, 문제는 예수금이라고 해서 주식계좌의 잔고를 가지고 올 수는 없습니다. 그래서 하는 수 없이 OPW00001이라는 TR을 추가로 요청해야 합니다. 그것을 위해서 위 스크린샷과 같이 각각의 TR에 따라서 각각의 메소드가 작동이 되도록 디자인을 한 것입니다.



다음으로는 change_format()이라는 메소드를 소개하고 있습니다. 이 메소드에서는 그냥 가지고 오면 보기가 깔끔하지 않기 때문에, 이 데이터를 보기좋게 다듬는 메소드라고 보시면 됩니다.



다음으로는 포멧을 바꾸기 위한 2번째 메소드입니다. 이 메소드에서는 공백이라면 0으로 처리를 하고, 소수점을 의미하는 .이 오면, 이것도 역시 0으로 처리를 합니다. 그리고 앞자리의 시작이 -이면, 문자열로 된 값을 음수로 처리하기 위한 작업이라고 해야 할까요? 이런 작업을 하도록 합니다.



다음은 계좌의 예금된 돈을 알아보러 오는 TR이 도착했을 경우, 작동이 되는 메소드입니다. 역시 이 값은 _comm_get_data()을 이용해서 해당하는 항목을 가지고 온 다음, 이를 change_format()을 통해서 보기좋게 깔끔하게 다듬는 작업을 합니다.



다음으로는 opw00018이라는 TR이 오면 먼저 데이터가 들어갈 딕셔너리를 만드는데, 가능한한 빈 딕셔너리로 만들기 때문에 reset이라는 이름이 붙었습니다.




다음은 계좌의 대부분 정보를 가지고 오는 메소드를 보여주고 있습니다. 일단 메소드가 너무 길기 때문에, 하는 수 없이 2부분으로 짤라야 했는데, 먼저 single이라는 항목에는 모두 총괄적인 데이터를 가지고 오기 위한 딕셔너리의 항목이라고 볼 수 있습니다.



다음으로는 각각의 종목에 따라서 얼마나 보유하고 있으며, 가지고 있는 내용이 어떻게 표시할 것인지를 보여주고 있습니다. 일단 얼마나 많은 빈도(_get_repeat_cnt())를 가지고 와서, for문을 반복하는 형식으로 하나하나 가지고 오는 것을 보여주고 있습니다.


다음으로 위 스크린샷에서 본격적인  실행이 되는 if __name__ == "__main__": 에서 새로 추가된 항목을 보여주고 있습니다. 이 항목에서 먼저 kiwoom.py를 실행하면, 계좌의 번호를 가지고 와서, 이를 바탕으로 TR을 보내서 정보를 받아오라는 식으로 실행문이 되어 있습니다.



다음으로는 pytrader.py를 한번 수정해 보아야 하는 단계에 들어왔습니다. 가장 먼저 할일은 여기서도 타이머를 만들어야 하는 일이 있기에, 먼저 time이라는 모듈을 가지고 오도록 합니다.



그리고 이 타이머를 만든다는 것에서 알 수 있듯이, 위 스크린샷처럼 timer2라는 것을 만들어서 10초(1000 X 10)이라는 형식을 표시한 시간이 지나면, timeout2에 timeout이라는 신호를 보내라, 즉 10초마다 timeout이라는 신호를 보내라는 식으로 코드가 짜여졌습니다.




다음으로는 조회라는 버튼의 위젯이름이 pushButton2가 눌러져서 clicked라는 이벤트가 발생하면, check_balance()라는 메소드를 작동하도록 만들어 주었습니다.



다음으로는 10초마다 timeout이라는 신호가 나오는 2번째 타이머가 작동하면, 호출(call)이 되는 메소드인 timeout2()메소드가 실행이 되는데, 체크박스가 체크가 되었다 = true인 경우에만 check_balance()메소드가 작동이 되라는 식으로 작동을 하게 됩니다.



그리고 계좌를 조회하기 위한 opw00018이라는 TR에 대응하는 메소드입니다. 여기서 먼저 요청을 보내는데, 문제는 한번에 20개의 데이터만 가지고 올 수 있기 때문에, 하는 수 없이 만일 남아 있는 데이터가 있다면, while문을 사용해서 추가로 요청을 보내도록 하는 구조입니다.



다음으로는 테이블위젯에 내용을 추가해야 하는데, 먼저 for문을 사용해서 차례대로 추가를 하고, 다음으로는 resizeRowsToContents()라는 메소드로 테이블위젯의 크기가 데이터에 맞도록 조정을 해 줍니다.

다음으로는 multi라고 하는 인덱스가 있는 상세한 데이터는 두번째 테이블 위젯인 tableWidget_2에 하나하나 추가를 해 주도록 하고, 마지막으로 두번째 테이블위젯의 사이즈도 내용물에 따라 맞추어 지도록 해 줍니다.



이제 pytrader.py에서 프로그램을 실행시킨 다음에, 유저 인터페이스가 제대로 뜨는 것을 확인할 수 있었습니다. 이렇게 하는 것으로 준비는 끝났고, 이제 조회버튼을 누르면, 내용물이 나오면 됩니다.



그런데 시작부터 무언가가 어긋나기 시작했습니다. 프로그램이 어딘가에서 에러가 발생해서 그만 중지가 되고 종료가 된 것입니다. 이런 경우에는 PyCharm에서도 어디가 문제인지 일일히 나오지 않기 때문에, 처음에는 힘이 빠지면서 당혹 스럽기도 합니다. 그래도 방법이 다 있기는 있기 때문에, 일단 어떻게 해 보도록 하겠습니다.

반응형