아래는 xingAPI를 이용하는 전체 처리 과정입니다.
지난 4편에서 이베스트투자증권(이하 이베스트) HTS 서버에 로그인(위 이미지의 4번에 해당하는 )하는 부분까지 진행을 했었습니다.
바쁜 일정속에 후속편 진행이 더뎌지고 있다고 느껴질 즈음 잠시 시간을 내어 5편을 작성합니다.
무궁무진한 정보가 잔뜩 쌓여 있을것만 같은 이베스트 서버에 로그인 했으니 필요한 정보에 대해서 조회를 요청 해보겠습니다.
우선 독자분들이 조회 해보고 싶은 데이터가 이베스트 서버에 저장되어 있는지 알아야 합니다.
실시간 정보(호가 데이터, 체결 (틱) 데이터)는 그 갯수와 용량이 엄청나게 많기 때문에 증권사 서버에서도 모두 저장하지 못하고 흘러가는 데이터라 과거 데이터는 구할 수 없습니다.
여담이지만 이러한 속성 때문에 필자는 과거의 체결 데이터, 호가 데이터를 모두 수집하여 서버 컴퓨터의 데이터베이스에 차곡차곡 모아두고 있고 이는 언제든 새로운 아이디어가 떠 올랐을때 시뮬레이터를 구성하여 결과값을 볼 수 있습니다.
다시 본론으로 돌아와 이러한 실시간 데이터를 제외하고는 어지간한 데이터들이 많이 저장되어 있습니다.
독자분들이 가장 많이 보는 데이터가 무엇일까요?
필자가 밤낮없이 주식 공부를 하던 시절에는 주식 일봉 차트와 주식 분봉 차트를 가장 많이 봤던것 같은데요.
주식 일 데이터와 분 데이터를 조회 할 수 있는 TR이 DevCenter 목록에 포함되어 있는지 알아야 합니다.
결과적으로 해당 TR은 이베스트에서 기본 제공하고 있긴하지만 독자분들이 조회 해보고자 하는 데이터를 증권사에서 TR의 형태로 제공해주지 않는다면 정보를 조회 할 수 없습니다.
TR이란 Transaction (트랜잭션 혹은 트랜스액션)의 줄임말이고 "서버로부터 데이터를 주고 받는 행위"라고 이베스트 가이드에서 정의하고 있습니다.
다시 말해 데이터를 주고 받는데 한국어로 주고 받을것이냐 영어로 주고 받을 것이냐 중국어로 주고 받을것이냐 최대 몇글자까지 주고 받을것이냐 어떤 정보들을 주고 받을것이냐 이런것들에 대해 정의 되어 있는 것을 기반으로 데이터를 주고 받는 행위라고 보면 됩니다.
주식을 기준으로 보면 종목코드를 입력하여 현재가를 받아오거나 계좌번호와 비밀번호를 입력하여 손익 내역을 포함한 잔고를 받아오는 것도 TR을 통해서 가능합니다.
컴퓨터는 전혀 감각이라는 것이 없기 때문에 만약 독자분들이 종목코드 값만 넘겨주면 이베스트 서버는 아마도 이렇게 생각할 겁니다.
"이걸 왜 준거지?"
"이걸로 뭘 해달라는거야?"
"주문을 하겠다는거야?"
"현재가 조회를 하겠다는거야?"
"뉴스를 조회 하겠다는거야?"
"차트 데이터를 보고 싶다는거야?"
물론 실제로 이베스트 서버가 이렇게 생각하는것은 아니지만 무엇을 위해 넘겨진 값인지 알수 없다는 것이죠.
때문에 각 각의 통신 규약을 만들어두었으니 데이터 조회시 필요로 하는 TR을 이용하여 "규격에 맞게" 통신을 해야 합니다.
위 그림처럼 이베스트 서버에 "이거줘" 라고 말을 하면 전혀 알아 들을 수 없습니다.
삼성전자라는 종목의 2017년 01월 01일부터 2017년 12월 31일까지 데이터를 줘. 그리고 데이터의 시각 기준은 '일(daily)'야. 라고 알려줘야 이해를 하고 해당 데이터를 독자분들의 컴퓨터로 보내줍니다.
주고 받을 데이터의 종류에 따라 그 형식이 다양하며 이러한 형식을 통칭하여 TR Layout (Transaction Layout) 이라고 하며 여러 형식들을 각 각 정의 해둔 파일이 *.RES 파일이며 조금 더 구체적으로 말하면 RES는 TR Layout을 COM 버전에서 인식할 수 있는 형식으로 변경한 구조를 뜻하고 COM 버전은 RES를 입력해줘야 동작이 가능합니다.
형식이 어떻게 정의 되어 있는지 확인하려면 *.RES 파일을 메모장 등으로 열어 봐도 되고 DevCenter 를 통해 확인 할 수도 있습니다.
▲ 메모장 등의 프로그램을 이용해 주식종목조회를 할 수 있는 t8430.res 파일을 열어봤습니다.
▲ t8430InBlock 은 gubun 필드에 0,1,2 중에서 선택적으로 입력할 수 있게 되어 있으며 독자분들이 채워 넣어야 할 부분입니다.
▲ t8430OutBlock 은 종목명, 단축코드, 확장코드, ETF구분, 상한가, 하한가, 전일가, 주문수량단위, 기준가, 구분 등 다양한 값을 가지는데 이것은 이베스트 서버가 이러한 형식을 가지는 데이터를 내려주겠다는 뜻입니다.
▲ 모든 조회 TR은 독자분들이 입력해야 할 InBlock과 이베스트에서 데이터를 내려주는 형식을 뜻하는 OutBlock 으로 구성되어 있습니다.
▲ DevCenter를 통해 t8430을 확인한 모습입니다.
▲ 직접적으로 t8430.res를 열어본 것보다 보기에 쉽게 되어 있는데 과거에는 API를 제공하는 증권사가 많지도 않았고 그나마 제공하는 곳도 거의 대부분이 아주 간단한 메뉴얼과 *.res 파일만 제공했었는데 요즘은 보조 도구(DevCenter 등)를 잘 제공해주기 때문에 개발 환경이 아주 좋아졌습니다.
위에서 예로 든 주식종목조회 (t8430)을 이용해서 데이터를 가져오는 연습을 해볼텐데 우선 여러 데이터를 다 받지 않고 종목명 정보만 받아 보겠고 이를 위해서는 우선 XAQuery 를 선언하고 생성해줘야 합니다.
방법은 XASession 의 그것과 비슷합니다.
Dim With Events XAQuery_t8403 As XAQuery
Set XASession_t8430 = CreateObject("XA_DataSet.XAQuery")
|
어때요 쉽지요?
로그인을 할 때는 XASession 을 이용하고 데이터 조회시에는 XAQuery를 이용한다고 지난편에서 말씀드렸는데 기억하고 계실겁니다.
(혹 잊어버렸어도 괜찮습니다. 여러번 반복 작업 하다보면 자연스레 알게 되는 내용입니다.)
t8430에 대한 XAQuery의 선언과 생성이 완료 되었으면 t8430.res 파일이 어디에 있는지 프로그램에게 알려줘야 합니다.
XAQuery_t8430.ResFileName = "t8430.res"
|
InBlock.gubun 에서 어떤 범위의 데이터를 조회 할 것인지를 이베스트 서버에 알려줘야 합니다.
여기에서는 코스피 + 코스닥 전종목 데이터를 조회 하기 위해 gubun 필드의 값을 0으로 입력 하겠습니다.
XAQuery_t8430.SetFieldData("t8430InBlock","gubun",0,"0")
|
SetFieldData라는 함수를 이용하여 t8430InBlock의 gubun 필드에 0 값을 입력했고 그 다음줄에서는 위에 입력한 값을 이베스트 서버로 전송하라는 의미라고 이해하면 됩니다.
이로써 데이터 조회를 위해 독자분들이 해야 할 일의 1단계가 끝났습니다.
이베스트 서버에서는 독자분이 보낸 정보를 보고 "아! 이 정보가 필요하다고 하는구나. 보내줘야지"라고 인식하여 요청한 데이터에 대해 값을 내려줍니다.
요청한 데이터에 대해 서버가 값을 내려주는데 어디에서 어떻게 받을지 미리 정해둬야 합니다.
XAQuery_t8430_ReceiveData(ByVal szTrCode As String)
|
이렇게 해두면 서버로부터 t8430에 대한 데이터가 도착하면 프로그램이 이런 이벤트를 알아차리고 데이터를 받을 수 있습니다.
이벤트를 받았으면 서버가 건너준 데이터를 실질적으로 프로그램에 불러오거나 저장해야 되는데 이 때는 XAQuery 객체의 GetFieldData라는 함수를 이용합니다.
(아까 데이터 입력시에는 XAQuery 객체의 SetFieldData 함수를 이용했었죠?)
sName = XAQuery_t8430_GetFieldData("t8430","t8430OutBlock","hname",0)
|
t8430 TR을 통해 받은 이벤트를 알아차리고 t8430OutBlock의 hname 필드에서 첫번째(0) 값을 sName에 저장하는 코드입니다.
우리가 흔히 숫자를 셀 때 1부터 세지만 컴퓨터는 0부터이므로 0 값을 입력한 것이고 만약 10번째의 데이터를 알고 싶으면 10이 아니라 0부터 시작했으므로 9를 입력해야 합니다.
컴퓨터 상에서 데이터들의 순서에 대한 색인을 index (인덱스)라고 합니다.
이로써 데이터 조회를 위해 독자분들이 해야 할 일의 2단계이자 마지막 단계가 끝났습니다.
지금까지 "5번 XAQuery 객체 선언 및 생성"부터 "10번 Output 값 얻기"까지의 과정에 대해 t8430 TR을 이용하여 데이터를 조회하고 확인하는 과정까지 진행 해봤는데 뭔가 많이 한것 같지만 실제 프로그램 코드를 정리 해보면 아래와 같이 아주 간단합니다.
Dim WithEvents XAQuery_t8430 As XAQuery
Set XASession_t8430 = CreateObject("XA_DataSet.XAQuery")
XAQuery_t8430.ResFileName = "t8430.res"
XAQuery_t8430.SetFieldData("t8430InBlock","gubun",0,"0")
XAQuery_t8430.Request(False)
XAQuery_t8430_ReceiveData(ByVal szTrCode As String)
sName = XAQuery_t8430_GetFieldData("t8430","t8430OutBlock","hname", 0)
|
각 코드마다 설명도 드렸으므로 생각보다 어렵지 않을것입니다.
금번에는 조회TR을 이용하는 예제로 설명 드렸는데 다음번에는 실시간TR을 이용하여 장중에 살아 움직이듯 쏟아지는 실시간 데이터를 조회 해보는 것으로 진행할 예정임을 알려 드리며 마칩니다.