안녕하세요?


지난번 시간에는 [파이썬으로 시작하는 알고리즘 트레이딩]이라는 책에서 소개하고 있는 pytrader의 개발을 1일차까지 완료하는 데 성공했습니다. 그래서 이번에는 2일차에 해당하는 내용인 GUI라고 그래픽 유저 인터페이스의 기초를 만들어 놓은 다음, 이를 바탕으로 매수주문을 넣어서 제대로 주문이 되는지를 확인하는 것 입니다.



일단 Qt Designer를 열어서 위 스크린샷처럼 먼저 유저 인터페이스를 디자인 하도록 합니다. 그러면서 여기다가 PyTrader v0.2 라고 이름부터 바꾸어 주도록 합니다.



그리고 나서 여기서 넣어진 콤보박스에서는 지정가와 시장가라는 항목이 있는데, 이 항목에 따라서 한번 콤보박스에 들어갈 내용을 만들어 보도록 합니다.



그리고 나서 텍스트 입력 박스 중에서 두번째 박스를 선택한 다음에, 여기다가 속성 편집기 안으로 가서, stylesheet라는 항목을 선택하도록 합니다. 여기서 선택한 이후에 있는 ...이 적혀있는 네모 버튼이 있는데, 이 버튼을 누르도록 합니다.



그러면 스타일시트 편집이라는 윈도우가 열리는데, 여기다가 색추가를 누르도록 하고, 여기서 background color를 선택하도록 합니다.



그리고 나서 배경색을 지정해 주면, 위 스크린샷과 같은 내용으로 나오는 것이 있는데, 이렇게 해서 배경색을 지정해 주는 것이 가능해 집니다.



확인 버튼을 누르고 나면, 위 스크린샷과 같이 텍스트 입력 박스의 내용이 다르게 바뀐것을 확인할 수 있습니다. 이제 다음단계로 넘어가도록 해 봅니다.




실수로 수량과 가격항목에서는 콤보 박스가 아니라 스핀(spin) 박스라는 것을 입력해야 했는데, 아무튼 간에 이걸 바꾸어 주도록 합니다.



그리고 나서 현금주문이라는 버튼도 하나 만들어 주도록 합니다.



이어지는 내용인데, 먼저 PyTrader에서 sendOrder라는 메소드를 이용해서 키움증권의 서버에 주문요청을 보냅니다. 그리고 나서 서버가 이 메소드에 의한 신호를 받으면, OnReceiveChejanData라는 이벤트가 일어나서 다시 PyTrader로 서버가 신호를 보내게 됩니다. 그리고 나서 GetChejanData라는 메소드를 이용해서 계좌정보 같은 것을 가지고 오게 됩니다.



다음으로는 키움증권 Open API+ 개발 가이드에서 나와있는 sendOrder라는 메소드에 대한 내용입니다. 어떤 값들이 입력이 되는 것인지 여기에 적혀 있으며, 이제 GUI가 이 입력값들이랑 연동이 되어야 합니다.



그리고 나서 이제 코딩을 할 시간인데, 엄저 kiwoom.py에다가 OnReceiveChejanData라는 이벤트가 들어오면, _receive_chejan_data()라는 메소드가 실행이 되도록 _set_signal_slots(self): 메소드에 지정을 해 주도록 합니다.



다음으로는 get_login_info()라고 하는 로그인 정보를 가지고 오는 메소드를 만들어 주도록 합니다. 형식은 역시나 PyQt5에 있는 dynamicCall()메소드를 이용해서 원래는 파이썬을 지원하지 않는 Open API+의 고유한 메소드를 사용할 수 있도록 만들어 줍니다.




다음으로는 위 스크린샷처럼 대량의 메소드를 타이핑해 주는데, 여기쇼ㅓ 주목해야 하는 것은 send_Order메소드를 보면 옆에 self말고 rqname과 같은 다양한 말이 있는 것을 볼 수 있습니다. 여기서 이 값을 바로 다음과 같은 형식으로 만들어져 있습니다.


self.dynamicCall("SendOrder(~~~~)",[~~~~])


여기서 SendOrder()메소드에 들어가야 할 값들이 여기서는 QString이라는 형식이며, 각각 어떤 파이썬의 변수와 대입이 되는지를 알아보기 위해서 [ ] 안에 들어가 있는 값들이 하나하나 순서대로 대입이 되는 것으로 생각이 됩니다. 물론 제가 틀릴 수도 있지만, 일단 지금의 제 레벨로서는 이정도로 밖에 모르겠습니다.



다음은 pytrader.py라는 스크립트에 있는 항목을 코딩한 것 입니다. 여기서 새로 추가된 항목은 바로 붉은색 박스안의 내용인데, 우선 self.kiwoom.get_login_info()라는 kiwoom.py에 있는 메소드를 가지고 오도록 명령을 할 수 있습니다. 당연 여기서 있는 "ACCOUNT_CNT"과 같은 값들은 kiwoom.py에 있는 get_login_info()라는 메소드에서 반환하는 값들입니다. 그걸 pytrader.py에 가지고 와서 어떻게 써먹는 것이라고 볼 수 있습니다.


그리고 아래에 있는 다음과 같은 형식도 주목애햐 하는데......


self.위젯의 이름.이벤트.connect(self.메소드)


이런 식으로 Qt Designer에서 만들어 놓은 위젯의 이름에서 이벤트가 발생하면, connect를 통해서 해당하는 self뒤의 메소드가 실행이 되라는 식으로 만들 수 있는 것 입니다.



다음으로 추가한  메소드는 def code_changed(self): 라는 메소드인데, 여기서 우선 code와 name이라는 변수가 어떻게 지정되는 지를 보여주고 있습니다. code의 경우에는 우선 lineEdit이라는 위젯에서 텍스트를 가지고 와서, kiwoom.py에 있는 종목코드를 가지고 와서 종목명을 알아내는 get_master_code_name()이라는 메소드에 code를 입력해서 name의 값을 가지고 오고, 이 값을 아래의 형식으로 나타내는 것 입니다.


self.위젯의 이름.setText(변수)



일단 pytrader.py를 실행시킨 다음의 화면입니다. 일단 제가 디자인 한 대로 제대로 나오는 것은 확인할 수 있었습니다. 그런데 무언가 문제가 하나 생겼습니다.



어떻게 된 것인지 OCX등록을 해주어야 한다고 하는 오류 메세지가 나오는 것을 볼 수 있습니다. 이런 생각지도 못한 오류로 인해서 좀 지연이 되기는 되었습니다. 아무튼 일단 내용이 너무 길어지기 때문에 여기서 한번 끊어 주도록 하고, 다음 포스팅에서 이어서 내용을 올리도록 해 보겠습니다.

  1. 호바드 2020.01.14 02:24 신고

    여기 하기 부분..
    self.pushButton.clicked.connect(self.send_order)

    아래와 같이 "kiwoom."을 명시해줘야 하네요..
    self.pushButton.clicked.connect(self.kiwoom.send_order)

    감사합니다.

    • 안녕하세요?

      사실 프로그램을 짤 때는 딱히 정해진 것이 없기는 없습니다.
      예.......... 저도 이때는 딱히 어떻게 하지를 못해서, 책에서 있는 코드를 그대로 가져와서 쓴 적이 많았는데, 문제는 이때만 해도 책에 있는 코드에서도 오류가 조금 있었던 때였습니다.

+ Recent posts