아래 포스팅에 이어서 오늘은 Autohotkey 로 이베스트증권 xingAPI 를 사용하여 주식 현재가를 가져 오는 방법에 대해서 소개하려 합니다. 아래 포스팅에 이은 소개이므로 해당 내용을 어느 정도 숙지하고 오셔야 이해가 될 것입니다.

http://iamaman.tistory.com/2224

아래 xingAPI 메뉴얼에 나와 있는 바와 같이 로그인이나 계좌 정보와 관련된 내용들은 XASession 을 사용하지만 조회를 하기 위해서는 XAQuery 를 사용해야 합니다. 또한 실시간 정보를 얻기 위해서는 XAReal 을 사용합니다.

http://www.ebestsec.co.kr/apiguide/guide.jsp?cno=100

또한 xingAPI 에는 TR 이라는 개념이 있는데~ xingAPI 를 사용할 때의 입출력 데이터 규격이라고 보시면 될 것 같습니다. TR 에 정의되어 있는 대로 입력을 넣어주면 증권사 서버에서 출력을 받을 수 있다는 것입니다. TR 은 파일로 되어 있는데 xingAPI 를 설치하면 DevCenter 라는 프로그램이 설치 되고 DevCenter 에서 아래와 같이 버튼을 누르면 한번에 다운로드 받을 수 있고 C:\eBEST\xingAPI\Res 폴더에 res 라는 확장자로 설치 됩니다. 각 TR 에 대한 입출력 정보는 DevCenter 에서 확인하실 수 있습니다.

주식 현재가 조회를 하기 위해서는 t1101 또는 t1102 TR 을 사용할 수 있습니다. 본 포스팅에서는 어떤 질문자 분이 계셔서 t1101 TR 을 사용해 보겠습니다. 해당 TR 의 res 파일 위치는 C:\eBEST\xingAPI\Res\t1101.res 이고~ 주식 현재가를 가져오기 위한 Autohotkey 코드는 아래와 같습니다.

아래 코드를 실행하기 전에 당연히 이전 포스팅에서 사용을 했던 로그인은 먼저 해야 되겠죠~

;~ ------------------------ 주식 현재가 가져오기 Start ----------------------------------------

instXAQueryT1102 := ComObjCreate("XA_DataSet.XAQuery")

ComObjConnect(instXAQueryT1102, "query_") ; event binding to query_ReceiveData

login_query := 0

instXAQueryT1102.ResFileName := "C:\\eBEST\\xingAPI\\Res\\t1101.res"

instXAQueryT1102.SetFieldData("t1101InBlock", "shcode", 0, "078020") ; 이베스트 투자 증권 코드

instXAQueryT1102.Request(0)

while login_query = 0 ; hold for ReceiveData event

{

}

name := instXAQueryT1102.GetFieldData("t1101OutBlock", "hname", 0)

price := instXAQueryT1102.GetFieldData("t1101OutBlock", "price", 0)

MsgBox %name% 종목의 현재 가격은 %price% 입니다.

;~ --------------------- 주식 현재가 가져오기 End ----------------------------------------

query_ReceiveData(code, msg)

{

global login_query:= 1

}

위 코드에서 입력으로 준 078020 은 이베스트 투자 증권의 코드 번호입니다. 정상적으로 동작을 하면 아래와 같이 이베스트투자증권의 현재 가격이 9770 원이라고 나오는 것을 확인할 수 있습니다.

위 코드의 동작중 중요한 부분에 대한 설명은 다음과 같습니다.

0. XAQuery 에 대해 ComObjCreate 를 하고 응답 함수를 ComObjConnect() 를 통해 binding 합니다.

1. SetFieldData 를 통해 t1101 TR 에 대한 입력값을 설정하고~

2. 서버에 Request 를 하고

3. whle 문을 통해 서버 응답을 기다립니다.

4. ReceiveData 함수를 통해 응답이 왔음을 확인하면 while 문을 빠져나가게 되고~

5. GetFieldData 를 통해 서버로부터 온 값 중 필요한 부분을 읽습니다.

혹시나 로그인을 안 한 상태로 위코드를 실행하고 안 돌아간다고 댓글 다실 분들을 위해 전체 코드를 첨부합니다. 아래 코드에서 증권사의 아이디,  패스워드,  공인인증서 비번은 본인의 것을 넣어야 된다는 설명은 굳이 안 해도 되겠죠?

위 코드의 동작만 확실히 이해하게 된다면 다른 대부분의 조회 TR도 이해할 수 있을 거라고 생각합니다.

