키움 api에 접속이 잘 되던것이 갑자기 "타인계좌는 사용할 수 없습니다"라고 알림창이 뜰 때가 있다.

이번 시간에는 뜬금없이 나를 타인계좌를 이용하려는 범죄자로 만드는 이 메시지의 해결방법을 알아보자.

윈도우 화면 오른쪽 아래에 있는 api 아이콘을 선택 후 마우스 오른쪽 클릭해서 계좌비밀번호 저장을 클릭하면 계좌비밀번호를 입력할 수 있는 팝업창이 뜬다.

그런데 다음과 같이 자신의 계좌번호에 아무것도 표시가 되지 않을 때가 있다. 이럴 경우 "타인계좌는 사용할 수 없습니다."라고 뜨는 것이다. 

기존에 비밀번호까지 다 등록해서 정상적으로 접속하던 것인데 이렇게 갑자기 계좌번호가 사라진다.

이를 해결하기 위해서는 버전처리라는 것을 해야 한다.

 

이럴 때 API를 테스트할 수 있는 KOA StudioSA를 실행한 후 Open API 접속을 한다. 

로그인을 하면

버전처리를 받으라고 메시지가 나온다. 이 때 확인 버튼을 바로 누르지 말고 반드시 KOA StudioSA를 먼저 종료 후 버전처리 메시지의 확인 버튼을 눌러야 한다!!!

그리고 다시 윈도우 화면 오른쪽 아래에 있는 api 아이콘을 선택 후 마우스 오른쪽 클릭해서 계좌비밀번호 저장을 클릭한다.

그러면 자신의 계좌가 다시 나오는 것을 볼 수 있다.

이 때 비밀번호를 등록하고 다시 api 접속을 하면 정상적으로 접속되는 것을 볼 수 있다.

 

그런데 이렇게 버전처리를 받았는데도 안 될 경우가 있다.

그럼 최후의 방법으로 open api를 삭제하고 다시 설치해보기 바란다.

 

아나콘다에서 32비트로 가상환경을 만들었는데 32비트로 잘 만들어졌는지 어떻게 알 수 있을까?

 

우선 아나콘다 프롬프트로 들어간다. 

 

프롬프트 창에서 activate py35_32bit 입력하여 32비트 가상환경으로 전환한다.

 

32비트 가상환경 프롬프트 바로가기가 있으면 그걸로 들어가도 된다.

 

프롬프트 창에서 python을 입력 후 파이썬 명령어를 입력할 수 있는 상태가 되면

 

다음과 같이 입력한다.

import platform
print(platform.architecture())

프린트 한 내용을 보면 32비트인지 64비트인지 확인할 수 있다.

 

키움 OpenApi+ 개발가이드에 보면 7.에러코드표가 있다. 

 

이 에러코드표를 파이썬에서 사용하려고 할 때 어떤 자료형이 좋을까? 튜플에 넣어서 사용하는 것이 좋을 것이다.

튜플 자료형에 대한 내용은 다음에 정리하도록 하겠다.

 

다음과 같이 err_code를 파라미터로 던지면 해당하는 튜플 값을 리턴하는 함수를 만들자.

def return_err_tuple(err_code):

    err_dic = {0:('OP_ERR_NONE', '정상처리'),
               -10:('OP_ERR_FAIL', '실패'),
               -100:('OP_ERR_LOGIN', '사용자정보교환실패'),
               -101:('OP_ERR_CONNECT', '서버접속실패'),
               -102:('OP_ERR_VERSION', '버전처리실패'),
               -103:('OP_ERR_FIREWALL', '개인방화벽실패'),
               -104:('OP_ERR_MEMORY', '메모리보호실패'),
               -105:('OP_ERR_INPUT', '함수입력값오류'),
               -106:('OP_ERR_SOCKET_CLOSED', '통신연결종료'),
               -200:('OP_ERR_SISE_OVERFLOW', '시세조회과부하'),
               -201:('OP_ERR_RQ_STRUCT_FAIL', '전문작성초기화실패'),
               -202:('OP_ERR_RQ_STRING_FAIL', '전문작성입력값오류'),
               -203:('OP_ERR_NO_DATA', '데이터없음'),
               -204:('OP_ERR_OVER_MAX_DATA', '조회가능한종목수초과'),
               -205:('OP_ERR_DATA_RCV_FAIL', '데이터수신실패'),
               -206:('OP_ERR_OVER_MAX_FID', '조회가능한FID수초과'),
               -207:('OP_ERR_REAL_CANCEL', '실시간해제오류'),
               -300:('OP_ERR_ORD_WRONG_INPUT', '입력값오류'),
               -301:('OP_ERR_ORD_WRONG_ACCTNO', '계좌비밀번호없음'),
               -302:('OP_ERR_OTHER_ACC_USE', '타인계좌사용오류'),
               -303:('OP_ERR_MIS_2BILL_EXC', '주문가격이20억원을초과'),
               -304:('OP_ERR_MIS_5BILL_EXC', '주문가격이50억원을초과'),
               -305:('OP_ERR_MIS_1PER_EXC', '주문수량이총발행주수의1 % 초과오류'),
               -306:('OP_ERR_MIS_3PER_EXC', '주문수량은총발행주수의3 % 초과오류'),
               -307:('OP_ERR_SEND_FAIL', '주문전송실패'),
               -308:('OP_ERR_ORD_OVERFLOW', '주문전송과부하'),
               -309:('OP_ERR_MIS_300CNT_EXC', '주문수량300계약초과'),
               -310:('OP_ERR_MIS_500CNT_EXC', '주문수량500계약초과'),
               -340:('OP_ERR_ORD_WRONG_ACCTINFO', '계좌정보없음'),
               -500:('OP_ERR_ORD_SYMCODE_EMPTY', '종목코드없음')
               }

    tuple = err_dic[err_code]

    return tuple

