반응형

안녕하세요?

오늘은 로그인(Login) 기능을 구현해볼겁니다..!

 

먼저 기본 준비물입니다 ^^

1. 디렉토리를 하나만드시고 그안에 kiwoom.py라는 파일을 생성해줍니다.

저는 autokiwoom으로 폴더를 하나 만들고 그 안에 kiwoom.py를 생성하였습니다.

2. main.py 라는 파일을 상위폴더에 생성해줍니다.

kiwoom.py - Kiwoom class 생성

먼저 kiwoom.py에 간단하게 Kiwoom class를 생성해보겠습니다.

main.py - Main class 생성

Main 클래스도 간단하게 생성해줍니다.

 

그럼 실행을 한번해볼까요?

 

main.py -> kiwoom.py 순으로 실행되게 하려합니다.

main.py 우 클릭하셔서 Run 'main'을 해줍니다.

 

그럼 아래와 같이 출력됩니다.

Main 클래스에있는 문자열 Kiwoom 클래스에 있는 문자열이 차례로 출력되는 것을 보실 수 있습니다.

 

또한 Process finished with exit code 0을 출력하면 프로그램이 종료되는 것을 보일 수 있습니다.

하지만, 자동매매 프로그램은 장이 열리는동안 계속 켜져있어야겠죠?

 

그래서 Main 클래스에 아래와 같이 코드를 추가 및 수정해줍니다.

 

 

 

실행을 한번해볼까요?

종료되지 않는것이 보이시나요? 

 

 

 

자! KOA StudioSA를 켜볼까요?

[개발가이드]->[키움 OpenAPI]->기본동작부분을 참고해보겠습니다.

 

키움 OpenAPI 기본동작

OpenAPI 데이터 요청과 데이터 수신 이벤트는 비동기방식으로 작동합니다. 서버에 시세조회나 주문 등 함수호출로 요청하면 서버에서 처리 결과를 그에 맞는 이벤트를 발생시켜 전달합니다. 

예를들면 조회요청을 하면 아래와 같이 작동합니다.

 

요청(조회함수 CommRqData 사용자가 호출) --> 이벤트 발생(OnReceiveTRData) --> 데이터 획득(GetCommData 사용자가 호출)

(이벤트는 일반함수와 구별하기위해 "On"의 prefix가 붙습니다.)

 

PyQt5

그럼 위에서 설명한 이벤트루프를 어떻게 사용할 것인가가 문제입니다. 우리는 코린이거든요....

적게는 몇줄에서 많게는 몇천줄까지 코드를 짜야하는 것을 PyQt5를 이용하면 단 한줄로 해결할 수 있습니다.

PyQt5에 대한 자세한 정보는 구글이나 검색사이트에 검색하면 아주 많으니 참고하시기 바랍니다.

 

OpenAPI 컨트롤

*OLE (Object Linking and Embedding)

키움증권의 OpenAPI는 OCX (OLE custom controls) 방식을 채택하고 있습니다. 쉽게말해 응용프로그램에서 키움 OpenAPI를 실행할 수 있게 합니다. 즉, 제어가 가능하고 제거할 수 있는 함수가 PyQt5에서 제공됩니다.

ActiveX control이라고 불리는데 엑티브엑스... 많이 들어보셨을겁니다. 예전에 IE에서 많이 설치하라고 뜨던거였죠.

OCX가 설치가되면 windows registry, 레지스트리에 등록이됩니다. 이때 CLSID(클래스 식별자)라고 하는 고유한 ID를 가지고 있습니다. OpenAPI 개발자 가이드에 보면 그 내용이 나와있습니다.

CLSID를 가지고 registry에서 검색을 해봅니다.

CLSID : A1574A0D-6BFA-4BD7-9020-DED88711818D

 

먼저 레지스트리 편집기에서 [편집]->[찾기]-> 위 ID를 입력하고 검색해주세요

여기서 KHOPENAPI.KHOpenAPICtrl.1은 GUID (전역 고유 식별자), ProgID 입니다.

 

GLSID 또는 ProgID를 기억하고 계세요!

 

다시 정리하면

CLSID : A1574A0D-6BFA-4BD7-9020-DED88711818D

ProgID : KHOPENAPI.KHOpenAPICtrl.1

 

QAxWidget을 통해 컨트롤

Qt에서 class를 컨트롤하기 좋은것은 QAxWidget class입니다.

Q (Qt) + Ax (ActiveX) + Widget

파이썬에서 키움증권 OpenAPI를 사용하려면 pyQt의 QAxWidget class를 사용해 인스턴스를 생성해야합니다.

QAxWidget class를 이용해 ProgID나 CLSID를 전달하면 됩니다.

또는 setControl 메서드를 사용합니다.

def __init__(self):
     self.get_kiwoom_ocx = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")

or

def __init__(self):
     self.get_kiwoom_ocx = QAxWidget("A1574A0D-6BFA-4BD7-9020-DED88711818D")

or

self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

 

키움증권 OpenAPI 모듈 사용

그럼 이제 키움증권 OpenAPI를 한번 가져와볼까요?

다시 kiwoom.py에 Kiwoom class로 가봅시다.

아래와 같이 수정해주세요.

 

오늘은 너무 많은것은 공부한것 같네요...

다음시간에 이어서 포스팅 해보도록 하겠습니다.

 

고생하셨습니다.

 

 

 

반응형
복사했습니다!