2012년 3월 8일 목요일

Elliott Pattern Helper와 HTS의 DDE 연동 기능 구현 3


※ 이 글은 EPH(Elliott Pattern Helper) beta 버전에만 적용되며, v1.0에는 기본으로 포함된 기능입니다.
※ EPH와 상관없이 엑셀에서 HTS의 DDE를 연계하는 것과 관련된 내용은 'Excel에서 HTS DDE 활용하기' 시리즈를 참고하십시요.  



지난 블로그에 이어 DDE를 통한 EPH와 증권사 HTS와의 연동에 관한 세 번째 블로그를 올립니다.

3. EPH chart 활용

이번 블로그에서는 두 가지의 이야기를 하려고 합니다.
  • Elliott Pattern Helper charts (Elliott chart, Fractal Counting)
  • 증권사 HTS의 DDE 연동 간소화를 위한 매크로 작성

가. Elliott Pattern Helper charts

제가 Elliott Pattern Helper(EPH)를 만든 이유는 증권사 HTS가 제공하는 차트로부터 모노파동들을 추출하고 추출된 각각의 모노파동을 분석하는 과정에서 일일이 수작업을 해야하는 불편함이 매우 컸기 때문이었습니다.
모노파동을 분석할 때 이전 모노파동들과의 관계, 이후 모노파동들과의 관계를 수작업으로 계산하여 선택가능한 구조/진행 기호를 책을 참조하여 도출하는 것이 여간 시간 소모적인 일이 아닐 수 없었습니다.
그래서 가능한 모든 계산 과정을 엑셀의 기능을 이용하여 자동화했으며, 이를 Add-In 프로그램으로 만든 것이 Elliott Pattern Helper입니다.

Elliott Pattern Helper가 제공하는 chart는 두 가지입니다. 하나는 Elliott chart로서 모노 파동의 선택가능한 기호들의 목록을 보여줍니다. EPH의 기능 중 하나가 Glenn Neely의 저서 Mastering Elliott Wave에 수록된 모노파동의 구조/진행 기호 분석 방법을 자동화하여 기호를 추출해 내면, 그 결과를 Elliott chart가 보여주는 것입니다. 이를 활용하여 진행 중인 폴리파동이 무엇인지 분석하고, 해당 파동이 어떤 모양으로 완성되어질지 예측해 보는 등 실제 투자 결정에 도움을 줄 수 있습니다.

그림 1. Elliott chart


다른 하나는 Fractal Counting chart입니다. 이는 Bill Williams의 저서 Trading Chaos에 소개된 몇몇 분석 기법들을 구현한 것으로서, Elliott wave fractal과 Elliott oscillator 및 Williams's MFI(Market Facilitation Index) 기능을 제공하여 Wave counting의 보조 수단으로 사용될 수 있습니다. 가령 Bill Williams가 언급한 5 Magic Bullets을 적용하는데에 Fractal Counting chart를 활용할 수 있을 것입니다.

그림 2. Fractal Counting chart

※ Elliott chart와 Fractal Counting chart에서 제공되는 정보를 적절히 활용하기 원하신다면 위에서 언급한 저서들을 꼭 읽어보시기를 권합니다.


 
나. 증권사 HTS의 DDE 연동 간소화를 위한 매크로 작성

아래에서 기술될 매크로를 작성한 후의 단순화된 과정을 먼저 얘기하겠습니다. 우선 아래 그림과 같이 해당 종목의 종목명으로 분봉 데이터를 저장합니다.

그림 3. 분봉 데이터 저장

엑셀에서 Alt키와 F8키를 같이 눌러 매크로 실행 창을 열고 작성한 매크로를 실행합니다.

그림 4. 매크로 실행


그러면 이전 블로그 'Elliott Pattern Helper와 HTS의 DDE 연동 기능 구현 2'의 과정 '나. DDE 함수 입력', '다. 엑셀 매크로 모듈 작성', '라. DDE update 이벤트 처리'가 모두 완료된 상태의 아래 파일로 바뀝니다. 이를 '매크로 사용 통합문서'로 저장하여 다시 Open하면 업그레이드된 Elliott Pattern Helper의 모든 기능을 바로 사용할 수 있게 됩니다.

