안녕하세요?

 

이번 포스팅 부터는 어떻게 해서 제 알고리즘 트레이딩 시스템에서 QThread를 적용해서 다중의 종목을 한번 조사해 보는 작업을 해볼 예정인데, 이 작업이 처음에는 쉬울 줄 알았는데, 예상외로 어려워서 많이 늦어지게 되었습니다. 아무튼 늦어진 것은 늦어진 것이고, 그래도 포스팅으로 올리고자 이렇게 늦게나마 글을 올립니다.

 

우선 첫번째 작업입니다. 일단 QRunnable에서 위 스크린샷과 같이 communication.txt에서 정보를 가지고 오는 것을 먼저 해야만 합니다.

 

그리고 나서 이 QThread에서 멀티 스레드를 실행시키는데, 일단 for문을 사용해서 먼저 1에서 5까지 5개의 스레드를 먼저 실행시켜 주도록 합니다.

 

일단 처음으로 해서 위 스크린샷처럼 5개의 종목에 관한 데이터를 동시에 얻어 오는데는 성공한 것을 볼 수 있었습니다. 문제는 여기까진 큰 문제가 없습니다만.......

 

일단 보기가 지저분해서 한번 더 실행을 했습니다. 5초간 쉬는 것도 없이 하니까, 제대로 위 스크린샷처럼 나오는 것을 확인할 수 있는데..........

 

 

일단 처음으로 키움증권 서버에서 종목의 기본적인 정보 -시가, 고가, 저가 종가 = 현재가, 거래량을 가지고 오는 메서드를 만들어서 얘를 실행하도록 해 줍니다.

 

그런데 이게 어떻게 된 일일까요? 제대로 작동이 되던 코드가 어떻게 된 일인지 제대로 작동을 하지 않는 현상이 벌어지는 것을 볼 수 있었습니다.

 

혹시 스레드가 너무 많아서 생긴 문제인 것인가 싶어서, 하는 수 없이 5개에서 3개로 줄여서 한번 더 시도를 해 보기로 했습니다.

 

이러고도 소용이 없자, 다음에는 위 스크린샷처럼 0.1초의 쉬는 시간을 주어서 너무 동시에 진행이 되어서 벌어지는 문제인가 싶었는데, 그것도 아니기는 했습니다.

 

그래서 어떻게 된 것인지 몰라서 전체 메서드를 일단 주석처리 해 놓고 나서, 실행이 되는 메서드에서 위 스크린샷처럼 먼저 input_value가 어떻게 되는 지에 대해서 한번 이야기 해 보도록 합니다.

 

결국 이렇게 input_value만 가지고서 한번 해 보니까, 제대로 나오기는 나옵니다. 그러면 이제 서버에 요청하는 것 까지는 성공적이라는 것을 알 수 있습니다.

 

그럼 다음으로 위 스크린샷과 같이 서버에서 온 정보를 받는 코드가 제대로 작동을 하는지 안 하는지를 알아보고자 합니다.

 

그렇게 해서 위 스크린샷처럼 일단 문제가 어디인지 알아낸 것 같기는 합니다. 서버에서 온 정보를 읽어들이는 메서드에서 에러가 난 것이라고 볼 수 있는데, 문제는 이렇게 되면 어디가 문제인지 일단 알아내기 상당히 힘들다는 것 입니다. 그럼에도 불구하고 일단 하기는 해 봐야 합니다.

'무모한 도전-주식 인공지능 만들기' 카테고리의 다른 글

QThread의 적용 part3  (0) 2019.07.28
QThread의 적용 part2  (0) 2019.07.28
QThread의 적용 part1  (4) 2019.07.27
QThread를 향한 공부-final-  (2) 2019.07.26
QThread를 향한 공부-4-  (0) 2019.07.26
QThread를 향한 공부-3  (2) 2019.07.26
  1. 호바드 2020.02.21 07:46

    안녕하세요?

    def __init__(self, number, *args, **kwargs):
    super(Worker, self).__init__(*args, **kwargs)
    self.K = Kiwoom()
    print(self.K)
    self.number = number
    이 부분에서 self.comm_connect() 문장도 없는데 어떻게 connected 가 되는지
    궁금합니다.
    Kiwoom class에서 connect 한 걸까요?
    아무리 봐도 이상해서 문의 드립니다.

    kiwoom.py를 보면..
    아래와 같습니다.
    아직 comm_connect하지 않은 상태거든요..
    저의 소스가 최종상태가 아니라서 그럴까요?

    class Kiwoom(QAxWidget):

    trigger01 = False
    trigger02 = False
    trigger03 = False
    resultOfComm = True
    breakCounter = 0
    breakerFlag = False
    state_of_Msg = ''

    def __init__(self):
    super().__init__()
    self._create_kiwoom_instance()
    self._set_signal_slots()
    self.waitTimer = QTimer()
    #waitTimer.moveToThread(self)
    self.waitTimer.timeout.connect(self.Breack_and_Retry)
    self.waitTimer2 = QTimer()
    self.waitTimer2.timeout.connect(self.BreakerMethod)
    self.aRQname = ''
    self.aTRcode = ''
    self.aNext = 0
    self.aScreenNo = ''
    self.inputID = ''
    self.inputValue = ''
    self.trigger01 = False
    self.trigger02 = False
    self.trigger03 = False
    self.resultOfComm = True
    self.breakCounter = 0
    self.breakerFlag = False

    def _create_kiwoom_instance(self):
    self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def _set_signal_slots(self):
    self.OnEventConnect.connect(self._event_connect)
    self.OnReceiveTrData.connect(self._receive_tr_data)
    self.OnReceiveRealData.connect(self._receive_real_data)
    self.OnReceiveChejanData.connect(self._receive_chejan_data)
    #self.OnReceiveMsg.connect(self._receive_msg)

    • 안녕하세요?

      일단 이 작업은 메인이 되는 스레드라고 해야 할까요? 일단 각각의 서브 스레드가 실행되기 전에 메인이 되는 클래스-스레드에서 접속을 미리 해 주었습니다.

  2. 호바드 2020.02.22 22:29

    안녕하세요?

    그럼, 가각의 서브쓰레드가 실행되기 전에 메인이 되는 클레스-쓰레드로 미리
    실행되는 접속해 두는 부분에 대해서도 설명을 해 주시면 안될까요?
    그 부분이 없으니, 똑 같이 실행이 안되는 것 같습니다...

    이 부분 해결 못하면, 이후에 계속 못따라갈 듯하여.. 고민입니다.. 몇번을 반복해 봐도.. 동일합니다...

    • 안녕하세요?

      일단 저도 한번 찾아보고 설명을 드리도록 하겠습니다. 이게 워낙 오래전인가 그래서 재수 없으면 죽어버린 하드 디스크 속에 있는 것이고, 아니라면......... 일단 찾아서 올려 드리겠습니다.

+ Recent posts