종목검색 HTS 의종목검색기능을지원합니다. Step 1 HTS [1807] 종목검색 화면에서검색조건을설정합니다. 조건설정방법은 HTS 도움말을참조하시기바랍니다. Step 2 API 로보내기 버튼을이용해파일로저장합니다. Step 3 개발프로그램에서 XAQuery 객체에 t1833 TR 의 res 를할당합니다. 1
종목검색 Step 4 개발프로그램에서 RequestService() 함수를통해데이터를요청합니다. 수신처리는 Request() 함수와동일합니다. (xingapi 설치폴더 \ 엑셀샘플 폴더아래 종목검색과HTS연동.xlsm 엑셀샘플첫번째시트참고 ) Set XAQuery_t1833 = CreateObject("XA_DataSet.XAQuery") Call XAQuery_t1833.LaodFromResFile( \Res\t1833.res ) int nreqid = XAQuery_t1807.RequestService( t1833, "D:\test.adf ) If nreqid < 0 Then MsgBox " 전송오류 " End If 2
차트지표 - 엑셀 VBA 차트지표데이터는 HTS [4201] xing차트1 의 [ 수식관리자 기술적지표 ] 데이터와동일한데이터를 API에서제공해드리는기능으로, ChartIndex( 차트지표데이터조회 ) TR과 RequestService() 메소드를이용하여조회하며, 실서버에서만조회가능합니다. 차트지표데이터는 API 내부에서차트기초데이터를가공하여제공하는것으로, 조회및실시간에 다소시간이걸릴수있습니다. 아래의코드는 ChartIndex( 차트지표데이터조회 ) TR을이용하여지표를조회하는예제입니다. 이것은 xingapi 설치폴더내 엑셀샘플 \ 차트지표데이터조회및실시간 (ChartIndex).xlsm 파일에서도확인가능합니다. Step 1 설정합니다. DevCenter 내 [ 부가서비스 수식관리자 ] 메뉴에서 수식관리 화면을열어필요한지표를 수식관리자 메뉴를클릭합니다. 1 원하는지표를설정합니다. (HTS [4201] xingq 차트 1 내수식관리자와동일한기능 ) 2 3
차트지표 - 엑셀 VBA Step 2 XAQuery 객체를선언합니다. ( 일반데이터조회과정과동일 ) [ 개발도구 ] 메뉴를클릭합니다. 1 일반데이터조회시의객체선언과동일하며 TR 코드만다른것입니다. Step 3 XAQuery 객체생성및 Res 파일등록을합니다. ( 일반데이터조회과정과동일 ) Res 파일이없다고오류가발생할때에는 [DevCenter - TR 목록창 ] 에서 TR 코드를클릭하면, 클릭하는시점에서버에서자동으로다운로드받습니다. 4
차트지표 - 엑셀 VBA Step 4 Inblock 의입력값을모두설정합니다. ( 일반데이터조회과정과동일 ) 입력값을설정합니다. 5
차트지표 - 엑셀 VBA Step 5 차트지표데이터를요청합니다. 부가서비스용메소드인 RequestService() 메소드를사용합니다. Long RequestService(BSTR szcode, BSTR szdata) 부가서비스처리용메소드로 Request() 메소드와파라미터만다를뿐이용방법은유사 szcode : ChartIndex szdata : 사용안함 반환값 : 에러코드 0 이상이면 API-> 서버로의요청이성공, 0 미만이면 API-> 서버로의요청실패 ex) MACD 지표데이터조회 일반조회 TR 과동일하게 ChartIndex TR 의 Inblock 값을모두입력 call XAQuery_ChartIndex.SetFieldData( ChartIndexInBlock, indexname, 0, MACD ). 생략 call XAQuery_ChartIndex. RemoveService( ChartIndex, outblock.indexed) int nreqid = XAQuery_ChartIndex.RequestService( ChartIndex, 0) 6
차트지표 - 엑셀 VBA Step 6 차트지표데이터결과를수신받습니다. ( 일반데이터조회과정과동일 ) 1 ChartIndex TR 은 API 내부에서차트 기초데이터 -> 지표데이터 로가공된후이벤트가발생합니다. 2 이벤트는 XAQuery 객체의 ReceiveData 이벤트를사용합니다. ChartIndex TR 에대한 API 내부의지표데이터가공처리가완료되면 ReceiveMessage 이벤트는지표데이터요청에대한결과를무조건수신받습니다. -> 지표요청이성공했는지, 실패했는지판단 ReceiveData 이벤트는지표데이터요청이성공했을때, Outblock 의데이터를수신받습니다. -> 지표데이터요청이실패했을때는수신받지않습니다. 따라서, 지표요청이성공했을때에만데이터를확인시기바랍니다. 객체콤보내의 XAQuery 객체를선택 1 XAQuery 객체의이벤트콤보리스트중 ReceiveData 이벤트를선택하면 2 자동으로이벤트맵이추가됩니다. 3 7
차트지표 - 엑셀 VBA Step 6 이벤트를받았다면 GetFieldData 메소드를사용하여수신데이터를가져옵니다. ( 일반데이터조회과정과동일 ) 지표결과를표시합니다. 8
차트지표 - 엑셀 VBA 전체코드 Option Explicit Dim g_currentpos As Integer ' 표시데이터의현재위치 Dim g_indexid As String ' 지표의 indexid Dim WithEvents XAQuery_ChartIndex As XAQuery ' 지표데이터조회 (API용) ------------------------ ' 차트의지표데이터를조회합니다 ------------------------ Private Sub btnquery_click() ' 이전에조회한데이터를삭제 Dim srange As String If g_currentpos <> 0 Then srange = "B22" & ":N" & CStr(g_currentpos + 22) Range(sRange).ClearContents End If g_currentpos = 0 g_indexid = "" ' 객체생성및 Res 할당 If XAQuery_ChartIndex Is Nothing Then Set XAQuery_ChartIndex = CreateObject("XA_DataSet.XAQuery") XAQuery_ChartIndex.ResFileName = "\res\chartindex.res" End If ' 이전의 indexid 값이있다면, 차트지표데이터를해제 Dim nsuccess As Integer If Len(g_indexId) > 0 Then Call XAQuery_ChartIndex.RemoveService("ChartIndex", g_indexid) End If 9
차트지표 - 엑셀 VBA ' ChartIndex 요청 Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "indexname", 0, Range("D9").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "market", 0, Range("D10").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "period", 0, Range("D11").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "shcode", 0, Range("D12").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "qrycnt", 0, Range("D13").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "ncnt", 0, Range("D14").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "sdate", 0, Range("D15").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "edate", 0, Range("D16").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "Isamend", 0, Range("D17").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "Isgab", 0, Range("D18").Value) Call XAQuery_ChartIndex.SetFieldData("ChartIndexInBlock", "IsReal", 0, Range("D19").Value) nsuccess = XAQuery_ChartIndex.RequestService("ChartIndex", "") If nsuccess < 0 Then MsgBox " 전송에러 : " & nsuccess End If End Sub ------------------------ ' 차트지표데이터의조회결과의성공여부를수신받습니다 ------------------------ Private Sub XAQuery_ChartIndex_ReceiveMessage(ByVal bissystemerror As Boolean, ByVal nmessagecode As String, ByVal szmessage As String) Range("D20").Value = CStr(nMessageCode) & " : " & szmessage End Sub ------------------------ ' 차트지표데이터의조회결과성공시, 결과를수신받습니다 ------------------------ Private Sub XAQuery_ChartIndex_ReceiveData(ByVal sztrcode As String) 10
차트지표 - 엑셀 VBA ' 지표의 indexid ( 지표별구분키로사용할수있다 ) g_indexid = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock", "indexid", 0) ' 검색종목수 g_currentpos = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock", "rec_cnt", 0) If g_currentpos = 0 Then Exit Sub End If ' 데이터저장 Dim arrdata(10000, 13) Dim i, cnt As Integer ' 맨첫번째데이터에서지표값 1~5는각컬럼의제목이다 arrdata(0, 0) = " 순서 " arrdata(0, 1) = " 일자 " arrdata(0, 2) = " 시간 " arrdata(0, 3) = " 시가 " arrdata(0, 4) = " 고가 " arrdata(0, 5) = " 저가 " arrdata(0, 6) = " 종가 " arrdata(0, 7) = " 거래량 " arrdata(0, 8) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value1", 0) arrdata(0, 9) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value2", 0) arrdata(0, 10) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value3", 0) arrdata(0, 11) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value4", 0) arrdata(0, 12) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value5", 0) ' 두번째데이터부터지표이다 cnt = g_currentpos For i = 1 To cnt - 1 arrdata(i, 0) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "pos", cnt - i) arrdata(i, 1) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "date", cnt - i) 11
차트지표 - 엑셀 VBA arrdata(i, 2) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "time", cnt - i) arrdata(i, 3) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "open", cnt - i) arrdata(i, 4) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "high", cnt - i) arrdata(i, 5) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "low", cnt - i) arrdata(i, 6) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "close", cnt - i) arrdata(i, 7) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "volume", cnt - i) arrdata(i, 8) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value1", cnt - i) arrdata(i, 9) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value2", cnt - i) arrdata(i, 10) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value3", cnt - i) arrdata(i, 11) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value4", cnt - i) arrdata(i, 12) = XAQuery_ChartIndex.GetFieldData("ChartIndexOutBlock1", "value5", cnt - i) Next ' 위치를찾아서데이터를넣어준다 Dim srange As String srange = "B22" & ":N" & CStr(g_currentpos + 22) Range(sRange) = arrdata End Sub ------------------------ ' 차트지표데이터의실시간지표를수신받습니다 ------------------------ Private Sub XAQuery_ChartIndex_ReceiveChartRealData(ByVal sztrcode As String) On Error Resume Next ' 실시간지표데이터의위치를확인 Dim pos As Integer pos = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "pos") If pos = g_currentpos Then ' 이전위치에표시 g_currentpos = pos ' 새로운지표이면, 맨위에추가하고나머지데이터를아래로한줄내린다 ElseIf pos > g_currentpos Then Range("B23:N1022").Copy Destination:=Range("B24:N1023") 12
차트지표 - 엑셀 VBA g_currentpos = pos Else Exit Sub End If ' 실시간지표데이터가져오기 Dim arrdata(1, 13) arrdata(0, 0) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "pos") arrdata(0, 1) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "date") arrdata(0, 2) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "time") arrdata(0, 3) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "open") arrdata(0, 4) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "high") arrdata(0, 5) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "low") arrdata(0, 6) = XAQuery_ChartIndex.GetFieldChartRealData("ChartIndexOutBlock1", "close") End Sub 13
차트지표 -C++ 아래의코드는 xingapi 설치시, 설치폴더내의 ChartAPISample.exe 프로그램의소스코드로 xingapi홈페이지 [ 자료실 일반자료실 ] VC++ 샘플 - ChartAPISample(2014.10) : 차트지표데이터 게시글내샘플소스와동일합니다. Step 1 차트지표데이터를요청합니다. 1 ChartIndex TR 을 ETK_RequestService() 함수를이용해요청하며, 2 결과를처리하는방식은일반데이터조회와동일합니다. int ETK_RequestService( HWND hwnd, LPCTSTR pszcode, LPCTSTR pszdata ) ( 부가서비스처리용함수 Request() 함수와파라미터만다를뿐이용방법은유사 ) hwnd : 결과수신메시지를받을윈도우핸들 szcode : t1833 szdata : HTS [1807] 종목검색 ' 화면에서설정한검색조건을저장한파일의전체경로 반환값 : 에러코드 0 이상이면 API-> 서버로의요청이성공, 0 미만이면 API-> 서버로의요청실패 ex) HTS '[1807] 종목검색 ' 에서 'API 로내보내기 ' 저장한파일이 "D:\test.adf 이라면, szcode = t1833, szdata = "D:\test.adf" int nreqid = g_xingapi.requestservice(getsafehwnd(), t1833, "D:\test.adf ) 오류발생시, 확인함수 nerrcode = GetLastError() : API 에서의마지막에러값을반환 GetErrorMessage( nerrcode ) : 에러코드에대한에러메시지를반환 14
차트지표 -C++ //---------------------------------------------------------------------------------------------------- // 차트지표데이터조회를요청합니다 //---------------------------------------------------------------------------------------------------- void CIndexView::OnBtnQuery() { 생략 } ChartIndexInBlock inblock; memset(&inblock, 0x20, sizeof(chartindexinblock)); strcpy(inblock.indexname, m_strindexname); // [string, 40] 지표명 inblock.market[0]= ntype+'0'; // [string, 1] 시장구분 inblock.period[0]= nperiod+'0' ; // [sting, 1] 주기구분 strcpy(inblock.shcode, strcode); // [string, 8] 단축코드 sprintf(inblock.qrycnt, "%d", ncount); // [long, 4] 요청건수 ( 최대 500개 ) sprintf(inblock.ncnt, "%d", 1); // [long, 4] 단위 (n틱/n분) strcpy(inblock.edate, strdate); // [string, 8] 종료일자 ( 일 / 주 / 월해당 ) inblock.isamend[0]= '1'; // [string, 1] 수정주가반영여부 ( inblock.isgab[0]= '1 ; // [string, 1] 갭보정여부 inblock.isreal[0]= nreal+'0 ; // [string, 1] 실시간데이터자동등록 nrqid = g_ixingapi.requestservice(getsafehwnd(), NAME_CHARTINDEX, (LPCTSTR)&inblock); 15
차트지표 -C++ Step 2 차트지표데이터결과를수신받습니다. ETK_RequestService() 가성공하면, 서버로부터 XM_RECEIVE_DATA 메시지를수신받아지표데이터결과 를확인합니다. BEGIN_MESSAGE_MAP(CIndexView, CFormView) ON_MESSAGE(WM_USER + XM_RECEIVE_DATA, ON_MESSAGE(WM_USER + XM_TIMEOUT_DATA, ON_MESSAGE(WM_USER + XM_RECEIVE_CHARTREALDATA, END_MESSAGE_MAP() OnXMReceiveData) OnXMTimeoutData) OnXMReceiveRealData) LRESULT CIndexView::OnXMReceiveData( WPARAM wparam, LPARAM lparam ) { //------------------------------------------------------------------------------------- // Data를받음 : 지표데이터요청성공시에서버로부터수신된다. // 지표데이터요청실패시에발생하는경우도있지만더미데이터이므로무시한다 if( wparam == REQUEST_DATA ) { // 필요한데이터이용 } //------------------------------------------------------------------------------------- // Release Data를받음 else if( wparam == RELEASE_DATA ) { g_ixingapi.releaserequestdata( (int)lparam ); } } return 0L; 16
e 종목검색 - 엑셀 VBA e종목검색은 HTS [1892] e종목검색 의 API 보내기, 전략관리를이용한실시간종목검색기능입니다. 기존파일은 ADF, 신규파일은 ACF 입니다. 기존파일은실시간종목검색에서사용이불가합니다. 아래의코드는 t1857( 종목검색 ( 신버전API용 )) TR을이용하여지표를조회하는예제입니다. 이것은 xingapi 설치폴더내 엑셀샘플 \e종목검색(t1857).xlsm 파일에서도확인가능합니다. Step 1 HTS [1892]e 종목검색화면에서검색조건을설정합니다. 조건설정방법은 HTS 도움말을참조하시기바랍니다. Step 2-1 API로보내기 버튼을이용해파일로저장합니다. 17
e 종목검색 - 엑셀 VBA Step 2-2 전략관리를이용해서버에전략을저장합니다.( 저장한전략리스트는 t1866 으로확인가능 ) [ 전략관리 ] 메뉴를클릭합니다. 1 서버에전략을저장한후화면을닫습니다. 저장한전략은 t1866 을이용하여조회하실수있습니다. 18
e 종목검색 - 엑셀 VBA Step 3 XAQuery 객체를선언합니다. ( 일반데이터조회과정과동일 ) [ 개발도구 ] 메뉴를클릭합니다. 1 일반데이터조회시의객체선언과동일하며 TR 코드만다른것입니다. Step 4 XAQuery 객체생성및 Res 파일등록을합니다. ( 일반데이터조회과정과동일 ) Res 파일이없다고오류가발생할때에는 [DevCenter - TR 목록창 ] 에서 TR 코드를클릭하면, 클릭하는시점에서버에서자동으로다운로드받습니다. 19
e 종목검색 - 엑셀 VBA Step 5 Inblock 의입력값을모두설정합니다. ( 일반데이터조회과정과동일 ) 입력값을설정합니다. 20
e 종목검색 - 엑셀 VBA Step 6 e 종목검색데이터를요청합니다. 부가서비스용메소드인 RequestService() 메소드를사용합니다. Long RequestService(BSTR szcode, BSTR szdata) 부가서비스처리용메소드로 Request() 메소드와파라미터만다를뿐이용방법은유사 szcode : ChartIndex szdata : 사용안함 반환값 : 에러코드 0 이상이면 API-> 서버로의요청이성공, 0 미만이면 API-> 서버로의요청실패 ex) 일반조회 TR 과동일하게 t1857 TR 의 Inblock 값을모두입력 Call XAQuery_t1857.SetFieldData("t1857InBlock", "srealflag", 0, Range("G8").Value). 생략 int nreqid = XAQuery_t1857.RequestService("t1857", "") 21
e 종목검색 - 엑셀 VBA Step 7 e 종목검색데이터결과를수신받습니다. ( 일반데이터조회과정과동일 ) 1 이벤트는 XAQuery 객체의 ReceiveData 이벤트를사용합니다. 객체콤보내의 XAQuery 객체를선택 1 XAQuery 객체의이벤트콤보리스트중 ReceiveData 이벤트를선택하면 2 자동으로이벤트맵이추가됩니다. 3 22
e 종목검색 - 엑셀 VBA Step 8 이벤트를받았다면 GetFieldData 메소드를사용하여수신데이터를가져옵니다. ( 일반데이터조회과정과동일 ) 지표결과를표시합니다. 23
e 종목검색 - 엑셀 VBA 전체코드 Option Explicit Dim g_count As Integer Dim WithEvents XAQuery_t1857 As XAQuery - [ 조회 TR] 종목검색 (API 용 ) ' 실시간해제요청 Private Sub btnreleasereal_click() ' t1857 요청 Dim skey As String skey = Range("L8").Value ' 실시간등록 Key ' 객체생성및 Res 할당 If XAQuery_t1857 Is Nothing Then Set XAQuery_t1857 = CreateObject("XA_DataSet.XAQuery") XAQuery_t1857.ResFileName = "\res\t1857.res" End If Dim nsuccess As Integer nsuccess = XAQuery_t1857.RemoveService("t1857", skey) End Sub ' 종목검색요청 Private Sub btnsearch_click() ' 이전에조회한데이터를삭제 Dim srange As String If g_count <> 0 Then srange = "B10" & ":J" & CStr(g_Count + 10) Range(sRange).ClearContents End If 24
e 종목검색 - 엑셀 VBA ' t1857 요청 Dim sfile As String sfile = Range("C8").Value ' 파일명 ( 전체경로포함 ) ' 객체생성및 Res 할당 If XAQuery_t1857 Is Nothing Then Set XAQuery_t1857 = CreateObject("XA_DataSet.XAQuery") XAQuery_t1857.ResFileName = "\res\t1857.res" End If Dim skey As String skey = Range("L8").Value ' 실시간등록 Key Dim nsuc As Integer nsuc = XAQuery_t1857.RemoveService("t1857", skey) ' t1857 요청 Call XAQuery_t1857.SetFieldData("t1857InBlock", "srealflag", 0, Range("G8").Value) Call XAQuery_t1857.SetFieldData("t1857InBlock", "ssearchflag", 0, Range("J8").Value) Call XAQuery_t1857.SetFieldData("t1857InBlock", "query_index", 0, Range("C8").Value) Dim nsuccess As Integer nsuccess = XAQuery_t1857.RequestService("t1857", "") If nsuccess < 0 Then MsgBox " 전송에러 : " & nsuccess End If ' ' ' End Sub Private Sub XAQuery_t1857_ReceiveData(ByVal sztrcode As String) 25
e 종목검색 - 엑셀 VBA On Error Resume Next ' 검색종목수 g_count = XAQuery_t1857.GetFieldData("t1857OutBlock", "result_count", 0) Range("L8") = XAQuery_t1857.GetFieldData("t1857OutBlock", "AlertNum", 0) Dim arrdata(10000, 9) If g_count = 0 Then End If Exit Sub ' 데이터저장 Dim i As Integer For i = 0 To g_count - 1 arrdata(i, 0) = i + 1 arrdata(i, 1) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "shcode", i) ' 종목코드 arrdata(i, 2) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "hname", i) ' 종목명 arrdata(i, 3) = GetSignPic(XAQuery_t1857.GetFieldData("t1857OutBlock1", "sign", i))' 전일대비구분 arrdata(i, 4) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "change", i) ' 전일대비 arrdata(i, 5) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "price", i) ' 현재가 arrdata(i, 6) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "diff", i) ' 등락율 arrdata(i, 7) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "volume", i) 거래량 arrdata(i, 8) = XAQuery_t1857.GetFieldData("t1857OutBlock1", "JobFlag", i) ' 진입여부 Next ' 위치를찾아서데이터를넣어준다 Dim srange As String srange = "B10" & ":J" & CStr(g_Count + 10) Range(sRange) = arrdata End Sub 26
e 종목검색 - 엑셀 VBA Private Sub XAQuery_t1857_ReceiveSearchRealData(ByVal sztrcode As String) On Error Resume Next Dim pos As Integer pos = g_count If pos >= 0 Then Range("C10:J10009").Copy Destination:=Range("C11:J10010") Else Exit Sub End If If pos >= 10000 Then g_count = 10000 ElseIf pos >= 0 Then g_count = pos + 1 End If Dim arrdata(1, 9) arrdata(0, 0) = 1 arrdata(0, 1) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "shcode") ' 종목코드 arrdata(0, 2) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "hname") 종목명 arrdata(0, 3) = GetSignPic(XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "sign")) ' 전일대비구분 arrdata(0, 4) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "change") 전일대비 arrdata(0, 5) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "price") ' 현재가 arrdata(0, 6) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "diff") ' 등락율 arrdata(0, 7) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "volume") ' 거래량 arrdata(0, 8) = XAQuery_t1857.GetFieldSearchRealData("t1857OutBlock1", "JobFlag") ' 진입여부 ' 위치를찾아서데이터를넣어준다 Dim srange As String srange = "B10" & ":J10" Range(sRange) = arrdata End Sub 27
e 종목검색 -C++ 아래의코드는 xingapi 설치시, 설치폴더내의 xingapi_sample_esearch.exe 프로그램의소스코드로 xingapi홈페이지 [ 자료실 일반자료실 ] VC++ 샘플 - xingapi_sample_esearch(2018.02) : 실시간종목검색 게시글내샘플소스와동일합니다. Step 1 종목검색을요청합니다. 1 t1857 TR 을 ETK_RequestService() 함수를이용해요청하며, 2 결과를처리하는방식은일반데이터조회와동일합니다. int ETK_RequestService( HWND hwnd, LPCTSTR pszcode, LPCTSTR pszdata ) ( 부가서비스처리용함수 Request() 함수와파라미터만다를뿐이용방법은유사 ) hwnd : 결과수신메시지를받을윈도우핸들 szcode : t1857 szdata : t1857inblock 데이터 반환값 : 에러코드 0 이상이면 API-> 서버로의요청이성공, 0 미만이면 API-> 서버로의요청실패 ex) HTS '[1892] e 종목검색 ' 에서 'API 로내보내기 ' 저장한파일이 "D:\test.acf 이라면, szcode = t1857, szdata = "D:\test.acf szflag = F, szreal = 1 SetPacketData( pckinblock.srealflag, sizeof( pckinblock.srealflag), szreal, DATA_TYPE_STRING ); SetPacketData(pckInBlock.sSearchFlag,sizeof( pckinblock.ssearchflag),szflag,data_type_string ); SetPacketData( pckinblock.query_index,sizeof( pckinblock.query_index),szdata,data_type_string ); int nrqid = g_ixingapi.requestservice( GetSafeHwnd(), szcode, (LPCTSTR)&pckInBlock ) 오류발생시, 확인함수 nerrcode = GetLastError() : API 에서의마지막에러값을반환 GetErrorMessage( nerrcode ) : 에러코드에대한에러메시지를반환 28
e 종목검색 -C++ //-------------------------------------------------------------------------------------- // 데이터조회 void CDlg_t1857::RequestData( BOOL bnext ) { t1857inblock pckinblock; TCHAR sztrno[] = "t1857"; char sznextkey[] = ""; //----------------------------------------------------------- // 데이터취득 CString str_index; GetDlgItemText( IDC_INBLOCK_INDEX1857, str_index );// 종목검색입력값 CString str_flag; m_combo_flag.getlbtext(m_combo_flag.getcursel(),str_flag); str_flag = str_flag.left(1); // 조회구분값 S: 서버 F: 파일 CString str_real; m_combo_real.getlbtext(m_combo_real.getcursel(),str_real); str_real = str_real.left(1); // 실시간여부 1: 등록 0: 조회만 FillMemory( &pckinblock, sizeof( pckinblock ), ' ' ); // 입력값초기화 //----------------------------------------------------------- // 데이터입력 SetPacketData( pckinblock.srealflag, sizeof( pckinblock.srealflag), str_real, DATA_TYPE_STRING ); SetPacketData(pckInBlock.sSearchFlag,sizeof(pckInBlock.sSearchFlag),str_Flag,DATA_TYPE_STRING ); SetPacketData(pckInBlock.query_index,sizeof(pckInBlock.query_index),str_Index,DATA_TYPE_STRING); // 종목검색입력값 //----------------------------------------------------------- // 데이터전송 int nrqid = g_ixingapi.requestservice( GetSafeHwnd(),szTrNo,(LPCTSTR)&pckInBlock); if( bnext == FALSE ) { m_ctrloutblock1.deleteallitems(); } // 기존데이터삭제 //----------------------------------------------------------- // Request ID가 0보다작을경우에는에러이다. if( nrqid < 0 ) { MessageBox( " 조회실패 ", " 에러 ", MB_ICONSTOP ); } } 29
e 종목검색 -C++ Step 2 종목검색결과를수신받습니다. ETK_RequestService() 가성공하면, 서버로부터 XM_RECEIVE_DATA 메시지를수신받아종목검색결과를 확인합니다. BEGIN_MESSAGE_MAP(CDlg_t1857, CDialog) ON_MESSAGE(WM_USER + XM_RECEIVE_DATA, OnXMReceiveData) ON_MESSAGE(WM_USER + XM_TIMEOUT_DATA, OnXMTimeoutData) ON_MESSAGE(WM_USER + XM_RECEIVE_REAL_DATA_SEARCH, OnXMReceiveRealSearchData) END_MESSAGE_MAP() LRESULT CDlg_t1857::OnXMReceiveData( WPARAM wparam, LPARAM lparam ) { //------------------------------------------------------------------------------------- // Data를받음 : 지표데이터요청성공시에서버로부터수신된다. // 지표데이터요청실패시에발생하는경우도있지만더미데이터이므로무시한다 if( wparam == REQUEST_DATA ) { // 필요한데이터이용 } //------------------------------------------------------------------------------------- // Release Data를받음 else if( wparam == RELEASE_DATA ) { g_ixingapi.releaserequestdata( (int)lparam ); } } return 0L; 30
e 종목검색 -C++ Step 3 종목검색실시간을수신받습니다. 실시간데이터가발생하면, 서버로부터 XM_RECEIVE_REAL_DATA_SEARCH 메시지를수신받아종목검 색신호를확인합니다. BEGIN_MESSAGE_MAP(CDlg_t1857, CDialog) ON_MESSAGE(WM_USER + XM_RECEIVE_DATA, OnXMReceiveData) ON_MESSAGE(WM_USER + XM_TIMEOUT_DATA, OnXMTimeoutData) ON_MESSAGE(WM_USER + XM_RECEIVE_REAL_DATA_SEARCH, OnXMReceiveRealSearchData) END_MESSAGE_MAP() LRESULT CDlg_t1857:: OnXMReceiveRealSearchData( WPARAM wparam, LPARAM lparam ) { LPRECV_REAL_PACKET prealpacket = (LPRECV_REAL_PACKET)lParam; } LPt1857OutBlock1 poutblock = (LPt1857OutBlock1)pRealPacket->pszData; int nrowcount = m_ctrloutblock1.getitemcount(); m_ctrloutblock1.insertitem( 0, "" ); m_ctrloutblock1.setitemtext( 0, 0, GetDispData( poutblock->shcode, sizeof( poutblock->shcode ), DATA_TYPE_STRING ) ); // 종목코드... CString strjobflag; strjobflag = GetDispData( poutblock->jobflag, sizeof( poutblock->jobflag ), DATA_TYPE_STRING ); if(strcmp( strjobflag, "N" ) == 0) strjobflag = " 신규 "; else if(strcmp( strjobflag, "R" ) == 0) strjobflag = " 재진입 "; else if(strcmp( strjobflag, "O" ) == 0) strjobflag = " 탈퇴 "; m_ctrloutblock1.setitemtext( 0, 7, strjobflag ); // 종목상태 return 0L; 31
감사합니다