안녕하세요?


월요일은 모의투자에 들어가서 인공지능 주식 투자자를 시험해 보지 않았습니다만, 화요일 하루종일 주식 시장이 열린 상황에서는 모의투자에 들어가서 한번 작업을 시작해 보기는 보았습니다. 그리고 이번 포스팅에서는 역시나 시작된 에러와의 싸움이 있었으며, 그 경과를 포스팅으로 올리고자 합니다.



먼저 지난주 금요일 모의투자에 들어갔을 때, 이미 호출이 된 TR은 따로 있고, 이전에 들어온 TR이 또 들어오는 것을 보았습니다. 이 때문에 코드가 꼬여서 제대로 일이 진행이 되지 않았는 것을 볼 수 있었습니다. 그래서 이번에는 이 사태를 막고자 플래그 3개를 일단 클래스 변수로 kiwoom.py에서 만들었습니다.



다음으로 _receive_tr_data()라는 메서드에서 위 스크린샷처럼 한번 호출이 되면, 이후에는 더 이상은 False가 되어서 더는 TR의 코드에 해당하는 코드를 다시는 호출할 수 없도록 만들어 주었습니다.



그리고 나서 TR을 서버에 요청하는 comm_rq_data메소드가 호출되면, 그대로 다음에 나오는 kiwoom.py에 있는 클래스 변수인 플래그를 True로 바꾸어 주는 식으로 만들어 주었습니다.



그런데 while의 존재를 까먹었기 때문에, 이게 끝나고 나서 계속해서 값이 오도록 바꾸어 주었습니다.




그리고 나서 다른 TR을 키움증권 서버에 요청하고 나서, 이후에 각각에 해당하는 플래그를 모두 True로 만드어서 다시는 한 사이클이 끝나기 전 까지는 호출이 되지 않도록 만들어 줍니다.



그리고 나서 한번의 사이클이 끝나는 주식을 거래하는 메소드가 지나고 나면, 이제는 True로 묶였는 플래그들을 모두 다시 False로 풀어 주도록 만들어 줍니다.



다음으로는 pytrader를 실행시키고 나서 한번 실행시켜 보는 연습을 하도록 합니다. 참고로 이 시도는 화요일 주식시장이 열려 있는 도중에 시도가 되었습니다.



그런데 실시간 모의 주식투자에 들어간 다음에 위 스크린샷처럼 pytrader의 작동이 에러가 생겨서 중단이 되는 사태가 벌어지는 것을 볼 수 있었습니다.




그래서 이번에는 각각의 TR code가 서버에서 오면 호출이 되는 메서드의 마지막에서 각각의 플래그를 True로 만들어서 한 사이클이라는 RLTrader를 불러오는 과정이 끝나기 전 까지 다시한번 이 TR이 호출되는 것을 방지 하도록 합니다.



그리고 별 차이가 있을지 없을지 모르겠지만, 이렇게 not bool형식 변수 를 하는 것은 어떻게 에러를 유발할 확율이 상당히 있다는 느낌이 들어서, 한번 위 스크린샷처럼 직관적으로 바꾸어 줘 봅니다.



그런데 이번엔느 위 스크린샷처럼 예상치 못한 곳에서 에러가 나왔는지 프로그램이 강제 종료가 되는 에러가 발생하는 것을 볼 수 있었습니다.



일단 디버그 모드를 열어서 위 스크린샷처럼 elif까지는 가는 것을 확인을 할 수는 있었습니다. 그리고 F9을 눌러서 계속 진행을 시켜 보았습니다.




일단 그리고 아래에 가서 이제 중복호출을 방지하기 위한 플래그까지 가는 것을 확인할 수 있었습니다. 하지만 여기서 F9을 누르면 바로 에러가 뜨면서 프로그램이 강제로 종료가 되는 것을 볼 수 있었습니다.



다음으로는 위 스크린샷처럼 __init__()메서드에 플래그에 해당을 하는 초기화를 해주는 메서드에 self.를 붙여서 선언을 해줘야 하는 것 이었습니다. 이렇게 해주어야 클래스 변수를 문제없이 사용이 가능한 것 이었습니다.



그렇게 하고서 이제 RLTrader를 가동시키기 위한 메서드까지 오는 것을 볼 수 있었습니다. 이렇게 함으로서 이제는 큰 문제를 하나 해결하였다는 생각이 들었습니다.



그런데 위 스크린샷처럼 가끔씩 프로그램이 종료되어 버리는 이상현상도 일어났으며...



이렇게 제가 해결할 수 있는 pandas 자체에 무슨 문제가 있어서 벌어지는 일도 있는 것을 볼 수 있었습니다. 아무튼 이런 일을 제외하고는 이제 문제없이 주식 인공지능을 돌릴 수 있으리라 생각을 했습니다만, 그렇지도 않은게, 이어서 올라오는 포스팅에서는 또 다른 문제가 발생하면서 이래저래 애를 먹게 만들었습니다.

+ Recent posts