안녕하세요?


지난 포스팅에서 어떻게 한번 에러를 하나 수정을 하고서 이제 순항을 할줄 알았습니다만, 또 다시 예상치 못한 에러가 나와서 제대로 진행이 되지 않는 일이 일어났고, 이를 수정하기 위해서 한번 더 작업을 해야 했습니다. 그런데 하다하다 보니 작업이 연속해서 나와서 이번 포스팅에 다 끝내지 못하고, 남은 몇 부분으로 나누어야 했습니다.



일단 먼저 찾아낸 것은 위 스크린샷처럼 commRqData가 정상적인 처리인 0이 아니라 -211이 나오는 경우 입니다. 이게 에러 메세지는 맞는데, 문제는 키움증권 Open API 개발 가이드에서도 나와 있지 않은 에러라서 정말 어디가 잘못된 것인지 알 길이 없었습니다.



문제는 이런 -211 오류코드가 나온 이후에 프로그램이 멈추었다고 해야 할까요? 그냥 아무런 반응이 없기 가만히 있기만 하는 상황이 계속되는 것을 볼 수 있었습니다.



그래서 위 스크린샷처럼 let라는 commRqData를 해서 나온 값이 0이 아닌 경우에는 다시 TR을 송신해서 그 결과를 받도록 해라는 식으로 일단 코드를 짜 놓았습니다.



그런데 이렇게 하고서도 다시 요청을 한다고 해서, 문제가 해결이 되는 것이 아닌 것을 볼 수 있었습니다. 즉, TR을 다시 서버에 보낸다고 해결이 되는 문제가 아니라는 것 입니다.



그런데 그렇게 생각을 이 당시에는 하지 못 하고, TR code랑 RQ name이 들어가지 않아서 생긴 오류라고 먼저 생각을 하여서 위 스크린샷처럼 지정을 해주는 작업을 했습니다.




그렇게 하고 나서도 계속해서 -211 코드가 뜨고나면, 역시나 프로그램이 정지가 되어 버려서 pytrader를 종료하고 다시 시작해야 하는 작업을 계속해야 했습니다.



그래서 이번에는 resultOfComm이라는 bool형식의 변수를 만들어서, 처음에는 True지만, -211이라는 에러가 나오면 False라는 형식으로 변하도록 조정을 해 주었습니다. 그리고 나서 기존에는 반환하는 값이 전혀 없었는 comm_rq_data()메서드지만, 이제는 return resultOfComm이라는 형식을 띄도록 바꾸어 주었습니다.



다음으로 이 변수를 pytrader.py에서도 사용할 수 있도록 만들어 주기 위해서, 위 스크린샷처럼 초기화를 하기 전에 변수를 선언해 주고, 다음으로 __init__()에서도 self.를 붙여서 선언을 해 주도록 만들어 주었습니다.



그러나 그러고도 문제가 홰결이 안 되었는데, 왜 안되었냐 하니, 앞에다가 self.를 붙여주는 것을 잊어버려서 벌어진 일이기는 했습니다.



이렇게 하고나서 pytrader.py로 가서, 위 스크린샷처럼 만약에 comm_rq_data를 해서 반환되는 값인 resultOfComm이 False라면 다시 시작하는 식으로 명령문을 내려 주도록 합니다.




그런데 하다보니이제는 -200이라고 해서 시세조회 과부하를 뜻하는 에러 메세지가 나와서 그대로 pytrader가 뻗어버리는 사태가 벌어져 버린 것이 나왔습니다.



문제는 이런 경우가 어쩌다가 한번도 아니고, 연속해서 나와서 정말인지 또 다른 에러에 직면했다는 것을 알 수 있었습니다. 그래서 이걸 해결하지 않으면 안된다는 생각이 듭니다.



그래서 이번에는 -211만이 아니라 -200을 elif로 주어서, 이 경우에는 과부하가 걸린 것이니 약 1초 정도 쉬고나서 다시 TR을 요청하면 괜찮아 질 것으로 생각을 했습니다.



그런데 다음 pytrader를 실행시키자, 이번엔느 opt10001이 왔음에도 불구하고, 제대로 작업이 다음으로 진행이 되지 않고 소위 가만히 있는 것을 볼 수 있었습니다.



이건 왜 이런가 했더니, 일단 위 스크린샷처럼 같은 TR이 연속해서 서버로 부터 와서 중복되는 데이터를 처리하는 바람에 데이터가 꼬이는 것을 확인할 수 있었는데, 이번에는 이게 잘못되어서 생긴 에러라는 생각이 들었습니다.




이렇게 다시 시작하는 메서드에서 플래그를 초기화 시켜 주었어야 하는데, 그게 없으니, 다시 시작하도고 이전에 플래그는 On이 되어 있으니, 계속해서 작업이 되지 않았던 것 입니다.



다음으로 이 타이머가 문제가 된 것이 아닌가 싶어서 한번 타이머를 주석처리 하고서 다시 작업을 진행시키는 것을 선택하였습니다.



그런데 이번에는 위 스크린샷과 같은 것처럼, RLTrader가 호출이 되면 되는 것 같은데, 여기서 프로그램이 멈추어 서서 아무것도 하지 않는 것을 볼 수 있었습니다.



그래서 이번에는 -200에러가 났다고 해서, 계속 요청만을 해서는 안되겠다는 생각이 들어서, 아예 return하기 위한 값을 False로 바꾸어서 다시 처음부터 RLTrader를 불러오는 과정을 거치도록 만들었습니다.



그런데 이번에는 위 스크린샷과 같이 분명히 RLTrader를 불러오기 위한 과정에서 가장 마지막으로 요청이 되는 TR code에서, 왜인지 처음으로 호출이 되는 TR 코드가 이어서 호출이 되는 현상을 볼 수 있었습니다. 그래서 이건 또 무슨 에러인지 모르겠다는 생각이 들었습니다.

+ Recent posts

티스토리 툴바