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

손과 발 역할을 하는 프로그램의 정리 part2

by 인터넷떠돌이 2020. 4. 3.
반응형

안녕하세요?

 

지난번 포스팅에서 어떻게 설명을 한다는 것이 그만, 싱글턴에 대해서 많은 설명을 하고 말았는데, 아무튼 싱글턴 혹은, 싱글톤이라는 것은 제가 프로그램을 만들면서 사용한 기술중에 하나 일 뿐입니다. 이번 포스팅에서도 어떻게 보면 지루할 수도 있는데, 그래도 그냥 코드만 따라하는 것 보다는 왜 이런 코드를 작성해서 이런 복잡하게 꼬았는지 알려주는 것이 가장 필요하다는 생각이 들었습니다.

 

일단 눈썰미가 좋으신 분들은 아시리라 생각을 하지만, 제가 만들어 낸 각각의 스레드에 해당이 되는 항목에 왜 이렇게 txt파일을 읽어들이는 부분이 있는가 하는 생각이 드셨을 겁니다. 이게 중요해 보이지 않으실 수도 있는데, 사실은 제 알고리즘 트레이딩 프로그램을 작동시키는데 상당히 중요한 부분입니다.

 

일단 지난번 포스팅을 보셨으면 알 수 있겠지만, 제가 만들어 놓은 자식 프로세스 - child process에서 2개의 class가 있는 것을 볼 수 있습니다. 여기서 메인으로 실행이 되는 MainWindow라는 클래스는 항공모함에 비유할 수 있으며, 여기서 QThread를 이용해서 각각의 스레드로 실행이 되는 Worker라는 클래스는 항공모함에서 발진한 함재기라고 할 수 있습니다. 실제 작업은 이 Worker라는 클래스가 작동이 되는 함재기 - 그것도 한개가 아닌 여러개가 작동을 하게 됩니다.

 

그런데 여기서 중대한 문제점이 발생했습니다. 지금은 어느정도 힌트가 잡힌 감이 있기는 있어도, 문제는 이 프로그램을 만들 당시에는 제가 각각의 스레드라고 할 수 있는 저 전투기 - 함재기에다가 명령을 전달해야 하는데, 항공모함인 MainWindow에서 Worker사이에 데이터를 주고 받는 기술을 몰랐습니다.

 

그래서 생각해 낸 것이 무엇이냐 하면, 실시간으로 통신을 내릴 수 없다면, 차라리 Worker클래스가 작동하기 전에 미리미리 텍스트 파일을 만들어 놓고 나서, 그걸 각각의 함재리라고 할 수 있는 스레드가 받아서 작동을 하면 된다는 생각을 했었습니다.

 

 

그래서 이 txt파일은 어떻게 작성을 하느냐 하면, 여기서 먼저 코드 리스트를 확보해 놓아야 합니다. 그리고 나서 이 코드리스트 - 이것도 텍스트 파일인데, 이 파일을 ㅇ리단 communityMarker라는 새로운 py파일에 만들어 놓은 다른 프로그램을 따로 실행시켜서, 여기서 각각의 번호에 대응이 되는 txt파일이 생성이 되게 됩니다. 다시한번 말하지만, 텍스트 파일을 생성하는 것은 어디까지나 다른 py파일에서 작업을 한 것 입니다.

 

그럼 다시 코드로 돌아와서, 이 txt파일을 읽어보는 부분이 정확히 무엇을 읽어 들이냐 하면, 데이터 베이스가 어디에 있는 어느 파일인가 하는 정보와, 지금 거래를 하는 종목의 주식 코드가 어떻게 되는가, 그리고 제가 다른 것을 하다가 가지고 왔는 것 때문에 들어가 있는 더미 데이터를 포함한 내용을 읽어 들이게 됩니다.

 