호출하는 쪽에서는 다음과 같이 사용할 수 있을 것이다.

    def comm_connect(self):
        self.dynamicCall("CommConnect()")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()
        
    def _connect_slot(self, err_code):
        print(return_err_tuple(err_code)[1]) #정상처리
        self.login_event_loop.exit()        

키움 서버 접속 이벤트가 발생하면 _connect_slot 함수를 호출할 것이고 정상접속되면 err_code에 0 코드를 받아와서 0에 해당하는 튜플 값을 리턴할 것이다. 여기서는 1값을 호출했으므로 '정상처리'라고 log창에 표시될 것이다.

PyCharm에서 PyQt5.QAxContainer 모듈을 포함하여 개발하기 위해 PyQt5를 install 했다.

그러나 다음과 같이 설치가 됐다고 하나 에러가 발생한다.

 

 

 

ERROR: spyder 3.3.6 has requirement pyqt5<5.13: python_version >= "3", but you'll have pyqt5 5.14.1 which is incompatible.

확인해보니 Python 버전이 3 이상이라면 spyder 가 PyQt5 5.13보다 하위 버전에서 작동한다는 뜻이다.

spyder가 필요한 것이 아니니 PyQt5는 설치가 됐다고 하여 PyCharm에서 다시 import를 해봤으나 계속 참조할 수 없다고 표시된다.

 

1. PyQt5를 uninstall 후 다시 install 해보았지만 동일했다.

2. 아나콘다를 업데이트 했는데도 동일했다.

 

에러 메시지대로 PyQt5 모듈을 다운그레이드 해보았다.

pip uninstall PyQt5

pip install PyQt5==5.13

 

버전을 다운그레이드 하니 정상 작동 된다.

 

정확한 원인은 알 수 없으나 호환성 문제인 것으로 보인다.

 

 

다음과 같이 파이썬으로 키움증권 Open API 에 로그인하려고 하는데 아무 동작을 하지 않는다.

 

self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")

self.kiwoom.dynamicCall("CommConnect()")

 

원인을 찾아보니 키움증권 API가 32비트 파이썬만 지원하기 때문이다. 대부분의 증권사는 OCX, COM, DLL 방식의 라이브러리를 제공한다. 그래서 증권사 API를 파이썬에서 사용하려면 32비트 파이썬을 사용해야 한다.

참고로 키움증권은 OCX, 대신증권이나 이베스트 투자증권은 COM 방식을 제공한다.

 

그런데 PC에 이미 64비트 아나콘다를 설치했을 경우 어떻게 해야 할까?

 

다음과 같이 32비트 환경을 추가로 설치할 수 있다. 이것이 파이썬 가상환경이다.

 

Anaconda Prompt를 실행하여 다음과 같이 입력한다.

set CONDA_FORCE_32BIT=1

conda create -n py_32bit python=3.7 anaconda

 

 

위와 같은 명령어를 실행하면

Anaconda\envs\py_32bit 폴더에 32비트환경이 만들어진다.

설치가 완료되면 친절하게 32비트, 64비트 전환하는 방법도 설명해준다.

 

 

원하는 환경으로 변경 후 원하는 패키지를 install해서 사용하면 된다.

 

 Pycharm을 실행해서 32비트 python으로 interpreter되게 설정해보자.

File - New Project를 클릭한다.

 

Create Project 창이 뜨면 Existing interpreter에서 … 버튼을 클릭한다.

 

 

Conda Environment에서 32비트 python으로 실행되게 선택한다.

 

 

이제 파이썬으로 키움증권 API와 연동이 될 것이다.

 

+ Recent posts