오늘은 Autohotkey를 통해 증권사 API를 사용하는 방법에 대해 소개하려합니다. 일단 증권사 API를 사용하기 위해서는 증권사 API 의 설치나 TR과 같은 기본적인 개념에 대해 알아야 되겠고, 해당 내용들은 아래 주소의 ’파이썬으로 배우는 알고리즘 트레이딩’ 이나 증권사의 API 메뉴얼을 참조하시기 바랍니다.

파이썬으로 배우는 알고리즘 트레이딩: https://wikidocs.net/book/110

이베스트증권 API 메뉴얼: http://www.ebestsec.co.kr/apiguide/guide.jsp?cno=100

시스템 트레이딩을 위한 언어로 많은 분들이 C#, 파이썬, C/C++ 등을 사용하고 있는 것 같습니다. 보통 증권사의 시스템 트레이딩을 위한 API는 DLL 버전과 COM(Component Object Model) 버전을 제공해 주더군요. 저는 개인적으로 COM 버전이 사용하기가 쉬워서 COM 버전을 사용하고 있습니다. 시스템트레이딩을 위한 언어로는 파이썬을 사용하고 있고요.

Autohotkey 를 사용하여 시스템트레이딩을 한다고 하는 분은 지금까지 한번도 보지못했는데, COM 을 사용하다 보니 Autohotkey 를 사용해도 될 것 같다는 생각이 들었고, 시도해 보니 그리 어렵지 않게 이베스트증권 xingAPI 를 사용할 수 있었습니다.

Autohotkey 를 사용하여 시스템 트레이딩을 하기 위해서는 32비트 Autohotkey 를 설치해야 합니다. 저는 아래 주소에서 Autohotkey 를 다운로드 받았고 Windows는 64비트 이지만 유니코드 32비트 버전을 설치 했습니다. 이베스트증권의 xingAPI 가 32비트 버전이라 Autohotkey 도 그에 맞춰서 설치를 했습니다.

https://autohotkey.com/download/

xingAPI 의 기본적인 개념에 대해 안다는 가정하에, Autohotkey를 사용하여 이베스트증권에 로그인을 하고 계좌번호를 불러오는 방법에 대해서 소개해 보려 합니다.

Autohotkey 를 사용하여 이베스트증권에 로그인 하고 계좌번호를 불러오는 코드는 다음과 같습니다.

Autohotkey 에서 COM 객체를 만들기 위해서는 ComObjCreate() 라는 함수를 사용하고 xingAPI 가 event 방식으로 동작하므로 ComObjConnect() 라는 함수를 사용하여 세션 객체를 Login 이라는 이벤트에 연결 시켰습니다. 이렇게 연결을 해 놓은 상태에서 ID, 비밀번호, 공인 인증서 비밀번호를 넣고, COM 객체의 login() 함수를 통해 이베스트증권 서버에 로그인을 시도하면 Login 이라는 event 명으로 응답이 오게 됩니다.

Autohotkey 의 ComObjConnect() 라는 함수의 정의는 아래와 같은데 저는 Prefix 로써 session_ 이라는 글자를 넣어줬고 session_Login 이라는 event 를 받는 함수를 만들어 줬습니다.

https://autohotkey.com/docs/commands/ComObjConnect.htm

ComObjConnect(ComObject, Prefix)

로그인이 정상적으로 된 경우 Login event 의 argument 인 code 값으로 0000 이 전달 되게 되고 코드의 중간에 있는 while 루프는 증권사의 응답을 기다리기 위해 넣어놓은 것 입니다.

로그인이 완료 된 이후에는 xingAPISession 인스턴스의 GetAccountListCount() 함수를 사용하여 계좌의 개수를 알 수 있습니다. 이후 계좌의 갯수만큼 루프를 돌면서 GetAccountList() 함수를 통해 계좌 번호를 알아내게 됩니다. Autohotkey Loop 내의 인덱스의 A_Index 는 1 부터 시작하지만 GetAccountList() 함수는 0 인덱스부터 시작하기 때문에 -1 을 해 준 것입니다.

본인의 이베스트증권 ID, PASSWORD, 공인인증서 비밀번호를 넣고 위 코드를 실행시켜 보면 다음과 같이 로그인이 정상적으로 됐다는 message box 와 보유한 계좌번호에 대한 message box 를 아래와 같이 확인할 수 있습니다.

※ 로그인 성공

※ 보유한 계좌 개수

※ 계좌 번호



  1. 이베스트 2018.10.06 22:40

    이베스트로 tr조회하려는데 도저희안되서그럽니다.혹시 뭐가 잘못되었는지 알수 있을까요?
    제공하신소스다음에 다음과 같이 했는데 안되서 그럽니다.뭐가 잘못된건지..알려주시면 감사하겟습니다.
    XAQuery_t1101 := ComObjCreate("XA_DAtaSet.XAQuery")
    XAQuery_t1101.ResFileName:="C:\eBest\xingAPI\Res\t1101.res"
    XAQuery_t1101.SetFieldData("t1101InBlock","shcode",0,"078020")
    XAQuery_t1101.Request(false)
    XAQuery_t1101_ReceiveData(szTrCode)
    {
    sName:=XAQuery_t1101.GetFieldData("t1101OutBlock","hname",0)
    }
    msgBox,%sName%
    하면 아무런 결과가 나오지를 않습니다.

    • 남성 2018.10.07 18:08 신고

      Request 를 한 이후에는 위 포스팅 내용처럼 while 문 등을 통해서 서버에서 응답이 올때까지 기다리게 해야 할 것입니다. 그리고 XAQuery_t1101_ReceiveData 함수는 ComObjConnect 를 통해 event binding 이 되어야 할 것입니다.

  2. 이베스트 2018.10.07 19:59

    정말 감사합니다.방장님. 죄송한데 코드를 조금만 고쳐주시면 안될까요? 초보라서 그런지 많이 어렵네요.ㅠ ㅠ 말씀하신대로 해봐도 안되네요.

+ Recent posts