그래서 왜 이런 식으로 작업을 하느냐, 그냥 함재기에 해당하는 Worker클래스에서 키움증권에서 데이터를 그때 그때 요청하면 되지 않느냐 하실 거라면, 여기서 문제가 있습니다. 일단 키움증권 서버에서 일일히 캔들챠트 - 주식정보를 요청해서 가지고 올 수 있지만, 제가 한개의 종목만이 아니라 20개가 넘는 종목을 한꺼번에 보고 있기 때문에 발생하는 문제가 있습니다.

 

바로 한개의 아이디로 로그인을 해서 서버에 요청을 일정횟수 이상 하게 되면, 요청횟수 제한을 초과하게 되었다고 키움증권 서버에서 접속을 잠시 차단해 버립니다. 그래서 이를 피하기 위해서, 위 그림과 같이 이런 문제에 직면하게 됩니다.

 

그래서 어떻게 하느냐 하면, 먼저 주식시장이 시작하는 9시가 되기 전에, 먼저 데이터 베이스 파일을 생성해 놓도록 합니다. 이게 일봉챠트가 되든 분봉챠트가 되든 중요한 것은 주식시장이 시작하기 전에 이 작업을 해 놓아야 한다는 것 입니다.

 

그렇게 하고 나서 이제 오전 9시를 넘어서 주식 시장이 시작되게 되면, 먼저 실질적인 거래를 하게 되는 Worker라는 스레드가 데이터 베이스를 읽어서 정보를 얻은 다음에, 키움증권 서버에 요청을 해서 현재의 주가나 거래량등을 가지고 오게 됩니다.

 

그런데 눈치 채신 분들도 있겠지만, 이렇게 하면, 데이터 베이스 파일이 어디까지나 과거의 데이터 이기 때문에 주식시장이 열려서 움직이는 현재의 데이터를 그대로 반영하지는 않습니다. 즉, 최신의 데이터가 아니라는 문제점이 있어서 이를 다음과 같이 해결해야 했습니다.

 

먼저 키움증권 서버에서 가지고 온 데이터는 위 그림에서 알 수있듯이 5개 항목으로만 되어 있습니다. 이 정보를 일단 실질적으로 거래를 하는 스레드가 읽어 들인 다음에는 이 5개의 데이터를 기존의 데이터 베이스 파일에 같은 종목 코드가 맞는 테이블에다가 집어 넣도록 합니다.

 

그리고 나서 다시 이 데이터 베이스 파일은 이제 이전에 비해서 한줄 더 업데이트가 되어 있게 됩니다. 이제 그 데이터 베이스 파일을 다시 함재기에 해당하는 스레드가 읽어 들여서 다시 작업을 하게 되는 것이라고 할 수 있습니다.

 

좀 어렵고 이해가 잘 되지 않으신다면, 그냥 실질적으로 주식을 거래하는 각각의 스레드는 전투기이고, 항공모함에서 출격하기 이전에 일단 임무 브리핑을 받도록 합니다. 그리고 나서 항공모함과 통신이 되지 않지만, 그래도 미리 받아낸 브리핑의 내용대로 작업을 하게 되는 것이라고 보시면 됩니다.

 

다만 여기서 한꺼번에 너무 많은 것을 설명하지 않고 하나하나 띄워서 설명을 하다 보니, 이제 QThread니 이 함재기니 이게 클래스랑 무슨 상관이라고 하실 분들이 계실 것인데, 이에 대해서는 다음 포스팅에서 설멍을 드리고자 합니다. 다만 저도 강의를 들으면서 배워가며 한 사람이 아니라서, 진짜로 설명하려고 하는데 많은 힘이 듭니다.

 

그래도 따라오고자 하시는 분들에게 제가 설명해야 하기에, 일단 이해를 하고 나서 다시 설명한다고 그림을 만들고 있습니다. 다만, 자화자찬같지만 제가 만들어 놓고도 이걸 이해를 100% 다 못하고 있는 상황이기도 합니다. 그럴 정도로 프로그램의 ㅍ 도 모르고 시작하다 보니 생긴 문제인데, 그래도 이런 포스팅을 통해서 저도 지식을 정리하고, 읽으시는 여러분도 따라오시는 데 문제점이 없도록 만들어 보겠습니다.

반응형