증권사 API2017. 12. 4. 01:00

 

 

지난 5편에서 조회TR을 이용하는 것에 대해 알아보았고 금번 6편에서는 실시간TR을 다루는것에 대해 알아보겠습니다.

 

 

 

 

4편에서는 위 이미지중 1~4번의 과정까지 알아봤고 5편에서는 5~10번의 과정을 조회TR을 이용하여 알아봤습니다.

 

6편인 본편에서는 위 이미지중 5~10번의 과정을 실시간TR을 이용하여 알아보겠습니다.

 

 

 

조회TR을 이용하는 것은 증권사 서버에 저장되어 있는 데이터를 조회 하는 것이며 이러한 데이터들은 대체로 용량이 크지 않고 데이터의 수량이 많지 않기 때문에 일정기간 동안의 데이터는 증권사 서버에 저장되어 있습니다.

 

 

실시간TR을 이용하여 접근하는 데이터들은 대체로 용량이 크고 수량이 많기 때문에 증권사 서버에 저장되지 않는 경우가 대부분입니다.

 

 

두 TR의 특성중 또 다른점은 조회TR은 원하는 데이터를 형식에 맞게 조회 요청하면 원하는 데이터가 1회 전송됨으로써 모든 처리가 끝나지만 실시간TR은 데이터 전송 요청을 하면 요청 시점 이후에 주가가 바뀌었거나 거래량이 바뀌는등 데이터가 변경되면 변경된 데이터를 증권사 서버가 알아서 전송해주게 되며 사용자가 별도로 "데이터 전송 요청의 해제"를 하기 전까지는 증권사 서버가 계속 데이터를 보내줍니다.

 

 

조회TR은 과거의 특정 데이터를 수신받는데 유리한 구조이고 실시간TR은 언제 어떻게 바뀔지 모르는 데이터를 사용자가 매번 증권사 서버에게 "데이터 바뀌었니? 바뀌었으면 보내줘!"라고 요청하지 않아도 증권사 서버가 알아서 처리 해주므로 실시간 데이터 처리에 유리한 구조일 수 밖에 없습니다.

 

 

다만 실시간TR은 "요청 시점 이후"에 데이터가 변경되면 전송해 주기 때문에 요청 시점의 데이터는 전송해주지 않고 변경된 데이터가 없으면 전송해주는 데이터도 없습니다.

 

 

한 예로 필자가 개발해서 배포중인 뉴스 검색기 우측 현재가 조회 화면을 구성함에 있어 조회TR을 이용하면 TR조회제한(증권사 서버는 서버 부하를 낮추기 위해 조회TR의 단위 시간당 이용 가능 빈도를 회원 등급별로 차등 적용하고 있음)이 적용되기 때문에 실시간TR을 이용하여 실시간 시세를 받아서 처리하고 뉴스 본문은 실시간TR이 없고 조회TR을 이용해서 정보를 취할 수 있는 구조이기 때문에 각 사용자별 등급이 다름을 고려하여 1초당 1회에 한해 본문을 조회 하도록 설정하고 있습니다.

(사용자 등급이 높다면 VIP서버에 접속하여 무제한 또는 무제한에 가까운 TR조회제한을 적용받을 수 있음)

 

 

본격적으로 오늘 다룰 내용으로 넘어가겠습니다.

 

 

로그인은 XASession 객체를, 조회TR은 XAQuery 객체를 사용했었는데 실시간TR은 XAReal 객체를 사용하며 사용 방법은 XAQuery 객체의 사용 방법과 유사하기에 어렵지 않습니다.

 

 

S3_ 라는 실시간TR을 이용하여 예제를 보여드릴텐데 이 실시간TR을 이용하면 코스피 체결 데이터를 수신 받을 수 있습니다.

 

 

S3_의 구조를 한번 살펴보겠습니다.

 

 

 

▲ 메모장 등의 에디터로 S3_.res 파일을 열어보면 위와 같이 세부적인 내용을 보여줍니다.

 

 

 

▲ DevCenter를 통해 S3_를 보면 위와 같이 좀 더 보기 쉽게 표현되어 있습니다.

 

 

사용자인 독자분들이 하셔야 할 것은 XAReal 객체를 만들고 S3_.res 가 어디에 있는지 찾아주고 InBlock.shcode에 값을 입력하여 증권사 서버로 전달한 후 서버에서 데이터를 보내주면 받는게 전부입니다.

 

 

참 쉽지요?

 

 

코드부로 넘어 가보겠습니다.

 

 

 

  Dim WithEvents XAReal_S3_As XAReal Set XAReal_S3_

  = CreateObject("XA_DataSet.XAReal")

 

 

