Quantcast
Channel: 의지있는 황제펭귄님의 이글루입니다
Viewing all articles
Browse latest Browse all 204

[Xing API]xingAPI활용교육샘플v1.3.xlsm(4)-시세 워크시트

$
0
0
교육샘플 파일에는 3개의 워크시트가 있는데, 그중에서 [시세]워크시트의 구성과 관련코드를 알아 보도록 한다. [시세]워크시트는 다음 그림과 같이 1개의 종목코드를 입력하고 엔터를 누르면 그날의 가격관련 정보(시고저종 등등)를 보여주고, 호가창, 10분간격 시고저종 그리고 그날의 일봉차트로 구성되어 있다.

이번에는 코드를 살펴보도록 하자. [시세]워크시트는 vba에서 코드명이 Sheet1이다. 따라서 Sheet1을 더블클릭하면 관련된 코드를 볼 수 있다.

코드 상단에는 Sheet1 전역에서 사용하는 Xing API관련 개체변수가 선언되어 있다.
Dim WithEvents XAQuery_t1101 As XAQuery         ' [조회TR] 주식현재가 호가조회
Dim WithEvents XAQuery_t1302 As XAQuery ' [조회TR] 주식 분별 주가 조회
Dim WithEvents XAReal_S3_ As XAReal ' [실시간TR] 코스피체결
Dim WithEvents XAReal_K3_ As XAReal ' [실시간TR] 코스닥체결
Dim WithEvents XAReal_H1_ As XAReal ' [실시간TR] 코스피호가
Dim WithEvents XAReal_HA_ As XAReal ' [실시간TR] 코스닥호가
변수는 두 종류인데, XAQuery는 조회용 데이터를 위한 것이다. 즉 결과를 요청하면 그에 대한 회신을 1번 하고 끝난다. 그리고 XAReal는 실시간 조회용 개체인데, 장운영동안 지속적으로 데이터를 보내준다. 그리고 Dim 다음에 WithEvents라는 키워드를 볼 수 있다.

WithEvents키워드는 선언한 개체변수의 이벤트를 받기 위한 것이라는 정도만 알아 두면 된다. 조회를 하면 콜백함수를 통해 결과를 얻게 된다. 이를 이벤트라고 하며, _ReceiveData, _ReceiveRealData로 끝나는 프로시저가 이벤트에 따라 호출되는 콜백함수이다.
다음은 [시세]워크시트에서 종목코드를 입력하고 엔터를 입력하면 작동하는 이벤트 프로시저(Worksheet_Change())이다.
'------------------------------
' 셀의 값이 변경되면 호출
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'--------------------------
' 종목코드를 변경하였을 경우에 현재가/분별주가를 요청
' 종목코드를 입력한 셀인지 체크
If Target.Address = "$C$2" Then
Call DisplayPrice
End If
'--------------------------
End Sub
Worksheet_Change()는 워크시트의 내용이 변경될 때 실행되는 이벤트 프로시저이다. 해당워크시트가 변경되었다면 구체적으로 어느 셀이 변경되었는 지 알아야 한다. 매개변수 Target은 변경된 셀 또는 셀영역을 가리키는 Range개체변수이다.

그래서 아래와 같이 변경된 셀인 Target의 주소가 종목코드를 받는 [C2]셀인지를 확인(종목코드를 입력하였는지)한다.
If Target.Address = "$C$2" Then

그리고 True이면 DisplayPrice프로시저를 호출한다(Call DisplayPrice)

DisplayPrice()프로시저에서는 Xing API의 XAQuery와 XAReal개체를 이용하여 주가데이터를 요청한다, 코드는 개체를 달리하면서 비슷한 패턴의 작업을 하는 것이다.

해당개체변수가 Nothing인지 확인하고 Nothing이라면 개체를 새로 만들어 할당하고 리소스파일을 연결한다. 그러나 실시간 데이터를 받는 XAReal개체변수의 경우 Nothing이 아니라면 UnadviseRealData메서드를 호출하여 실시간 구독을 해제한다. 그리고 조회용 개체변수인 XAQuery에 조회할 종목코드 등 필요한 정보를 설정하고 Request 메서드를 호출하여 데이터를 요청한다.