그림 5. 완성된 엑셀 파일


그러면 위에서 실행한 매크로를 작성해 보도록 하겠습니다.

위의 그림 4를 보면 PERSONAL.XLSB라는 파일명이 보입니다. 이 파일을 활용하는 것이 아래 과정의 핵심입니다. 분봉 데이터를 저장한 파일은 '남해화학.xlsx'인데 실행할 매크로는 PERSONAL.XLSB의 매크로인 것처럼, 모든 엑셀 파일(workbook)에서 특정 매크로를 사용하고자 할 때 PERSONAL.XLSB 또는 엑셀 2003인 경우 PERSONAL.XLS에 사용하고자 하는 매크로를 저장하면 됩니다.

※ PERSONAL.XLS(B) 파일이 존재하지 않은 경우, 생성하셔야 합니다. 참고 하십시요.

매크로 작성 과정은 다음과 같습니다.
  • 종목코드 저장
  • MQuote 모듈 복사
  • 종목코드 검색 함수 작성
  • 매크로 자동 생성을 위한 매크로 작성

▶ 종목코드 저장

자동으로 채워넣어야 할 DDE 함수는 KHRun|'025860'!'20'과 같이 종목코드를 포함하므로 어디로부터든 종목명으로 종목코드를 검색해와야 합니다. 가장 간편한 방법이 증권사 HTS에서 종목코드 목록을 엑셀로 내려받아 저장해 놓고 사용하는 것이겠죠. 키움증권 영웅문의 경우 아래 화면과 같이 엑셀로 저장하는 기능을 제공합니다.
그림 6. 종목코드 저장

증권사 HTS로부터 종목 코드를 내려받아 다음 그림과 같이 PERSONAL.XLS(B)의 sheet에 저장합니다.

그림 7. 종목코드 저장 sheet



▶ MQuote 모듈 복사

지난 블로그에서 작성한 MQuote 모듈을 PERSONAL.XLSB로 '파일 가져오기' 기능을 사용하여 복사합니다.


▶ 종목 코드 검색 함수 생성

종목코드 sheet에서 종목명으로 종목코드를 검색하는 함수를 작성합니다. 다음은 샘플 코드입니다.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetStockCode(name)
    GetStockCode = ""
    With Sheets("StockCode")
        If WorksheetFunction.CountIf(.Range("D:D"), name) > 0 Then
            found = .Columns(4).Find _
                 What:=name, After:=.Cells(1, 4), _
                 LookIn:=xlValues, _ 
LookAt:=xlWhole, SearchOrder:=xlByRows, _ 
SearchDirection:=xlNext).Address
            GetStockCode = .Range(found).Offset(0, -1).Value
            GetStockCode = _
                Replace(GetStockCode, "'", "")
        End If
    End With
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

위 코드에서
  • 두 번째 줄의 "StockCode"를 종목코드가 수록된 Sheet의 이름으로 변경
  • 네 번째 줄의 "D:D"를 종목명 Column에 맞게 수정
  • 열 번째 줄의 Offset(0, -1)에서 -1을 종목명 Column과 종목코드 Column 사이의 차이에 맞게 수정
  • 종목코드 셀의 값에 코드 외의 문자가 있을 경우 제거해주면 됩니다.


▶ 매크로 자동 생성을 위한 매크로 작성

