이 베스트 VIP 서버 - i beseuteu VIP seobeo

안녕하세요.

해가 바뀐지 벌써 2주가 지났는데 뒤늦게 인사 드립니다.

초밥도 사먹고, 소고기도 사먹기 위해 열심히 일하다보니 시간이 어찌나 빨리 지나가던지 말입니다.

시스템을 운용하면서 증권사에서 API 관련하여 중대한 변경 또는 업데이트가 있으면 SMS 알림을 해주는데요.

그렇지 않은 경우는 잘 모르고 지나가는 경우가 많습니다.

작년 eBest 투자대회 이후로 처음으로 증권사 홈페이지에 접속 해보는 것 같은데 변경 사항이 있어 뒤늦게 나마 전해 드립니다. (이미 알고 계신분은 패스.)

1. 그동안 CME 거래소와 계약하여 위탁 운영해오던 CME 야간 선물의 운영 중단에 대해서는 전해드린적이 있는데요.

이 부분에서 협의의 문제로 잠시 중단된 것인줄 알았더니 이 소식으로 향후 CME 야간 선물 운영 계획이 없다고 파악하고 소식 전해드립니다.

-야간 CME시장 코스피200선물 및 미국달러선물의 글로벌거래 중단 으로 인한 TR제공 종료

  TR 삭제
  - CCEAT00100 선물옵션 CME 정상주문
  - CCEAT00200 선물옵션 CME 정정주문
  - CCEAT00300 선물옵션 CME 취소주문

2. 최근 주식투자 인구가 증가세를 보이는 부분과 시스템 트레이더가 되기 위해 API를 이용하는 사람이 많이 늘었는지 XingAPI 신규가입을 일시 중단한다는 소식입니다.

이는 급증하는 투자인구 증가와 함께 폭주하는 주문건에 대해 처리하기 위해 증권사 서버에 많은 부담을 주고 있기 때문이며 비단 eBest만의 문제는 아니고 타 증권사에서도 여러 크고 작은 주문 관련 사고나 시세 지연 등의 문제가 빈번하게 포착되고 있기에 거래를 하는 분들은 주의 하셔야 할 것 같습니다.

3. 앞서 전해드린 2번의 항목과 연계되는 부분인데요.

주식 정정 및 취소 주문 TR의 처리 건수를 대폭 감소시킨다는 뉴스입니다.

  - CSPAT00700(현물 정정주문), CSPAT00800(현물 취소주문) TR 제한을 강화 합니다.

  - CSPAT00700 TR제한은 기존 1초당 99건에서 1초당 3건으로 변경 됩니다. 

  - CSPAT00800 TR제한은 기존 1초당 99건에서 1초당 3건으로 변경 됩니다. 

수십 수백건의 주문을 동시 다발적으로 전송할 경우 증권사 서버에도 부담이 되지만 시세 조작 의심을 받을 여지도 있으니 주의 하셔야 할 것 같습니다.

(확인결과 VIP 서버에서는 해당 내용이 적용되고 있지 않습니다. 일반 서버에서는 따로 확인 해보지 못했습니다.)

오늘은 이렇게 3건의 뉴스를 전해 드렸고 다음에는 알찬 내용으로 소식 전하겠습니다.

호가창에서 뵙겠습니다.

지난 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 파일을 열어보면 위와 같이 세부적인 내용을 보여줍니다.

이 베스트 VIP 서버 - i beseuteu VIP seobeo

▲ 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 남겨 주세요.