안녕하세요?


어느덧 모의 주식투자에 제 인공지능 주식 투자자를 끌어들인지도 거의 2주일이 되어 간다는 생각이 드는데, 이제까지 했던 프로그램의 작동중에 가장 오류가 적게 나온 날이기도 했습니다.



일단 시작하자 마자 생기는 이 too many indices for array라는 에러가 뜨는데, 이건 맨처음 시작하자마자 행이 1줄만 있는 데이터 베이스가 원이이 되는데, 이 에러가 주식장이 마감된 상황에서 띄울때는 그냥 넘어갔습니다만, 주식 시장이 열린 장중에는 문제가 생기는 것을 볼 수 있습니다.



그래도 다시 pytrader를 시작하면, 이런 에러는 없어지면서, 일단은 제대로 모의 주식 투자가 시작이 되는 것을 볼 수 있기는 있습니다.



그런데 하다보니 위 스크린샷처럼 그냥 pytrader가 종료되어 버리는 현상이 벌어지는 것을 볼 수 있었습니다. 그래서 이걸 어떻게 해결해야 했습니다.



일단 먼저 waitTimer2라고 해서 2번째 타이머를 만들어 주는데, 왜냐하면 TR이 키움증권 서버에서 와서, 제 프로그램이 받은 다음에 계속해서 같은 루프만 돌고 있으면 생기는 에러였습니다. 그래서 일정시간 동안 진전이 없으면 다시 처음부터 시작하도록 만들어 주기 위한 타이머입니다.



그리고 나서, _receive_tr_data()라는 메서드안에서 위 스크린샷처럼 처음에는 240초라는 4분간 아무런 반응이 없으면 작동이 되도록 만들어 주도록 합니다. 그렇게 해서 TR을 서버로 부터 받는 즉시 타이머가 시작되도록 만들어 줍니다.



다음으로 2번째 타이머가 시간이 되면 호출이 되는 메소드가 위 스크린샷에 보이는 BreakerMethod입니다. 여기서 2번째 타이머를 초기화 하도록 하고, 동시에 resultOfComm을 False로 만들어서 다시 되돌리기 해 봅니다.




그리고 나서 혹시나 모르기 때문에, 제대로 commRqData의 메서드가 성공하고 나서 다음 줄로 이동을 하면, 역시나 2번째 타이머를 정지시켜 주도록 합니다.



역시 다른 commRqData를 다루는 코드가 성공적으로 끝난 뒤에는 위 스크린샷처럼 kiwoom.py에 있는 2번째 타이머를 정지시켜 주도록 합니다.



그런데 이러고 나서도, 위 스크린샷처럼 계속 에러가 뜨는 것을 볼 수 있었습니다. 이래서야 어디가 문제인지 에러가 나오면서 나왔는 표식등을 한번 더 살펴 보도록 합니다.



그래서 한번 이 메서드에 제대로 들어가기는 갔는지 한번 표식을 남겨서, 과연 제대로 제가 작성한 코드가 작동하기는 하는지 그 여부를 살펴 보고자 합니다.



다음으로는 4분은 너무 길다는 생각이 들어서, 하는 수 없이 2분으로 줄여서 한번 TR데이터를 키움증권 서버로 부터 받은다음 제대로 처리하지 못하고 계속 루프를 돌면 다시 시작하도록 만들어 줍니다.



그런데 다시 이 에러가 생기기는 했는데, 또 문제가 생겼습니다. 위 스크린샷을 보시면, _receive_tr_data가 다시 호출이 되면서 타이머가 도로 초기화 되면서 생기는 문제였습니다.




그래서 한번 클래스 변수를 하나 만들어 주도록 합니다. bool타입의 변수인 breakerFlag라는 변수를 만들어 놓아서, 처음에는 false상태로 만들어 줍니다.



다음에는 제대로 사용하기 위해서 self를 붙여서 초기화를 할때, 만들어 주도록 하기는 합니다.



그리고 나서, 위 스크린샷처럼 if문을 만들어 주어서, 한번 이게 False일 경우에만 타이머를 시작하며, 다시 재시작되는 것을 방지하기 위해서, 한번 타이머가 시작하게 되면, 이 breakerFlag를 True로 만들어 줍니다.



그리고 나서 타이머가 시간이 되면 나오는 메서드에서만 비로서 다시 False로 만들어 주도록 만들어 주도록 합니다. 그런데 다시 한번 보니까, 이 플래그를 다시 False로 만들어 주는 메서드가 따로 없다는 것을 이제서야 알았습니다. 나중에 이를 추가해야 할 필요성은 있어 보입니다.



그렇게 볼일이 있어서 오후 3시 30분을 넘어서 오후 4시가 다 되어서야 위 스크린샷처럼 에러가 나온 것을 볼 수 있습니다. 이 에러는 제가 위에서 수정한 TR을 키움증권 서버로 부터 받아서 생긴 것이 아니라, 너무 자주 키움증권 서버에서 현재가를 요청해서 발생하는 에러입니다.



그래서 위 스크린샷처럼 일단 0.2초의 여유를 주고서 다시 시작을 하라는 식으로 만들어 주도록 했습니다. 물론 아직까지는 이걸 실전에서 써본적이 없기 때문에 제대로 먹힐지 여부는 잘 모릅니다만, 그래도 일단은 이렇게라도 에러를 예방해 주는 조치를 취해 주어야 한다는 생각이 듭니다. 이제 설이 지나고 나서 다시 주식시장이 열리면, 다시한번 시도를 할 생각입니다.

+ Recent posts