X-ing API
설정방법 http://blog.naver.com/youhavegot/110085280180
X-ing API란?
- DLL(Dynamic Link Library) 형태로 제공되어지는 API(Application Programming Interface) 입니다.
- X-ing 서버와 데이터를 주고 받을 수 있는 Interface를 제공합니다.
- 체결/잔고 등의 계좌정보와 시세/시황 등의 투자정보 데이터를 제공합니다.
- 20개 이하(20여개의 데이터관리 함수 제외)의 API를 제공하며 10개 이하의 API 사용으로 X-ing 에서 제공하는 대부분의 화면을 개발할 수 있습니다.
- 요청 당시의 데이터를 전송해주는 조회 데이터 TR과 요청이후부터 데이터가 변경될때마다 전송해주는 실시간 데이터 TR, 두가지의 데이터 TR 조회로 X-ing 에서 제공하는 대부분의 화면개발이 가능합니다.
- Visual C++ 6.0 으로 제작되었으며 윈도우즈 프로그래밍이 가능한 모든 언어를 지원하기 위해 Regular DLL 로 제작되었기 때문에 Visual C++ 뿐만 아니라 Visual Basic, Delphi, C# 등으로도 개발이 가능합니다.
X-ing API 관련파일
- X-ing API 관련 파일
- XingAPI.dll
- Microsoft MFC 관련 파일
- MFC42.dll
- MSVCRT.dll
- 암호화 관련 파일
- XecureS.dll
- 공인인증 관련 파일
- SKComdCM.dll
- SKComdEM.dll
- SKComdIF.dll
- SKComdSC.dll
- SKComdIC.dll
- X-ing 서버와 연결을 맺은 이후에 아이디 인증 및 공인인증을 처리
- X-ing API가 복잡한 로그인 과정을 처리하며 결과값을 Window Message로 전송
로그인 처리 Diagram
- [로그인과정]
- 1. 로그인 함수(ETK_Login()) 호출
- 2. 로그인 인증 성공/실패는 로그인 호출시에 등록한 윈도우로 메시지(XM_LOGIN) 전송
- 3. 메시지의 wParam의 값이 “0000” 이면 성공, 그 외에는 실패
- TR이란?
- Transaction의 약자로 서버로부터 데이터를 얻기 위해 요청하고 데이터를 받는 일련의 행동을 일컫는다.
- TR은 조회TR과 실시간TR, 2가지가 존재한다. - 조회TR과 실시간TR 을 가지고 서버로부터 트레이딩에 관련된 모든 데이터를 받을 수 있다.
- 조회TR : 서버로 데이터 요청 당시의 데이터를 전송
- 실시간TR : 서버로 데이터 요청(ETK_Advise()) 이후에 데이터가 변경될때마다 데이터를 전송하며 데이터 요청종료(ETK_Unadvise())를 하면 데이터 전송을 멈춘다.
- 실시간TR은 요청 당시의 데이터를 전송해주지 않으므로 시세등 실시간으로 변하는 데이터를 받기 위해서는 조회TR을 요청하여 당시의 데이터를 받은 이후에 실시간TR을 요청하여 실시간 데이터를 받아야 한다.
데이터 처리 Diagram
- 1. 조회TR 요청(ETK_RequestData(), ETK_RequestDataEx())
- 2. 조회TR에 대한 응답 : 조회TR 요청시 등록한 윈도우로 XM_RECEIVE_DATA 메시지 전송
- 3. 조회 데이터 처리
- 4. 실시간 데이터가 필요하면 실시간 등록 이후에 사용하며 사용이 완료된 이후에 실시간 해제 호출
- 5. 실시간 데이터 등록은 원할때에 해도 되지만 조회 Data를 받은 이후에 하는 것을 추천
- 조회 TR은 서버에 데이터를 요청했을때 현재 데이터를 전송한다.
- 요청하여 데이터를 전송한 이후에 데이터가 변경이 되었을 경우 재전송이 이루어지지 않는다.
- 여러 TR을 하나의 윈도우에서 사용하는 경우 데이터를 요청했을때 획득하는 Request ID로 구별한다.
- Data를 받은 이후에 상황별로 데이터를 해제해주서야 한다.
- Data는 Data -> Message -> Release 순으로 오게 된다.
- System Error는 Data 처리 이전에 System 문제로 인하여 Data 처리가 불가능할 경우에 발생하며 이 경우엔 Data/Message/Release 가 전송되지 않는다.
조회성TR 처리 Diagram
- 1. 조회성 TR 전송 : Request ID 획득
- 2. 조회성 TR 수신 : 조회성TR 전송시 등록한 윈도우로 XM_RECEIVE_DATA
메시지 전송
타입1 WPARAM 내용 설명 1 Data - 요청한 Data를 전송
- Data가 없거나 에러가 발생한 경우 수신되지 않을 수 있음2 Message - Data 처리에 대한 Message
- Data 처리에 성공을 해도 실패를 해도 Message는 발생한다.
- Message Data를 처리하고 더이상 사용하지 않을 경우 ETK_ReleaseMessageData()를 호출하여 Message를 해제하여야 한다.3 System Error - Data 처리 이전에 System 문제로 인한 Error가 발생할 경우에 전송
- Message Data를 처리하고 더이상 사용하지 않을 경우 ETK_ReleaseMessageData()를 호출하여 Message를 해제하여야 한다.
- System Error이 발생할 경우 Release가 전송되지 않으며 ETK_ReleaseMessageData()에서 자동으로 Request ID를 해제해준다.4 Release - Data 처리가 완료된 경우에 전송
- Request ID를 해제하기 위해 ETK_ReleaseRequestData()를 호출하여야 한다.- Request ID란?
- 서버에 데이터를 전송하게 되면 부여받게 되는 ID로 서버로부터 데이터를 받을때 ID 값을 같이 받게 되므로 전송한 값에 대한 수신값을 찾을 수 있다.
- Request ID는 X-ing API에서 관리하므로 수신이 완료가 되면 해제해주서야 한다.
- Request ID는 0~255사이의 값을 사용하며 해제하지 않으면 255개의 전송이 이루어진 이후에는 전송이 불가능하다.
- Request ID란?
- 서버에 데이터를 요청한 이후에 데이터가 변경이 되었을 경우 전송이 이루어집니다.
- 데이터를 더이상 받고 싶지 않을 경우에는 요청취소를 해야 합니다.
- 요청한 시점의 데이터는 전송하지 않으므로 조회TR을 이용하여 현재의 데이터를 가져와야 합니다.
실시간TR 처리 Diagram
- 1. 실시간TR을 등록합니다.
- 2. 실시간 데이터가 변경되면 해당 데이터를 등록했을때 설정한 윈도우로 XM_RECEIVE_REAL_DATA 메시지를 통해서 전송합니다.
- 3. 더 이상 필요가 없다면 실시간TR을 해제합니다.
실시간 TR을 등록하는 시점은?
- 실시간TR을 등록할 당시의 데이터는 전송하지 않으므로 조회TR을 전송하여 데이터를 받아야 합니다.
- 조회TR을 서버로 전송함과 동시에 실시간TR을 등록하게 되면 조회TR을 받기 전에 실시간TR을 받을수 있으며
- 조회TR에 대한 수신을 받고 나서 실시간TR을 등록하게 되면 수신후의 등록시점까지 변경되는 데이터는 받을 수 없다는 문제가 있습니다.
- 이 두가지 중에 어떤것을 택하느냐는 개발자의 선택입니다.
- X-ing 에서는 대부분 수신을 받은후에 실시간TR을 등록하지만 상황에 따라서는 조회TR을 전송함과 동시에 등록하는 경우도 있습니다.
- 1. 각 TR에는 Header Type이 정해져 있으며
- 2. X-ing 에서 사용하는 Header Type은 총 4가지가 있다.
- 3. Header Type은 해당 TR의 속성을 결정지으며 처리방식이 약간씩 다르다.
- 4. TR에 대한 Header Type은 다음과 같이 알아낼수 있다.
A Type | B Type | C Type | D Type | |
---|---|---|---|---|
데이터 성격 | 시세 투자정보 |
대부분 원장(계좌) 정보 | 대부분 원장(계좌)외의 Database 정보 | 대부분 계좌정보 중 주문/계좌관련 정보 |
Data Mode | Block | Non-Block | Non-Block | Non-Block |
연속처리 | Input TR의 필드로 처리 | ETK_RequestDataEx()의 인자값으로 처리 | Input TR의 필드로 처리 | Input TR의 필드로 처리 |
ETK_RequestData() 사용 | ○ | × | × | × |
ETK_RequestDataEx() 사용 | × | ○ | ○ | ○ |
- 1. TR의 필드에는 Data Type 이 존재
- 2. Data Type 에 따라 전송/수신시 처리 방식이 다름
String | Int | Float | |
---|---|---|---|
성격 | 문자열 | 정수 | 실수 |
길이 | 문자열의 최대 길이 예) 12 : 최대 12자리의 문자열 |
정수의 최대 길이 예) 5 : 최대 5자리의 정수 |
정수부와 소수부로 나뉨 정수부는 소수부 포함 최대 길이 소수부는 소수부 최대 길이 예) 6.2 소수부분은 2자리 정수 부분이 3자리 혹은 4자리인 실수 정수부분에 “.” 가 생략되는 경우에는 정수부가 4자리 예) 123.45 => 123.45 123456 => 1234.56 |
서버 전송/수신시 |
왼쪽 정렬 남는 영역은 ‘ ‘ 로 채움 [예] 길이:5 데이터:"ABC" |
오른쪽 정렬 남는 영역은 ‘0’ 으로 채움 [예] 길이:5 데이터:"123" |
오른쪽 정렬 남는 영역은 ‘0’ 으로 채움 [예] <소수점을 포함하지 않는 경우> 길이:6.2 데이터:12.45 <소수점을 포함하는 경우 > 길이:6.2 데이터:12.45 |
- 1. 해당 필드의 속성을 결정
- 2. Attribute 속성이 있는 TR 이면 필드 뒤에 항시 1바이트의 Attribute를 가진다.
예) 7의 길이를 가진 현재가 필드는 7바이트의 현재가와 1바이트의 Attribute로 전송/수신된다. - 3. 1 Byte 의 Attribute는 각 비트마다 의미가 있다.
제목 | 설명 | 구분값 | 비고 | |
---|---|---|---|---|
0번째 비트 | Font Resize | 화면 확대시 글꼴크기 변경 여부 | 사용하지 않음 | |
1번째 비트 | Reverse | 글자색과 배경색이 바뀌는지 여부 | 0:바뀌지 않음 1:바뀜 |
현재가가 상하한가일 경우에 사용됨 |
2번째 비트 | Protect | 입력불가 여부 | 0:입력가능 1:입력불가 |
사용하지 않음 |
3번째 비트 | Cursor | 사용하지 않음 | ||
4번째 비트 | Color | 글자색 | 1:Black 2:Blue(하락) 3:Red(상승) 4:Green(보합) 5:Brown 6:Cyan 7:LightRed |
현재가 등에서 글자색을 표시하기 위해 사용 |
5번째 비트 | ||||
6번째 비트 | ||||
7번째 비트 | Use | Attribute 사용여부 | 0:사용하지 않음 1:사용 |
0으로 세팅될 경우 Attribute는 무시 |
- 1. TR의 Block들을 전송/수신시 한번에 보내고/받느냐 나누어서 보내고/받느냐의 방식
- 2. Header Type 이 A 이면 Block Mode 그렇지 않으면 Non Block Mode 입니다.
1. Block |
---|
- - Block별로 따로 전송
- - Block Mode는 Block을 각각 전송합니다.
- - 따라서 수신측에서는 A Block 을 받아서 처리하고 B Block을 받아서 처리하고 C Block을 받아서 처리하게 됩니다.
- - Receive 정보에는 Block 명이 있어 이것으로 어느 Block이 수신되었는지 구별할 수 있습니다.
2. Non-Block |
---|
- - Block을 한꺼번에 전송
- - Non Block Mode는 Block을 한번에 전송합니다.
- - 따라서 수신측에서는 A Block/B Block/C Block을 한번에 받아서 처리합니다.
- - Receive 정보에는 Block명이 없으며 B Block은 A Block의 크기만큼을 계산해서 사용해야 합니다.
많은 양의 데이터가 한번에 수신이 될 경우 Block/Non-Block에 상관없이 잘게 쪼개서 수신을 하지만 X-ing API에서 모아 하나의 데이터를 만든 후에 보내줍니다. 전송도 마찬가지로 많은 양의 데이터를 한번에 전송할 경우 잘게 쪼개서 전송을 합니다. 그러므로 Block 이 쪼개져서 들어오는 일은 없습니다.
- 1. Occurs는 배열 형식의 데이터를 일컫습니다.
- 2. 예를 들면 Grid 안에 들어가는 데이터(체결내역/잔고내역등)가 배열 형식의 데이터입니다.
- 3. Occurs는 DataMode에 따라 처리방식이 다릅니다.
1. Block |
---|
- - Recevice 된 Block의 전체 길이와 Block의 1개의 길이를 나누어 Block의 총 개수를 구함
- - 위의 경우에 수신측에서는 A Block과 B Block을 따로 받으며 B Block은 3개의 Occurs 데이터를 한번에 받게 됩니다.
- - 이때 수신측에서는 Block안의 Occurs의 개수를 알아야 처리가 가능합니다.
- - B Block 전체 데이터는 B Block만 존재하므로 받은 데이터 크기를 B Block 하나의 크기로 나누면 됩니다.
- - B Block 개수 = B Block 전체의 크기 / B Block 한 개의 크기
2. Non-Block |
---|
- - Recevice 된 Block의 첫 부분에 Block Occurs의 개수를 나타내는 5바이트의 문자열을 포함
- - 위의 경우에 수신측에서는 A Block 과 B Block 3개의 Occurs 데이터를 한번에 받게 됩니다.
- - 이때 수신측에서는 Block안의 Occurs의 개수를 알아야 처리가 가능합니다.
- - Block Mode와는 다르게 A Block이 같이 수신되므로 B Block의 개수를 알수 없습니다.( 위의 경우엔 전체 수신 크기에서 A Block의 크기를 빼면 B Block의 크기를 알 수 있지만 C Block도 전송된다고 하고 C Block도 Occurs라고 가정했을 경우엔 Occurs의 갯수를 알 방법은 없습니다.)
- - 그러므로 Block이 Occurs 인 경우에는 Block이 시작되기 전에 5 바이트의 Block의 Occurs갯수를 의미하는 문자열을 포함합니다.
- . 연속조회는 많은 양의 Occurs 데이터를 한번에 전송/수신 하지 않고 나누어서 전송/수신하는 것을 일컫습니다.
- 2. 주식시세 과거데이터등은 한번에 보내기에는 방대한 양이므로 연속조회를 이용합니다.
- 3. 체결/잔고 등의 Database를 이용하는 경우에도 한번에 많은 양의 Query가 이뤄지면 DB가 Lock이 걸리므로 연속조회를 이용하여 데이터를 보냅니다.
- 4. Data Header Type에 따라 연속조회 방식이 다릅니다.
타입1 Header Type 연속조회 방식 A 직전에 받은 OutBlock의 특정필드(CTS_XXXX)값을 입력값으로 넣어줍니다. B 직전에 받은 RECV_PACKET 안의 Continue Key 값을 ETK_RequestDataEx()의 인자로 넣어줍니다. C 직전에 받은 OutBlock의 특정필드(CTS_XXXX)값을 입력값으로 넣어줍니다. D 직전에 받은 OutBlock의 특정필드(CTS_XXXX)값을 입력값으로 넣어주고
직전에 받은 RECV_PACKET 안의 Continue Key 값을 ETK_RequestDataEx()의 인자로 넣어줍니다.
- [연속조회 기본개념]
- 1. 초기 전송시 Next Key는 SPACE로 전송
- 2. 서버에서 다음 데이터가 있으면 다음 데이터의 시작위치를 Next Key로 전송
- 3. 서버로부터 Next Key를 받으면 다음 TR전송시 받은 Next Key를 같이 전송
- 4. 서버로부터 Next Key를 받지 못하였다면 더 이상 연속데이터는 없음
Connect / Disconnect
ETK_Connect | 서버와 연결합니다. |
---|---|
ETK_IsConnected | 서버와의 연결여부를 취득합니다.. |
ETK_Disconnect | 서버와의 연결을 종료합니다. |
Login
ETK_Login | 서버에 로그인합니다. |
---|---|
ETK_Logout | 서버에서 로그아웃합니다. |
조회TR
ETK_RequestData | TR을 서버에 요청합니다.(Data Header = A) |
---|---|
ETK_RequestDataEx | TR을 서버에 요청합니다.(Data Header = B, C, D) |
ETK_ReleaseRequestData | 수신 데이터를 삭제하고 RequestID를 해제합니다. |
ETK_ReleaseMessageData | 수신 메시지를 삭제합니다. |
실시간TR
ETK_AdviseRealData | 실시간 TR을 등록합니다. |
---|---|
ETK_UnadviseRealData | 등록된 실시간 TR을 해제합니다. |
ETK_UnadviseWindow | 윈도우에 등록된 모든 실시간 TR을 해제합니다. |
계좌관련
ETK_GetAccountListCount | 계좌의 개수를 취득합니다. |
---|---|
ETK_GetAccountList | 계좌를 취득합니다. |
정보
-
DATA FORMAT 내용 설명 1 RECV_PACKET 의 Memory 주소 Data TR의 Data를 받았을때 발생 2 MSG_PACKET 의 Memory 주소 Message Message를 받았을때 발생 3 MSG_PACKET 의 Memory 주소 System Error Error가 발생 4 정수로 Request ID를 의미 Release TR이 끝났을때 발생
XM_RECEIVE_REAL_DATA = 4
- 메시지 받을 윈도우
ETK_AdviseRealData() 함수에서 넣어준 Window로 Message 전송 - WPARAM
사용안함 - LPARAM
REAL_RECV_PACKET 의 메모리 주소
실시간 TR에 대한 응답을 받았을 때 호출
XM_LOGIN = 5
- 메시지 받을 윈도우
ETK_Login() 함수에서 넣어준 Window로 Message 전송 - WPARAM
Message Code
문자열 형태
“0000” 이면 성공
그 외에는 실패 - LPARAM
Message Text
문자열 형태
ETK_Login() 함수가 호출 된 후 Login 과정이 완료되었을 때 호출
XM_LOGOUT = 6
- 메시지 받을 윈도우
ETK_Logout() 함수에서 넣어준 Window로 Message 전송 - WPARAM
Empty - LPARAM
Empty
ETK_Logout() 함수가 호출 된 후 Logout 과정이 완료되었을 때 호출
XM_TIMEOUT = 7
- 메시지 받을 윈도우
ETK_RequestData(), ETK_RequestDataEx() 함수에서 넣어준 Window로 Message 전송 - WPARAM
Empty - LPARAM
Request ID
조회 TR에 대한 응답이 Timeout 되었을 때 호출
RECV_PACKET
서버로부터 조회 데이터를 받았을때 해당 Structure로 데이터가 들어온다.
필드 | Data형 | 크기 | 설명 |
---|---|---|---|
RequestID | 정수 | 4 | ETK_RequestData(), ETK_RequestDataEx() 함수를 호출했을때 Return 값 |
Data Length | 정수 | 4 | Data 의 메모리 크기 |
Total Data Buffer Size | 정수 | 4 | Data 의 메모리에 할당된 크기 |
ElapsedTime | 정수 | 4 | 데이터 요청에서부터 데이터를 수신했을때까지 걸린 시간(1/1000초 단위) |
DataMode | 정수 | 4 | 1 : Block Mode 2 : Non Block Mode |
TR Code | 문자열 | 6 | 요청한 TR Code (마지막 1 Byte는 NULL) |
Continue | 문자열 | 1 | '0' : 연속조회 없음 '2' : 연속조회 있음 |
Continue Key | 문자열 | 19 | 연속조회가 있을 경우 Data Header가 B 일 경우 이 값이 다음 조회시 Key 가 된다. (마지막 1 Byte는 NULL) |
User Data | 문자열 | 31 | 사용안함 |
Block Name | 문자열 | 17 | Block 명, Block Mode 일 경우에 의미있다. (마지막 1 Byte는 NULL) |
Data | 문자열 포인터 | 4 | 수신된 TR 데이터 |
RECV_REAL_PACKET
서버로부터 실시간 데이터를 받았을때 해당 Structure로 데이터가 들어온다.
필드 | Data형 | 크기 | 설명 |
---|---|---|---|
TR Code | 문자열 | 4 | TR Code (마지막 1 Byte는 NULL) |
Key Length | 정수 | 4 | |
Key | 문자열 | 33 | (마지막 1 Byte는 NULL) |
RegKey | 문자열 | 33 | (마지막 1 Byte는 NULL) |
Data Length | 정수 | 4 | |
Data | 문자열 포인터 | 4 | 실시간 데이터 |
MSG_PACKET
서버로부터 데이터를 받았을때 해당 Structure로 데이터가 들어온다.
필드 | Data형 | 크기 | 설명 |
---|---|---|---|
Request ID | 정수 | 4 | Request ID |
System Error | 정수 | 4 | 0 : Message 1 : System Error |
Message Code | 문자열 | 6 | Message Code (마지막 1 Byte는 NULL) |
Message Data Length | 정수 | 4 | Message Data 길이 |
Message Data | 문자열 포인터 | 4 | Message Data |
전체 TR