▲ S3_는 코스피 체결 데이터를 수신 받을 수 있는 실시간TR의 명칭입니다.

 

▲ XAReal 선언 및 생성하는 코드입니다.

 

▲ 두 줄이 아니라 한줄로 구성되어 있으며 블로그 화면 너비가 좁은 관계로 '=' 부분에서 개행처리 하였습니다.

 

 

 

 

  XAReal_S3_.ResFileName = "S3_.res")

 

 

▲ S3_.res 등록하는 코드입니다.

 

 

 

 

  XAReal_S3_.SetFieldData("InBlock","shcode", "005930") 

 

 

▲ S3_ 형식에 맞게 입력하는 코드이며 005930은 삼성전자의 종목코드로써 예를 위해 임의로 입력한 값입니다.

 

 

 

 

  XAReal_S3_.AdviseRealData()

 

 

▲ 조회TR에서는 Request 함수를 이용하여 서버에 전달하였는데 실시간TR은 AdviseRealData 함수를 이용합니다.

 

▲ 만약 여러 종목의 데이터를 동시에 받고 싶다면 하나의 종목의 값을 입력하고 서버에 전송한 뒤 동일 과정을 반복하면 됩니다.

  

 

 

 

  Sub XAReal_S3_ReceiveRealData(ByVal szTrCode)

      XAReal_S3_.GetFieldData("OutBlock","price")

  End Sub

 

 

▲ 서버로부터 새로운 데이터를 수신 받는 부분입니다.조회TR에서는 Request 함수를 이용하여 서버에 전달하였는데 실시간TR은 AdviseRealData 함수를 이용합니다.

 

▲ 만약 여러 종목의 데이터를 동시에 받고 싶다면 하나의 종목의 값을 입력하고 서버에 전송한 뒤 동일 과정을 반복하면 됩니다.

 

 

 

 

  XAReal_S3_.UnadviseRealData()

 

 

▲ 더 이상 실시간 데이터를 받고 싶지 않을때 서버에 등록한 "실시간 데이터 전송 요청"을 해제하기 위한 코드입니다.

 

 

 

 

  XAReal_S3_.UnadviseRealDataWithKey("005930")

 

 

▲ 더 이상 실시간 데이터를 받고 싶지 않은 종목을 특정할 경우에는 UnadviseRealDataWithKey 함수를 이용합니다.

 

 

 

 

  Dim WithEvents XAReal_S3_As XAReal Set XAReal_S3_
  = CreateObject("XA_DataSet.XAReal")

 

  XAReal_S3_.ResFileName = "S3_.res")

 

  XAReal_S3_.SetFieldData("InBlock","shcode", "005930")

 

  XAReal_S3_.AdviseRealData()

 

  Sub XAReal_S3_ReceiveRealData(ByVal szTrCode)

      XAReal_S3_.GetFieldData("OutBlock","price")

  End Sub

 

 

▲ 전체 코드를 정리 해보면 위와 같습니다.

 

 

이로써 독자분들은 이베스트 투자증권 서버에 로그인하고 과거 데이터를 조회하거나 새로 발생할 데이터를 조회하는 방법까지 VBA 예제 코드와 함께 모두 알아 보았습니다.

 

 

얼마나 빠르고 정확한 처리를 할 것인가는 사용자별로 필요로 하는 정도에 따라 다를 것이고 그에 맞게 VBA를 사용하거나 C계열 혹은 JAVA, Python 등의 여러 프로그래밍 언어를 선택하면 됩니다.

 

 

겨우 몇편으로 알아본게 전부이고 코드가 몇줄 되지 않지만 VBA만 이용하더라도 증권사 서버에 로그인하여 계좌 정보를 조회하고 현재가 정보 등을 수신하여 주문을 넣고 실시간 데이터를 기반으로 차트를 그리거나 연산을 하는 등 자동매매 프로그램을 구현 해볼 수 있습니다.

 

 

처음부터 고급의 프로그래밍 언어를 선택하여 이해하기도 어렵고 진도는 안나가는 상황을 맞이하지 말고 우선은 개념을 조금 더 잡고 다양한 시도들을 손쉽고 빠르게 해볼 수 있도록 VBA로 시작하고 한계가 느껴지고 더욱 빠른 처리가 필요할 때에만 상위의 프로그래밍 언어로 넘어가는편이 좋습니다.

(필자도 동일한 과정을 거쳤습니다.)

 

 

이해가 안되는 부분은 Comment 남겨 주세요.

 

 

 

Posted by 투자의神