Autohotkey 를 사용하여 이런것도 할 수 있다는 소개를 위해 작성해 봤는데~ 정말 Autohotkey 의 기능은 쓰면 쓸수록 무궁무진한 것 같습니다. 즐거운 Autohotkey 코딩 하시기 바랍니다.



  1. 이베스트 2018.10.09 14:31

    역시 남성 방장님의 친절한 답변에 감사합니다.열심히 연구 노력해보겠습니다.^^

  2. 키움 2019.04.07 21:31

    여기 글을 보고 키움증권 api를 통해 만들어 보려고 하는데 막히는 부분이 있어서 여쭙니다

    k1:=ComObjCreate("KHOPENAPI.KHOpenAPICtrl.1")
    k1.CommConnect() -> 여기서 오류가 납니다


    파이썬 코드를 보면
    self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
    self.kiwoom.dynamicCall("CommConnect()")


    혹시 해결방안에 대해 아시면 답해주시면 감사하겠습니다. ㅠㅠ

    • 남성 2019.04.07 22:33 신고

      글쎄요 제가 키움증권 API 를 사용하고 있지는 않아서.... Connect 부분에서 에러나는 거면 키움증권 API 관련 사이트에 질문 하면 쉽게 해결 될 수 있지 않을까 합니다.

  3. 2019.07.29 12:57

    비밀댓글입니다

    • 남성 2019.07.29 14:08 신고

      github 에 올려 놓은거라 복사됩니다. 위 코드의 아래 부분에 있는 view raw 라고 써 있는 부분을 클릭하면 새창에서 코드가 열리니 복사 하셔도 되고 그냥 파일로 받고 싶으면 그 옆에 파일명을 클릭하면 github 사이트로 넘어가서 다운로드 받을 수 있습니다. 방문해 주셔서 감사합니다. ^^

요즘 시스템 트레이딩을 공부해 보고 있는데, 제가 돌리는 프로그램이 왠지 모르게 멈춰 있더군요, 처음에는 이유를 모르다보니 멀티 프로세스로 코딩 해야 하나…. 라는 생각까지 했었는데, 의외로 문제는 간단하더군요.

이베스트증권의 xingAPI 를 사용하는 경우 DevCenter 에서 TR 마다 다음과 같이 속성값이 있는데 ‘초당 전송수’가 적혀 있습니다.

TR 마다 시간 당 호출할 수 있는 횟수에 제한이 있어서 프로그램이 멈춘 것이더군요. 이런 경우엔 간단하게 time sleep 을 주면 해결이 됩니다. 물론 그만큼 주문 속도는 드리겠지만, 어쩔 수가 없는 거죠.

제가 알고 있기로는 증권사에 수수료 수익을 많이 벌어주는 해비 유저들의 경우 이런 제약이 없는 것도 같은데, 저는 그저 한낱 개미라서 증권사 API 의 제약 속에서 만들어 볼 수 밖에 없을 것 같습니다. 혹시 증권사 API를 사용하면서 초당 전송수에 대한 고려 없이 코딩 해서 문제가 발생 하시는 분들은 참조하시기 바랍니다.



저는 이베스트증권의 xingAPI 를 사용하여 종목을 검색하고 간단한 형태의 매매 프로그램을 만들어서 사용하고 있습니다. xingAPI에서는 KOSPI, KOSDAQ 에 따라 체결 정보를 가져오는 TR 이 구분 되어 있습니다. 예를 들어 삼성전자는 코스피이므로 스팸으로 S3_ TR 을 사용해야하며 셀트리온헬스케어는 코스닥이므로 K3_ TR 을 사용해야 합니다.

종목명을 넣었을 때 해당종목의 시장이 어딘지를 구분해주는 TR 이 무엇인지 모르겠더군요. 그래서 이베스트 홈페이지에서 고객센터에 문의를 해 봤습니다. xingAPI 사용 중에 모르는 부분들은 아래 고객센터에 문의해 보시기 바랍니다. 하루가 안 돼서 답변이 달리더군요.

문의결과 다음과 같은 답변을 받았습니다. t8430, t8436, t9945 TR 중 하나를 사용하면 되더군요.

종목마스터를 가져오는 TR이 있습니다. 해당 TR을 이용하시어 종목리스트를 가져와서 구분하셔야 할 것으로 판단됩니다.

t8430, t8436, t9945 중 하나를 사용하시면 됩니다.

t8430, t8436, t9945 TR 들은 시장의 모든 종목들을 가져오는 것이므로 처음 한 번만 데이터베이스에 저장해 놓고 사용하는게 좋을 것 같습니다.

일단은 DevCenter 에서 t8430, t8436, t9945 TR 을 확인해 보니 아래와 같이 제가 원하는 정보가 있었습니다. gubun 이라는 출력이 1 이면 코스피, 2 면 코스닥이더군요.

코딩을 하기 전에 ‘TR 확인 창’ 에서 t8430 TR 을 사용해 봤습니다. 입력에 전체를 의미하는 0 을 넣고 조회를 하니 아래와 같이 전 종목에 대한 정보가 나옵니다.

TR 을 알았으니 이제 천천히 코딩만 하면 되겠네요.



+ Recent posts