아래의 코드에서는 실시간 조회개체 XAReal개체변수를 생성만 하고 아무런 작업을 하지 않는다. XAQuery와 같이 필요한 정보를 설정하고 Request를 해야 하는 데 말이다. 이 작업은 XAQuery의 콜백함수에서 하게 된다. 즉 일단 조회하고 콜백함수로 결과를 받으면 그 콜백함수에서 다시 실시간 조회를 하는 식이다.
'----------------------------
' 현재가/분별주가를 요청
'----------------------------
Private Sub DisplayPrice()
'----------------------------
' 객체 생성 및 Res 할당

' 주식 현재가/호가 조회
If XAQuery_t1101 Is Nothing Then
Set XAQuery_t1101 = CreateObject("XA_DataSet.XAQuery")
XAQuery_t1101.ResFileName = "\res\t1101.res"
End If

' 주식 분별 주가 조회
If XAQuery_t1302 Is Nothing Then
Set XAQuery_t1302 = CreateObject("XA_DataSet.XAQuery")
XAQuery_t1302.ResFileName = "\res\t1302.res"
End If

' 실시간 코스피 체결
If XAReal_S3_ Is Nothing Then
Set XAReal_S3_ = CreateObject("XA_DataSet.XAReal")
XAReal_S3_.ResFileName = "\res\S3_.res"
Else
XAReal_S3_.UnadviseRealData ' 이미 생성이 되어 있다면 이전에 요청했다는 의미이므로 실시간을 취소한다.
End If

' 실시간 코스닥 체결
If XAReal_K3_ Is Nothing Then
Set XAReal_K3_ = CreateObject("XA_DataSet.XAReal")
XAReal_K3_.ResFileName = "\res\K3_.res"
Else
XAReal_K3_.UnadviseRealData ' 이미 생성이 되어 있다면 이전에 요청했다는 의미이므로 실시간을 취소한다.
End If

' 실시간 코스피 호가
If XAReal_H1_ Is Nothing Then
Set XAReal_H1_ = CreateObject("XA_DataSet.XAReal")
XAReal_H1_.ResFileName = "\res\H1_.res"
Else
XAReal_H1_.UnadviseRealData ' 이미 생성이 되어 있다면 이전에 요청했다는 의미이므로 실시간을 취소한다.
End If

' 실시간 코스닥 호가
If XAReal_HA_ Is Nothing Then
Set XAReal_HA_ = CreateObject("XA_DataSet.XAReal")
XAReal_HA_.ResFileName = "\res\HA_.res"
Else
XAReal_HA_.UnadviseRealData ' 이미 생성이 되어 있다면 이전에 요청했다는 의미이므로 실시간을 취소한다.
End If
'----------------------------
'----------------------------
' t1101 요청
Call XAQuery_t1101.SetFieldData("t1101InBlock", "shcode", 0, Range("C2").Value)
nSuccess = XAQuery_t1101.Request(False)
If nSuccess < 0 Then
MsgBox "전송에러 : " & nSuccess
End If
'----------------------------
'----------------------------
' t1302 요청
Call XAQuery_t1302.SetFieldData("t1302InBlock", "shcode", 0, Range("C2").Value)
Call XAQuery_t1302.SetFieldData("t1302InBlock", "gubun", 0, "4") ' 10분 데이터 요청
Call XAQuery_t1302.SetFieldData("t1302InBlock", "time", 0, "")
Call XAQuery_t1302.SetFieldData("t1302InBlock", "cnt", 0, "21") ' 21개까지만 표시
nSuccess = XAQuery_t1302.Request(False)
If nSuccess < 0 Then
MsgBox "전송에러 : " & nSuccess
End If
'----------------------------
End Sub

Viewing all articles
Browse latest Browse all 204

Latest Images

Trending Articles