본문 바로가기
증권사 API

이베스트증권 차트TR 만들어보기(VBA 활용 - 주식차트편)

by 다빈치스탁 2020. 8. 28.
728x90
반응형

자, 이제 거의 다 되어 간다. 업종별 차트시세를 불러왔으니 이제는 분석을 하고 싶은 주식차트만 불러오면 왠만한 시계열 분석은 큰 무리없이 진행할 수 있을 것 같다. 

 

이전 포스트의 파일을 다운 받았다면 미안하지만 지우고 새롭게 받는게 나을 수 있다. 그러나 파일 다운로드 없이 본인이 직접 만들고 있는 상태라면 아래의 코드를 참고해서 새롭게 만들어보면 된다. 

 

우선 기존에는 tr8413으로 진행하려고 했는데 찾아보니 더 좋은게 있어서 tr4201로 변경했다. 뭐 그거나 이거나 별반 차이는 없지만 만들다보니 그렇게 되어서 그냥 이걸 샘플로해서 tr8413도 쉽게 구현하리라 보고 넘어간다.

 

우선 엑셀파일에 과감하게 새로운 쉬트를 추가한다. 쉬트 추가 후 이름을 주식차트로 이쁘게 바꿔준다.(아무이름이나 별 상관은 없다.) 그리고 이제는 익숙해지고 있는 VBA 편집기를 열어준다. 새로 생성한 쉬트의 코드에 아래의 코드를 복사 + 붙여넣기로 진행한다. 

 

코드에는 별도의 주석을 달지 않았지만 이제는 인풋값(Inblock)과 아웃풋값(outblock)을 구별할 수 있으리라고 본다. 다만 한 가지 주의할 점은 우리가 HTS에서 보는 차트는 수정주가가 이미 반영이 되어 있는 경우가 많다. 물론 이것도 옵션상에서 끄고 켜고 할 수 있지만 대부분은 기본값으로 수정주가를 보여주고 있다. 그러나 API상에서는 수정주가를 반영하여 내려주지 않고 그냥 준다.

 

그래서 수정비율이란 것을 조회해서 적절한 값으로 임의조정해야 할 필요가 있다. 만약 이러한 조정없이 그냥 과거의 데이터를 조회한다고 가정할 때 삼성전자의 주가가 어느날 갑자기 98% 폭락하는 신세계를 경험하게 될 것이다. (액면분할 20180504)

 

참고 : 수정주가란? 배당락, 유증, 무증, 액면분할 등에 의해서 주식의 가격이 시장외적인 요인에 의해서 변동할 때 이를 반영하여 적정주가로 나타낸 것

주식현재가및호가.xlsm
0.24MB

 

728x90
Dim WithEvents XAQuery_t4201 As XAQuery
Dim WithEvents XASession_sheet8 As XASession
Dim nStartRow_t4201 As Integer
Dim i, j As Integer
'-------------------------------------------------------------------------------------------------------
' 차트
Public Sub cbRequest_t4201_Click()
    Sheet8.Range("a5:g503").ClearContents
    Sheet8.Range("g1") = Left(Date, 4) & Mid(Date, 6, 2) & Right(Date, 2)
 
    ' 객체를 생성한다.
    If XAQuery_t4201 Is Nothing Then
        Set XAQuery_t4201 = CreateObject("XA_DataSet.XAQuery")
        XAQuery_t4201.ResFileName = "C:\eBEST\xingAPI\Res\t4201.res"
    End If
    If XASession_sheet8 Is Nothing Then
        Set XASession_sheet8 = CreateObject("XA_Session.XASession")
    End If
   
    ' 데이터 세팅
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "shcode", 0, Sheet8.Range("c1").Text)
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "gubun", 0, Left(Sheet8.Range("e1").Text, 1))
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "edate", 0, Sheet8.Range("g1").Text)
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "sdate", 0, Sheet8.Range("k1").Text)
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "cts_date", 0, Sheet8.Range("m1").Text)
    Call XAQuery_t4201.SetFieldData("t4201InBlock", "qrycnt", 0, Sheet8.Range("i1").Text)
 
    ' 데이터 요청
    If XAQuery_t4201.Request(False) = False Then
        MsgBox "전송오류"
    End If

End Sub


Public Sub XAQuery_t4201_ReceiveData(ByVal szTrCode As String)

    Sheet8.Range("m1") = XAQuery_t4201.GetFieldData("t4201OutBlock", "cts_date", 0)
    
    nStartRow = 4
    nStartRow2 = 40
    ncount = XAQuery_t4201.GetBlockCount("t4201OutBlock1")
    
    j = 0
    
    For j = j To j
        For i = 1 To ncount - 1
            Sheet8.Cells(nStartRow + i, 1) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "rate", i)
            If Val(Sheet8.Cells(nStartRow + i, 1)) <> 0 Then rateflag = 1
            
            If rateflag > 0 Then
                For k = 1 To i
                    Sheet8.Cells(nStartRow + k, 4 + j) = Round(Val(Sheet8.Cells(nStartRow + k, 4 + j)) * ((100 + Val(Sheet8.Cells(nStartRow + i, 1))) / 100), 0)
                    Sheet8.Cells(nStartRow + k, 5 + j) = Round(Val(Sheet8.Cells(nStartRow + k, 5 + j)) * ((100 + Val(Sheet8.Cells(nStartRow + i, 1))) / 100), 0)
                    Sheet8.Cells(nStartRow + k, 6 + j) = Round(Val(Sheet8.Cells(nStartRow + k, 6 + j)) * ((100 + Val(Sheet8.Cells(nStartRow + i, 1))) / 100), 0)
                    Sheet8.Cells(nStartRow + k, 7 + j) = Round(Val(Sheet8.Cells(nStartRow + k, 7 + j)) * ((100 + Val(Sheet8.Cells(nStartRow + i, 1))) / 100), 0)
                Next k
                Sheet8.Cells(nStartRow + i, 3 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "date", i)
                Sheet8.Cells(nStartRow + i, 4 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "low", i)
                Sheet8.Cells(nStartRow + i, 5 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "open", i)
                Sheet8.Cells(nStartRow + i, 6 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "close", i)
                Sheet8.Cells(nStartRow + i, 7 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "high", i)
                nStartRow_t4201 = nStartRow + i
            Else
                Sheet8.Cells(nStartRow + i, 3 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "date", i)
                Sheet8.Cells(nStartRow + i, 4 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "low", i)
                Sheet8.Cells(nStartRow + i, 5 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "open", i)
                Sheet8.Cells(nStartRow + i, 6 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "close", i)
                Sheet8.Cells(nStartRow + i, 7 + j) = XAQuery_t4201.GetFieldData("t4201OutBlock1", "high", i)
                nStartRow_t4201 = nStartRow + i
            End If
            rateflag = 0
        Next i
    
    Next j
 
    
End Sub




 

 

728x90
반응형

댓글