다음 코드는 PERSONAL.XLSB의 모듈 MQuote를 분석하고자 하는 종목 데이터 파일에 복사하고 DDE update 이벤트 처리를 위한 코드를 삽입하는 매크로 샘플입니다.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Fill_Quote()
    stockN = Left(ActiveWorkbook.name, _
                InStr(ActiveWorkbook.name, ".") - 1)
    MsgBox stockN
    stockC = GetStockCode(stockN)
    MsgBox stockC
    
    If stockC <> "" Then
        isExist = False
        For Each s In ActiveWorkbook.Sheets
            If s.name = "Quote" Then
                isExist = True
            End If
        Next s
        
        If isExist Then
            MsgBox ("Sorry! Delete Quote sheet first.")
            GoTo Continue1
        End If
            
        MsgBox ("Sheet Quote is to be created")
        Dim wbCode As String
        Dim modCode As String
        Dim xlmodule As Object
        Dim xlSheet As Worksheet
        Set xlSheet = ActiveWorkbook.Sheets.Add _
                        (After:=Worksheets(Worksheets.Count))
        xlSheet.name = "Quote"
        
        wbCode = "Private Sub Workbook_Open()" & vbNewLine _
            & "On Error Resume Next" & vbNewLine _
            & "ThisWorkbook.VBProject.References.AddFromFile " _
           & Chr(34) _
           & "C:\Users\drstones\ElliottPatternHelper.xlam" _
           & Chr(34) & vbNewLine _
            & "ThisWorkbook.SetLinkOnData " _
           & Chr(34) & "KHRun|'" & stockC & "'!'20'" _
           & Chr(34) & ", " & Chr(34) _
           & "Quote" & stockC & Chr(34) & vbNewLine _
            & "End Sub"
        'MsgBox wbCode
        nol = Application.Workbooks("PERSONAL.XLSB").VBProject.VBComponents("MQuote").CodeModule.CountOfLines
        modCode = Application.Workbooks("PERSONAL.XLSB").VBProject.VBComponents("MQuote").CodeModule.Lines(1, nol)
        modCode = Replace(modCode, "Sub Quote", "Sub Quote" & stockC)
        
        Worksheets("Quote").Cells(1, 1).Value = "현재가"
        Worksheets("Quote").Cells(1, 2).Value = "기준가"
        Worksheets("Quote").Cells(1, 3).Value = "거래량"
        Worksheets("Quote").Cells(1, 4).Value = "체결량"
        Worksheets("Quote").Cells(1, 5).Value = "체결시간"
        Worksheets("Quote").Cells(2, 1).Value = _
           "=KHRun|'" + stockC + "'!'10'"
        Worksheets("Quote").Cells(2, 2).Value = _
           "=KHRun|'" + stockC + "'!'307'"
        Worksheets("Quote").Cells(2, 3).Value = _
           "=KHRun|'" + stockC + "'!'13'"
        Worksheets("Quote").Cells(2, 4).Value = _
           "=KHRun|'" + stockC + "'!'15'"
        Worksheets("Quote").Cells(2, 5).Value = _
           "=KHRun|'" + stockC + "'!'20'"
        
xlSheet.Parent.VBProject.VBComponents("ThisWorkbook").CodeModule.InsertLines 1, wbCode
        Set xlmodule = xlSheet.Parent.VBProject.VBComponents.Add(1)
        xlmodule.name = "MQuote"
        xlmodule.CodeModule.InsertLines 1, modCode
        Set xlSheet = Nothing
        Set xlmodule = Nothing  
    Else
        MsgBox ("No matching stock name")
    End If
Continue1:
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

위 코드에서
  • EPH Add-In 파일의 위치 'C:\Users\drstones\ElliottPatternHelper.xlam'를 적절하게 수정
  • DDE 파일 KHRun을 사용하시는 증권사에 맞게 수정 
  • 위에서 작성한 종목코드 검색 함수를 'End Sub' 밑에 append해 줍니다.

마지막으로 PERSONAL.XLS(B)를 저장하여 엑셀을 다시 Open하면 모든 엑셀 파일에서 위 매크로를 사용할 수 있게 됩니다.

위 내용과 관련하여 의문이나 문의사항이 있으시면 댓글 남겨 주십시요.


※ Elliott Pattern Helper Add In
  • Download Add In for Excel 2007 
  • Download Add In for Excel 2003 

댓글 1개: