t8413으로 주식일봉차트를 조회하는 코드를 구성했다.
OutBlock이 두개가 있으며 첫번째 OutBlock으로 cts_date가 나오므로 이걸 이용해서 연속조회를 하면 된다. 결국 기존에 쓰던 o3123의 해외선물 분봉조회 코드와 거의 유사하다.
2022.06.29 - [코딩] - [XINGAPI] 해외선물 분봉데이터 조회 - o3123
조회갯수제한은 총 500개로 동일하나 압축기능을 활용할 경우 2000개까지 조회가 가능하고 압축된 데이터가 포함된 Outblock1 내의 데이터들은 제대로 표시가 되지 않기 때문에 GetFieldData를 실행하기 직전에 한꺼번에 OutBlock1의 압축을 해제하는 코드를 한줄 추가해줘야한다. (98, 130행 참조)
삼성전자(005930)의 일봉데이터를 연속조회한 코드 예시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
import win32com.client
import pythoncom
import pandas as pd
import time
pd.set_option('display.max_colwidth', 0)
pd.set_option('display.max_columns', 999999)
# 로그인 이벤트 클래스
class XASessionEventHandler:
login_state = 0
def OnLogin(self, code, msg):
if code == "0000":
XASessionEventHandler.login_state = 1
# TR 이벤트 클래스
class XAQueryEventHandlerTR:
query_state = 0
def OnReceiveData(self, code):
XAQueryEventHandlerTR.query_state = 1
class Main:
def __init__(self):
# TRHandler 등록
self.instXAQueryTR = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEventHandlerTR)
# 조회횟수 변수선언
self.req_count = 0
# 로그인 함수
def connect(self):
id = ""
passwd = ""
cert_passwd = ""
instXASession = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEventHandler)
instXASession.ConnectServer("demo.ebestsec.co.kr", 20001)
instXASession.Login(id, passwd, cert_passwd, 0, 0)
while XASessionEventHandler.login_state == 0:
pythoncom.PumpWaitingMessages()
# TR.Request 함수
def tr_request(self, req_con):
time.sleep(0.2)
XAQueryEventHandlerTR.query_state = 0
self.instXAQueryTR.Request(req_con)
while self.instXAQueryTR.query_state == 0:
pythoncom.PumpWaitingMessages()
self.req_count = self.req_count + 1
# 주식차트(일주월)
def req_t8413(self, shcode, gubun, qrycnt, sdate, edate, cts_date, comp_yn):
# outblock 정의
outblock = {'단축코드': 'shcode', '전일시가': 'jisiga', '전일고가': 'jihigh', '전일저가': 'jilow', '전일종가': 'jiclose', '전일거래량': 'jivolume',
'당일시가': 'disiga', '당일고가': 'dihigh', '당일저가': 'dilow', '당일종가': 'diclose', '상한가': 'highend', '하한가': 'lowend',
'연속일자': 'cts_date', '장시작시간(HHMMSS)': 's_time', '장종료시간(HHMMSS)': 'e_time', '동시호가처리시간(MM:분)': 'dshmin', '레코드카운트': 'rec_count'}
outblock1 = {'날짜': 'date', '시가': 'open', '고가': 'high', '저가': 'low', '종가': 'close', '거래량': 'jdiff_vol', '거래대금': 'value',
'수정구분': 'jongchk', '수정비율': 'rate', '수정주가반영항목': 'pricechk', '수정비율반영거래대금': 'ratevalue', '종가등락구분': 'sign'}
# 0. 변수정의
result = {} # OHLCV Data
# 1. res파일 지정
self.instXAQueryTR.ResFileName = 'C:/eBEST/xingAPI/Res/t8413.res'
# 2. 데이터 입력
self.instXAQueryTR.SetFieldData("t8413InBlock", "shcode", 0, shcode)
self.instXAQueryTR.SetFieldData("t8413InBlock", "gubun", 0, gubun)
self.instXAQueryTR.SetFieldData("t8413InBlock", "qrycnt", 0, qrycnt)
self.instXAQueryTR.SetFieldData("t8413InBlock", "sdate", 0, sdate)
self.instXAQueryTR.SetFieldData("t8413InBlock", "edate", 0, edate)
self.instXAQueryTR.SetFieldData("t8413InBlock", "cts_date", 0, cts_date)
self.instXAQueryTR.SetFieldData("t8413InBlock", "comp_yn", 0, comp_yn)
# 3. 서버전송 - 최초 조회시 0
self.tr_request(0)
# 4. OutBlock 데이터 가져오기
ret_outblock = {}
for item in outblock:
ret_outblock[item] = self.instXAQueryTR.GetFieldData("t8413OutBlock", outblock[item], 0)
print(ret_outblock)
# cts변수 업데이트
cts_date = ret_outblock['연속일자']
if cts_date == '':
con_req = False
else:
con_req = True
# 4.1 OutBlock1 데이터 가져오기
# OutBlock1 압축해제
self.instXAQueryTR.Decompress("t8413OutBlock1")
item_count = self.instXAQueryTR.GetBlockCount("t8413OutBlock1")
for i in range(item_count): # 조회건수 만큼 반복하여 조회
temp_dict = {}
for item in outblock1:
temp_dict[item] = self.instXAQueryTR.GetFieldData("t8413OutBlock1", outblock1[item], i)
result[len(result)] = temp_dict
# 연속조회 시작 -------------------------------------------------------------------------------------------------
while con_req:
# 2. 데이터 입력
self.instXAQueryTR.SetFieldData("t8413InBlock", "cts_date", 0, cts_date)
# 3. 서버전송 - 연속조회일 경우 1
self.tr_request(1)
# 4. OutBlock 데이터 가져오기
ret_outblock = {}
for item in outblock:
ret_outblock[item] = self.instXAQueryTR.GetFieldData("t8413OutBlock", outblock[item], 0)
print(ret_outblock)
# cts변수 업데이트
cts_date = ret_outblock['연속일자']
if cts_date == '': # cts_data가 비어있을 경우 연속조회 중지를 위해 con_req를 False로 바꿈
con_req = False
else:
con_req = True
# 4.1 OutBlock1 데이터 가져오기
# OutBlock1 압축해제
self.instXAQueryTR.Decompress("t8413OutBlock1")
item_count = self.instXAQueryTR.GetBlockCount("t8413OutBlock1")
for i in range(item_count): # 조회건수 만큼 반복하여 조회
temp_dict = {}
for item in outblock1:
temp_dict[item] = self.instXAQueryTR.GetFieldData("t8413OutBlock1", outblock1[item], i)
result[len(result)] = temp_dict
# 최종 dictionary 결과물과 dictionary를 dataframe으로 변환한 결과물 출력
print('조회데이터 출력 ----------------------------------------------------------------------------------------')
print(result)
print('DataFrame 출력 ---------------------------------------------------------------------------------------')
df = pd.DataFrame(result).transpose()
df = df.sort_values(by='날짜')
df = df.reset_index(drop=True)
print(df)
print('DataFrame 저장 ---------------------------------------------------------------------------------------')
df.to_csv(f'{shcode}_t8413.csv')
if __name__ == "__main__":
main = Main()
main.connect()
# 분봉업데이트
shcode = '005930'
gubun = '2'
qrycnt = 2000
sdate = '19000101'
edate = '20220707'
cts_date = ''
comp_yn = 'Y'
main.req_t8413(shcode, gubun, qrycnt, sdate, edate, cts_date, comp_yn)
|
cs |
'Python, API' 카테고리의 다른 글
백테스트의 속도개선 (0) | 2022.11.16 |
---|---|
DataFrame의 Loop속도 비교 (iloc, iat, iterrows, itertuples) (0) | 2022.11.13 |
[XINGAPI] 이베스트투자증권의 분봉 표시 (1) | 2022.07.07 |
[XINGAPI] 해외선물 실시간 주문접수/응답/체결 정보 가져오기 - TC1/TC2/TC3 (0) | 2022.06.30 |
[XINGAPI] 해외선물 분봉데이터 조회 - o3123 (0) | 2022.06.29 |