오늘은 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

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

보통 Autohotkey 는 CTRL, ALT, SHIFT 와 같은 Trigger 키와 숫자, 문자 등과 같은 키의 조합을 사용하여 단축키를 만들곤 합니다.

그냥 문자 키 두개를 사용하여 만들고 싶은 경우에는 & 로 연결해서 사용하곤 하지만 일반적인 경우에는 그 이상의 키들을 조합해서 사용할 수는 없습니다. 

2개 이상의 문자를 사용하여 단축키를 만들고 싶은 경우에는 #if 를 사용하면 해결 할 수 있습니다.

아래 주소의 메뉴얼의 예를 보면 #if  와 GetKeyState() 함수를 사용하여 AppsKey 가 눌려 있는 경우 F1, F2... F6 키의 조합을 이용하여, 즉 AppsKey 와 Function 키 두개의 조합으로 키를 만들어 사용 할 수 있죠.



#if GetKeyState("AppsKey", "P")
F1 & F2::MsgBox F1 & F2 Hotkey activated.
F2 & F3::MsgBox F2 & F3 Hotkey activated.
F3 & F4::MsgBox F3 & F4 Hotkey activated.
F4 & F5::MsgBox F4 & F5 Hotkey activated.
F5 & F6::MsgBox F5 & F6 Hotkey activated.

#if

위 코드를 실행 시킨 후에  오른 손으로 AppsKey를 누르고 왼손으로 F1 과 F2 를 동시에 누르면 아래와 같이 message box 가 나옵니다. 


제 키보드의 경우  AppsKey 옆에 Right Window 키가 있습니다. 그래서~ Right Window 와  AppsKey 그리고 Function 키들의 조합을 사용하여 아래와 같이 4개 키 조합으로 단축키를 만들 수 도 있겠죠~

#if GetKeyState("RWin", "P") and GetKeyState("AppsKey", "P")
F1 & F2::MsgBox F1 & F2 Hotkey activated.
F2 & F3::MsgBox F2 & F3 Hotkey activated.
F3 & F4::MsgBox F3 & F4 Hotkey activated.
F4 & F5::MsgBox F4 & F5 Hotkey activated.
F5 & F6::MsgBox F5 & F6 Hotkey activated.

#if

#if 구문에 and 를 계속 붙이면~ 더 많은 키 조합도 만들 수가 있을 겁니다.



  1. 편리본좌 2017.03.11 18:24

    감사합니다 덕분에 세개의 조합키로도 사용할수 있다는걸 알았습니다 그런데

    마지막에 #if 를 붙여줘야 하나요? return 같이 닫는 역할인가요?

    • 남성 2017.03.11 18:31 신고

      #if GetKeyState("AppsKey", "P") 에 의한 영향이 끝나는 부분입니다.
      즉 #if 를 안 써 주면 #if GetKeyState("AppsKey", "P") 에 의한 영향이 계속 된다는 거죠.

  2. 편리본좌 2017.03.11 20:06

    관리자의 승인을 기다리고 있는 댓글입니다

이 글을 보고 계신 분이라면 아마도 Autohotkey 에 대해 어느정도는 알고 계신 분이겠죠~

 

저는 이제 Windows 에서는 Autohotkey 가 없으면 컴퓨터를 사용하는 게 불가능 할 정도가 되어 버렸는데요~

 

2012/02/22 - [programming language/Autohotkey] - Autohotkey를 사용해 보아요~


Windows 에서는 Launchy 와 함께 완전 필수 프로그램이 되어 버렸습니다.


2013/09/01 - [유틸] - 편리한 런치 프로그램 Launchy


2014/04/20 - [유틸] - 생산성 향상 어플 Launchy plugin 추가 방법


2014/06/12 - [programming language/Perl] - Launchy Weby Merge Perl Code

Autohotkey 를 사용해서 윈도우에서 할 수 있는 것은 거의 무한대라 할 수 있을 것 같은데요~ 아래 포스팅에서는 환경변수 설정 페이지 들어가기를 Autohotkey 로 만들어 봤습니다.


2012/03/17 - [programming language/Autohotkey] - Autohotkey 로 제어판 다루기

오늘은 프로그램에 따라 같은 단축키로 다른 기능을 실행하는 기능에 대해 설명드리겠습니다.

 

Autohotkey 에는 # 이 붙은 키워드 들이 있습니다. #If, #IfWinActive, #IfWinExist, #IfWinNotActive, #IfWinNotExist 와 같은 키워드 들이 있는데~

 

#IF 로 시작하는 키워드 들은 context-sensitive 한 단축키와 hotstring 을 만들어 줍니다. context-sensitive 란 윈도우 타이틀이나 텍스트에 따라 단축키의 기능을 달리 할 수 있다는 겁니다.

 

이렇게 설명 하면 잘… 못 알아 듣겠죠~

 

예를 들어보면~ Win + F 라는 키를 눌러서 메모장에서는 abc 라는 글자를 쓰고~ 윈도우 계산기에서는 Message Box 를 실행하는 단축키를 만들어 보고 싶다면~ 다음과 같이 하면 됩니다.

 

#IfWinActive, ahk_class Notepad ; 메모장이 활성화 되어 있을 때

#f::

Send, abc

return

 

#IfWinActive, ahk_class CalcFrame ; 계산기가 활성화 되어 있을 때

#f::

MsgBox 계산기가 활성화 돼 있습니다.

return

 

#IfWinActive

#f::

MsgBox 계산기와 메모장 이외의 프로그램이 활성화 돼 있습니다.

return

 

예제를 보니 좀 아시겠나요? 위 코드를 실행 한 후에~ 메모장을 하나 열고~ Win + F 단축키를 눌러 보면 아래 그림과 같이 abc 라는 글자가 입력되게 됩니다.

 

 

또한 계산기를 연 후에 win + f 를 눌러보면 아래 그림과 같이 계산기가 활성화 돼 있습니다. 라는 message box 가 나오게 됩니다.

 

마지막으로 계산기와 메모장 이외의 프로그램이 활성화 된 상태에서 Win + F 를 눌러보면 아래 그림과 같이 계산기와 메모장 이외의 프로그램이 활성화 돼 있습니다. 라는 Message Box 가 나오게 됩니다.

 

위 코드 예에서 주의 하실 건 맨 마지막에 #IfWinActive 후에 아무것도 안 써주면 이후의 코드들은 모든 프로그램에서 동작한다는 겁니다. 즉 위 예제 코드에서는 계산기와 메모장 이외의 프로그램이 활성화 된 경우 맨 마지막 코드 부분이 실행 된다는 것이죠~



+ Recent posts