System Trading 1주차.
한 주정도 공부했을 때 처음 Login에 성공했다.
사실 여기까기 과정은 그닥 어렵지 않았는데, 딱 하나의 오류문으로 너무 먼 길을 돌아오게 되어 그 과정과 해결법을 적어두려한다.
Process finished with exit code -1073740791 (0xC0000409)
해당 오류문이 처음 발생하고 거의 3일간 어떻게 해결해야할지 구글링하면서 시간을 보냈다.
의외로 가장 단순한 방법으로 직접 해결하게되었는데, 그 내용은 후술한다.
1. Anaconda 32x 재설치
가장 단순한 방법은 Anaconda를 32bit로 재설치하는것이다.
유튜브 강의를 따라하다보면 Anaconda를 64bit로 설치하게 되는데, 호환성 문제인경우 이런 방법으로 해결이 된다고 한다.
물론 나는 재설치 / 64bit+32bit 둘 다 설치해도 해결되지 않았다...
2. PyQt5 재설치
PyQt5를 재설치한다.
설치할 때 PyQt의 버전을 5.12.XX로 고정하여 설치하는 방법도 있었고,
그냥 신버전의 PyQt를 받는 방법도 있었으며,
마지막으로는 책을 참고해서 가상환경에 PyQt를 별도로 설치해주기도 했다.
이런경우는 PyQt 설치과정이 모종의 이유로 누락됐을경우 된다는건데, 나는 이런 케이스도 아니었다.
3. 오타수정
놀랍게도... 내 문제는 오타였다.
[Kiwoon.Py]
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
from config.errorCode import *
...중략
def login_slot(self, errCode):
print(error(errCode)) ########
self.login_event_loop.exit()
def get_account_info(self):
self.account_list = self.dynamicCall("GetLoginInfo(STring)","ACCNO") ######
self.account_num = self.account_list.split(';')[0]
print("계좌 번호 : %s" % self.account_num)
코드가 돌아가는 부분까지를 check하다보니 저 부분에서 문제가 있어서 자세히 살펴봤다.
우선 아래의 get_account_info 함수에서 dynamicCall의 입력으로 문자열에 String이 STring으로 되어있다.
대문자 하나 차이지만, 아무래도 KOA를 통해 명령어를 String형태로 직접 전달해주는 형태다보니 저정도의 오타도 분명히 영향이 있을것이다. (그리고 실제로 수정했을 때 오류가 '일부' 해결되었다!)
또 중요했던 부분은 login_slot의 Print문 부분이었다.
얼핏보기엔 이상없어보이는 Code지만...
아래와 같이, import된 errorCode의 함수는 errors, error가 아니다!
보통 Code에 오타가 있으면 해당 명령어를 지적해주는게 일반적이지만
KOA를 끼고 하는 호출방식이라 그런건지 상기 두가지 오류 모두 Process finished with exit code -1073740791 (0xC0000409) 로 나타났다.
수정하고난 뒤에는 잘 돌아간 것을 확인했으니 앞으로는 동일한 오류가 발생하면 오타부터 확인하면서 진행할 예정이다.
[errorCode.py]
def errors(err_code): ##함수 이름에 주의
err_dic={0: ('OP_ERR_NONE','정상처리'),
-10: ('OPP_ERR_FAIL','실패'),
-100: ('OPP_ERR_LOGIN','사용자정보교환실패'),
-101: ('OPP_ERR_CONNECT','서버접속실패'),
-102: ('OPP_ERR_VERSION','버전처리실패'),
-103: ('OPP_ERR_FIREWALL','개인방화벽실패'),
-104: ('OPP_ERR_MEMORY','메모리보호실패'),
-105: ('OPP_ERR_INPUT','함수입력값오류'),
-106: ('OPP_ERR_SOCKET_CLOSED','통신연결종료'),
-200: ('OPP_ERR_SISE_OVERFLOW','시세조회과부하'),
-201: ('OPP_ERR_RQ_STRUCT_FAIL','전문작성초기화실패'),
-202: ('OPP_ERR_RQ_STRING_FAIL','전문작성입력값오류'),
-203: ('OPP_ERR_NO_DATA','데이터없음'),
-204: ('OPP_ERR_OVER_MAX_DATA','조회가능한종목수초과'),
-205: ('OPP_ERR_DATA_RCV_FAIL','데이터수신실패'),
-206: ('OPP_ERR_OVER_MAX_FID','조회가능한FID수초과'),
-207: ('OPP_ERR_REAL_CANCEL','실시간해제오류'),
-300: ('OPP_ERR_ORD_WRONG_INPUT','입력값오류'),
-301: ('OPP_ERR_ORD_WRONG_ACCTNO','계좌비밀번호없음'),
-302: ('OPP_ERR_OTHER_ACC_USE','타인계좌사용오류'),
-303: ('OPP_ERR_MIS_2BILL_EXC','주문가격이20억원을초과'),
-304: ('OPP_ERR_MIS_5BILL_EXC','주문가격이50억원을초과'),
-305: ('OPP_ERR_MIS_1PER_EXC','주문수량이총발행주수의1%초과오류'),
-306: ('OPP_ERR_MIS_3PER_EXC','주문수량은총발행주수의3%초과오류'),
-307: ('OPP_ERR_SEND_FAIL','주문전송실패'),
-308: ('OPP_ERR_ORD_OVERFLOW','주문전송과부하'),
-309: ('OPP_ERR_MIS_300CNT_EXC','주문수량300계약초과'),
-310: ('OPP_ERR_MIS_500CNT_EXC','주문수량500계약초과'),
-340: ('OPP_ERR_ORD_WRONG_ACCTINFO','계좌정보없음'),
-500: ('OPP_ERR_SYMCODE_EMPTY','종목코드없음'),
}
result = err_dic[err_code]
return(result)
다음에는 예수금, 거래정보등을 직접 호출하는 방식에 대해 공부를 시작할 예정이다.
'글 > 코딩' 카테고리의 다른 글
(교육정리) Pandas와 Data 통계 - 1 (0) | 2023.07.25 |
---|---|
백준 알고리즘 문제 풀이 1764 : 듣보잡 (0) | 2023.07.05 |
[python][자동매매] 강의가 끝나고, 머릿속 정리 3. 계좌정보 불러오기 + Tr Data 불러오기 (0) | 2023.06.01 |
[python][자동매매] 강의가 끝나고, 머릿속 정리 2. Login (0) | 2023.05.31 |
[python][자동매매] 강의가 끝나고, 머릿속 정리 1. init (1) | 2023.05.31 |