대신증권 CYBOS PLUS 시작하기 (5) - 일봉차트 데이터 조회하기
학습 목표
- 차트 데이터 조회 시 전달해야 하는 인자 목록
- 차트 데이터 조회 시 데이터 수신 방법
- 차트 데이터 조회 함수 캡슐화
앞전 게시글에서 현재가를 조회하는 모듈(`Dscbo1.StockMst`)을 살펴보았고, 그 사용 방법에 대해서도 간략하게 살펴보았다. 사실 이쯤 되면 대신증권 홈페이지에 있는 도움말만 보고도 스스로 해당 함수의 기능을 구현할 수 있을 정도로 간단한 방식으로 동작한다는 것을 알게 되었을 것이다. 다만 차트 데이터를 조회하는 모듈(`CpSysDib.StockChart`)의 경우에는 데이터를 요청한 후 반환받는 함수인 `GetHeaderValue()` 뿐만 아니라 `GetDataValue()` 함수를 사용해야 한다는 점에서 현재가를 조회하는 모듈과는 다소 다른 방법으로 동작하는 것처럼 보일 수 있는데, 기본적인 동작 원리는 동일하다. 코드를 구현하기 전에 앞서, `CpSysDib.StockChart` 모듈에 대해 `self.stockchart`라는 인스턴스를 먼저 생성하자.
※ Line: 10
import win32com.client
class cybos:
def __init__(self):
self.cybos = win32com.client.Dispatch("CpUtil.CpCybos") ## COM 연결
self.stockcode = win32com.client.Dispatch("CpUtil.CpStockCode") ## COM 연결
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
self.codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") ## COM 연결
self.stockmst = win32com.client.Dispatch("DsCbo1.StockMst") ## COM 연결
self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart") ## COM 연결
(1) 차트 데이터 조회 시 전달해야 하는 인자 목록
기본적으로 서버로 데이터를 전달하는 함수는 `SetInputValue(Type, Value)`로 동일하지만 각각의 Type과 Value로 전달할 수 있는 인자 목록은 다양하다. 아래의 더보기를 클릭하여 내용을 확인해보도록 하자.
▶ `SetInputValue(Type)` 확인하기
Type:0, Value: A005930(주식), U001(업종), J516016(ELW) 등
Type:1, Value: 요청구분
전달값 '1': 기간(※ 주봉, 월봉, 분봉, 틱봉은 사용 불가)
전달값 '2': 개수(※ 분봉과 틱봉 요청 시 요청한 개수와 수신한 개수를 누적하여 관리해주어야 함)
Type:2, Value: YYYYMMDD(요청 종료일)
Type:3, Value: YYYYMMDD(요청 시작일)
Type4: Value: 요청 개수
Type5: Value: 필드 배열
필드값 0: 날짜
필드값 1: 시간(HHMM)
필드값 2: 시가
필드값 3: 고가
필드값 4: 저가
필드값 5: 종가
필드값 6: 전일대비(반드시 대비 부호인 필드값 37과 함께 요청할 것)
필드값 8: 거래량
필드값 9: 거래대금
필드값 10: 누적체결매도수량(※ 분 또는 틱 차트 조회 시에만 제공됨)
필드값 11: 누적체결매수수량(※ 분 또는 틱 차트 조회 시에만 제공됨)
필드값 12: 상장주식수
필드값 13: 시가총액
필드값 14: 외국인 주문 한도 수량
필드값 15: 외국인 주문 가능 수량
필드값 16: 외국인 현재 보유 수량
필드값 17: 외국인 현재 보유 비율
필드값 18: 수정주가일자(YYYYMMDD)
필드값 19: 수정주가 비율
필드값 20: 기관순매수
필드값 21: 기관누적순매수
필드값 22: 등락주선
필드값 23: 등락비율
필드값 24: 예탁금
필드값 25: 주식회전율
필드값 26: 거래성립률
필드값 37: 대비 부호
필드값 62: 누적체결매도수량(※ 분 또는 틱 차트 조회 시에만 제공, 체결가 비교 방식 누적체결 매도수량)
필드값 63: 누적체결매수수량(※ 분 또는 틱 차트 조회 시에만 제공, 체결가 비교 방식 누적체결 매수수량)
Type:6, Value: 차트구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
Type:7, Value: 주기(기본값: 1)
Type:8, Value: 갭 보정 여부 입력
전달값 '0': 갭 보정 X
전달값 '1': 갭 보정 O
Type:9, Value: 수정주가 여부
전달값 '0': 주가 수정 X
전달값 '1': 주가 수정 O
Type: 10, Value: 거래량 구분(기본값: 1)
전달값 '1': 시간 외 거래량 모두 포함
전달값 '2': 장 종료 시간 외 거래량만 포함
전달값 '3': 시간 외 거래량 모두 제외
전달값 '4': 장전 시간 외 거래량만 포함
Type: 11, Value: 조기 적용 여부
전달값 'Y': 8시 45분부터 분 차트 주기를 계산함
전달값 'N': 9시 00분부터 분 차트 주기를 계산함
이제 어떠한 데이터를 전달해줘야 하는지 확인했으니, 삼성전자의 일봉 차트 데이터를 조회하기 위해서는 어떠한 방식으로 코드를 구현해야 하는지에 대해서 알아보자. 일단 기본적으로 우리가 Type에 특정한 값을 전달하는 이유는 바로 서버로 하여금 Value에 들어가 있는 값이 어떤 유형의 데이터인지 쉽게 구분할 수 있도록 하기 위함이다. 즉, "A005930"만 전달하면 우리야 당연히 종목코드인 걸 알지만 컴퓨터는 이를 알 수 없다. 따라서 '"A005930"은 종목코드야.'라고 서버로 우리의 의사를 헷갈리지 않게 표현하는 것이다.
따라서 전달하고자 하는 데이터의 유형이 종목코드임을 서버가 알아차릴 수 있도록 Type에는 0을, Value에는 "A005930"을 전달해주면 된다. 그리고 나서 요청하는 구분이 일봉 데이터임을 확인할 수 있도록 Type에는 1을, Value에는 '1'을 전달하고 기간에 대한 일봉 차트 데이터 요청이므로 요청 시작일(Type: 3)과 요청 종료일(Type: 2)을 각각 지정해주도록 하자.
※ Line: 12~16
import win32com.client
class cybos:
def __init__(self):
self.cybos = win32com.client.Dispatch("CpUtil.CpCybos") ## COM 연결
self.stockcode = win32com.client.Dispatch("CpUtil.CpStockCode") ## COM 연결
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
self.codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") ## COM 연결
self.stockmst = win32com.client.Dispatch("DsCbo1.StockMst") ## COM 연결
self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart") ## COM 연결
def _StockChart(self):
self.stockchart.SetInputValue(0, "A005930") ## 종목코드
self.stockchart.SetInputValue(1, "1") ## 요청 구분
self.stockchart.SetInputValue(2, "20240401") ## 요청 종료일
self.stockchart.SetInputValue(3, "20240101") ## 요청 시작일
이제 남은 Type 번호 4에서 11까지에 해당하는 데이터도 함께 입력한 후, 데이터 요청 함수인 `BlockRequest()` 함수를 사용하여 대신증권에 데이터를 요청하도록 하자. 이전에 살펴봤던 내용이긴 하나, `BlockRequest()` 함수는 서버로부터 관련 데이터를 수신하기까지 그 외의 데이터 송수신을 멈추는 통신 방식이다.
※ Line: 16~24
def _StockChart(self):
"""
Type:5 (반환 데이터의 배열)
0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
"""
self.stockchart.SetInputValue(0, "A005930") ## 종목코드
self.stockchart.SetInputValue(1, ord("1")) ## 요청 구분
self.stockchart.SetInputValue(2, "20240401") ## 요청 종료일
self.stockchart.SetInputValue(3, "20240101") ## 요청 시작일
# self.stockchart.SetInputValue(4, "") ## 요청 개수
self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37]) ## 데이터 배열
self.stockchart.SetInputValue(6, ord("D")) ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
self.stockchart.SetInputValue(7, ord("1")) ## 주기
self.stockchart.SetInputValue(8, "0") ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
self.stockchart.SetInputValue(9, "0") ## 수정주가 여부(0: 수정 X, 1: 수정 O)
self.stockchart.SetInputValue(10, "1") ## 거래량 구분
self.stockchart.SetInputValue(11, "N") ## 조기 적용 여부
self.stockchart.BlockRequest() ## 데이터 요청
(2) 차트 데이터 조회 시 데이터 수신 방법
이제 `self.stockchart.BlockRequest()` 구문을 통해 서버에 데이터를 요청하게 되면 가장 먼저 `GetHeaderValue()` 함수를 통해 서버로부터 전달받은 데이터를 확인하고, 그 후에 `GetDataValue()` 함수를 통해 상세한 데이터 내역을 확인할 수 있게 된다. 그러기 위해서는 먼저 `GetHeaderValue(Type)` 함수의 인자로 전달할 Type에 대해 살펴보아야 하는데, 자세한 내용은 아래의 더보기를 클릭하여 확인하도록 하고, 기본적으로 Type:3이 데이터 수신 개수를 의미한다는 점만 이해하고 넘어가자.
▶ `GetHeaderValue(Type)` 확인하기
Type 0: 종목코드
Type 1: 필드개수
Type 2: 필드명의 배열
Type 3: 수신 개수
Type 4: 마지막 봉틱의 수
Type 5: 최근 거래일
Type 6: 전일 종가
Type 7: 현재가
Type 8: 대비 부호
'0': 판단불가/초기값/ 거래무, '1': 상한가, '2': 상승, '3': 보합, '4': 하한, '5': 하락
'6': 기세상한, '7': 기세상승, '8': 기세하한, '9': 기세하락
Type 9: 대비
Type 10: 거래량
Type 11: 매도호가
Type 12: 매수호가
Type 13: 시가
Type 14: 고가
Type 15: 저가
Type 16: 거래대금
Type 17: 종목 상태 (※ 미지원 ※)
Type 18: 상장주식수
Type 19: 자본금(백만원)
Type 20: 전일 거래량
Type 21: 최근 갱신 시간
Type 22: 상한가
Type 23: 하한가
이제 Type 1, 2, 3에 대해 `GetHeaderValue(Type)` 함수의 Type 인자로 전달하여 수신된 데이터를 확인해보자. Type 1, 2, 3은 각각 필드 개수, 필드 배열, 데이터 수신 개수를 의미한다. 필드의 개수는 우리가 앞서 데이터를 요청할 때 사용했던 함수인 `self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37])`내에서 [0, 2, 3, 4, 5, 8, 9, 6, 37]의 개수이고 필드 배열은 각각의 필드값이 갖는 고유한 내용(날짜, 시가, 고가, 저가, 종가, 전일대비, 거래량, 거래대금 등)을 의미한다.
※ Line: 11, 38~43
import win32com.client
class cybos:
def __init__(self):
self.cybos = win32com.client.Dispatch("CpUtil.CpCybos") ## COM 연결
self.stockcode = win32com.client.Dispatch("CpUtil.CpStockCode") ## COM 연결
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
self.codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") ## COM 연결
self.stockmst = win32com.client.Dispatch("DsCbo1.StockMst") ## COM 연결
self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart") ## COM 연결
self._StockChart()
def _StockChart(self):
"""
Type:5 (반환 데이터의 배열)
0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
"""
self.stockchart.SetInputValue(0, "A005930") ## 종목코드
self.stockchart.SetInputValue(1, ord("1")) ## 요청 구분
self.stockchart.SetInputValue(2, "20240401") ## 요청 종료일
self.stockchart.SetInputValue(3, "20240101") ## 요청 시작일
# self.stockchart.SetInputValue(4, "") ## 요청 개수
self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37]) ## 데이터 배열
self.stockchart.SetInputValue(6, ord("D")) ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
self.stockchart.SetInputValue(7, ord("1")) ## 주기
self.stockchart.SetInputValue(8, "0") ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
self.stockchart.SetInputValue(9, "0") ## 수정주가 여부(0: 수정 X, 1: 수정 O)
self.stockchart.SetInputValue(10, "1") ## 거래량 구분
self.stockchart.SetInputValue(11, "N") ## 조기 적용 여부
self.stockchart.BlockRequest() ## 데이터 요청
len_fild = self.stockchart.GetHeaderValue(1) ## 요청한 필드 개수
print(len_fild)
array_fild = self.stockchart.GetHeaderValue(2) ## 팔드 배열
print(array_fild)
len = self.stockchart.GetHeaderValue(3) ## 데이터 개수 확인
print(len)
▶ 실행 결과 확인하기
9
('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')
62
위의 결과값 중 각각의 결과값이 의미하는 것에 대해 살펴보자면, 먼저 첫 번째 줄의 9는 그 아래에 있는 필드 배열에 있는 내용들의 개수이다. 즉, '날짜' 1개, '시가' 1개, '고가' 1개부터 '대비부호'까지의 개수가 9개라는 것이다. 필드 개수와 필드 배열은 사실상 데이터를 별도로 반환할 뿐, 따지고 보면 같은 데이터임을 알 수 있다. 마지막으로 세 번째 줄에 있는 62라는 숫자는 데이터의 개수를 의미한다. 이 데이터 개수는 우리가 앞전에 삼성전자 종목의 일봉 차트 데이터를 요청할 때 요청 시작일자와 요청 종료일자를 함께 전달해주었었는데(2024.01.01.~2024.04.01.), 그 기간에 해당하는 일봉 차트의 데이터 개수가 62개라는 것이다. 월별로 약 20개의 일봉 차트를 갖고 있는 점을 생각하면 3개월 동안 62개의 데이터가 반환되었음을 확인할 수 있다.
그렇다면 우리는 이제 62개의 데이터를 반복문을 통해서 필드 배열에 따른 데이터를 하나씩 수신해야 한다. 여기서 반복문의 대상이 되는 값은 '62'이고, 그 안에서 데이터를 가져오는 기능은 `GetDataValue(Type, Index)` 함수가 수행하게 된다. 이제 이 함수에서 요구하는 인자인 Type과 Index에 대해 살펴보도록 하자.
▶ `GetDataValue(Type, Index)` 확인하기
Type: 요청한 필드의 Index 값(입력한 필드 번호 순서대로 반환됨)
Index: 요청한 종목의 Index 값
`GetDataValue(Type, Index)` 함수에 전달해주어야 하는 인자는 그 내용이 앞전에 사용한 함수에 비하면 비교적 간단한 편이다. Type 값은 앞전에 데이터를 요청할 때 사용했던 필드 배열 번호중 하나인 0, 2, 3, 4 등이 해당하며 뒤의 Index 값에는 데이터 수신 결과를 확인할 때 사용했던 함수인 `GetHeaderValue(1)`의 결과값인 62 중 어느 하나에 해당하는 값이 들어가면 된다. 그 데이터 형태를 요약하면 아래와 같다.
그렇다면 이제 `GetHeaderValue(2)`를 통해 전달받은 62에 대해 반복문을 사용하여 `GetDataValue(Type, Index)` 함수를 통해 관련 데이터를 얻어와보도록 하자.
※ Line: 45~55
데이터를 얻는 데에 있어서 다소 이해가 가지 않는 부분이 있을 수 있는데, 바로 `GetDataValue()` 함수에 전달해주어야 하는 Type의 값이다. Type 값은 단순하게 0부터 순서대로 1씩 증가해서 필드 개수(`GetHeaderValue(1)`의 값)까지 올라가면 되는데, 여기서 주의해야 할 점이 있다면 앞서 데이터를 요청하는 함수인 `SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37]`에서 데이터를 요청한 순서는 [0, 2, 3, 4, 5, 8, 9, 6, 37]과 같이 숫자가 오름차순으로 되어 있지 않았지만, 어찌됐든 요청한 데이터의 종류는 총 9개이고 반환될 때에는 [0, 2, 3, 4, 5, 6, 8, 9, 37]과 같이 오름차순 순서대로 정렬된 데이터가 반환된다는 것이다. 아래의 코드를 보면 그 내용을 어렵지 않게 확인할 수 있다.
Line 51에서 Line 53까지 부분을 보면, 데이터를 요청한 순서는 [5, 8, 9, 6]이지만 반환받은 순서는 [5, 6, 8, 9]과 같이 반환되었음을 확인할 수 있다. 다시 말해, 우리는 [종가, 거래량, 거래대금, 전일대비]의 순으로 반환해달라 했지만 서버에서는 요청한 순서와는 무관하게 필드값의 오름차순을 기준으로 하여 재정렬된 순서인 [종가, 전일대비, 거래량, 거래대금]의 순서로 반환해주었다는 것이다. 추후에 반환 받고자 하는 데이터가 추가적으로 발생하게 될 경우 그 코드를 추가하여 데이터를 조회하면 된다.
import win32com.client
class cybos:
def __init__(self):
self.cybos = win32com.client.Dispatch("CpUtil.CpCybos") ## COM 연결
self.stockcode = win32com.client.Dispatch("CpUtil.CpStockCode") ## COM 연결
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
self.codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") ## COM 연결
self.stockmst = win32com.client.Dispatch("DsCbo1.StockMst") ## COM 연결
self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart") ## COM 연결
self._StockChart()
def _StockChart(self):
"""
Type:5 (반환 데이터의 배열)
0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
"""
self.stockchart.SetInputValue(0, "A005930") ## 종목코드
self.stockchart.SetInputValue(1, ord("1")) ## 요청 구분
self.stockchart.SetInputValue(2, "20240401") ## 요청 종료일
self.stockchart.SetInputValue(3, "20240101") ## 요청 시작일
# self.stockchart.SetInputValue(4, "") ## 요청 개수
self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37]) ## 데이터 배열
self.stockchart.SetInputValue(6, ord("D")) ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
self.stockchart.SetInputValue(7, ord("1")) ## 주기
self.stockchart.SetInputValue(8, ord("0")) ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
self.stockchart.SetInputValue(9, ord("0")) ## 수정주가 여부(0: 수정 X, 1: 수정 O)
self.stockchart.SetInputValue(10, ord("1")) ## 거래량 구분
self.stockchart.SetInputValue(11, ord("N")) ## 조기 적용 여부
self.stockchart.BlockRequest() ## 데이터 요청
len_fild = self.stockchart.GetHeaderValue(1) ## 요청한 필드 개수
print(len_fild)
array_fild = self.stockchart.GetHeaderValue(2) ## 팔드 배열
print(array_fild)
len = self.stockchart.GetHeaderValue(3) ## 데이터 개수 확인
print(len)
for index in range(len):
date = self.stockchart.GetDataValue(0, index) ## 날짜(0)
open = self.stockchart.GetDataValue(1, index) ## 시가(2)
high = self.stockchart.GetDataValue(2, index) ## 고가(3)
low = self.stockchart.GetDataValue(3, index) ## 저가(4)
close = self.stockchart.GetDataValue(4, index) ## 종가(5)
dif = self.stockchart.GetDataValue(5, index) ## 전일대비(6)
vol = self.stockchart.GetDataValue(6, index) ## 거래량(8)
tvol = self.stockchart.GetDataValue(7, index) ## 거래대금(9)
pm = self.stockchart.GetDataValue(8, index) ## 대비 부호(37)
print(f"[{date}] 시:{open}, 고:{high}, 저:{low}, 종:{close}, 거래량:{vol}, 거래대금:{tvol}, 전일대비:{dif}({pm})")
▶ 실행 결과 확인하기
9
('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')
62
[20240401] 시:83200, 고:83300, 저:82000, 종:82000, 거래량:20116513, 거래대금:1661276000000, 전일대비:-400(53)
[20240329] 시:81200, 고:82500, 저:80900, 종:82400, 거래량:27126366, 거래대금:2224901000000, 전일대비:1600(50)
[20240328] 시:79400, 고:81000, 저:79200, 종:80800, 거래량:25084812, 거래대금:2014951000000, 전일대비:1000(50)
[20240327] 시:79200, 고:80000, 저:79200, 종:79800, 거래량:17424595, 거래대금:1387268000000, 전일대비:-100(53)
[20240326] 시:79700, 고:80100, 저:79200, 종:79900, 거래량:30551494, 거래대금:2435792000000, 전일대비:1700(50)
[20240325] 시:79600, 고:79800, 저:77800, 종:78200, 거래량:18703996, 거래대금:1472206000000, 전일대비:-700(53)
[20240322] 시:79600, 고:79900, 저:77800, 종:78900, 거래량:26724761, 거래대금:2104543000000, 전일대비:-400(53)
[20240321] 시:79200, 고:79300, 저:77700, 종:79300, 거래량:44569799, 거래대금:3509987000000, 전일대비:2400(50)
[20240320] 시:73700, 고:77200, 저:73400, 종:76900, 거래량:50106297, 거래대금:3799218000000, 전일대비:4100(50)
[20240319] 시:72300, 고:73000, 저:71700, 종:72800, 거래량:15376066, 거래대금:1109067000000, 전일대비:0(51)
[20240318] 시:72600, 고:73000, 저:72500, 종:72800, 거래량:11520348, 거래대금:837895000000, 전일대비:500(50)
[20240315] 시:73400, 고:73700, 저:72300, 종:72300, 거래량:22580555, 거래대금:1646273000000, 전일대비:-2000(53)
[20240314] 시:74400, 고:74500, 저:73600, 종:74300, 거래량:22545539, 거래대금:1672983000000, 전일대비:200(50)
[20240313] 시:73700, 고:74100, 저:73500, 종:74100, 거래량:15243134, 거래대금:1126213000000, 전일대비:800(50)
[20240312] 시:72600, 고:73500, 저:72100, 종:73300, 거래량:13011654, 거래대금:946370000000, 전일대비:900(50)
[20240311] 시:72900, 고:73100, 저:72300, 종:72400, 거래량:9740504, 거래대금:707795000000, 전일대비:-900(53)
[20240308] 시:72800, 고:73400, 저:72600, 종:73300, 거래량:19271349, 거래대금:1406734000000, 전일대비:1100(50)
[20240307] 시:73100, 고:73300, 저:72200, 종:72200, 거래량:14516963, 거래대금:1054959000000, 전일대비:-700(53)
[20240306] 시:73200, 고:73500, 저:72700, 종:72900, 거래량:21547905, 거래대금:1577128000000, 전일대비:-800(53)
[20240305] 시:74600, 고:74800, 저:73700, 종:73700, 거래량:19505125, 거래대금:1446710000000, 전일대비:-1200(53)
[20240304] 시:74300, 고:75000, 저:74000, 종:74900, 거래량:23210474, 거래대금:1730190000000, 전일대비:1500(50)
[20240229] 시:72600, 고:73400, 저:72000, 종:73400, 거래량:21176403, 거래대금:1543929000000, 전일대비:200(50)
[20240228] 시:72900, 고:73900, 저:72800, 종:73200, 거래량:11795859, 거래대금:866532000000, 전일대비:300(50)
[20240227] 시:73100, 고:73400, 저:72700, 종:72900, 거래량:13201981, 거래대금:963297000000, 전일대비:100(50)
[20240226] 시:72300, 고:73200, 저:72200, 종:72800, 거래량:14669352, 거래대금:1067725000000, 전일대비:-100(53)
[20240223] 시:73600, 고:74200, 저:72900, 종:72900, 거래량:16225166, 거래대금:1189838000000, 전일대비:-200(53)
[20240222] 시:73800, 고:73900, 저:72700, 종:73100, 거래량:15208934, 거래대금:1111907000000, 전일대비:100(50)
[20240221] 시:73400, 고:73700, 저:72900, 종:73000, 거래량:11503495, 거래대금:841682000000, 전일대비:-300(53)
[20240220] 시:73700, 고:73700, 저:72800, 종:73300, 거래량:14681477, 거래대금:1074233000000, 전일대비:-500(53)
[20240219] 시:72800, 고:73900, 저:72800, 종:73800, 거래량:12726404, 거래대금:936829000000, 전일대비:1000(50)
[20240216] 시:73300, 고:73400, 저:72500, 종:72800, 거래량:13444781, 거래대금:979246000000, 전일대비:-200(53)
[20240215] 시:74200, 고:74400, 저:73000, 종:73000, 거래량:14120600, 거래대금:1037048000000, 전일대비:-1000(53)
[20240214] 시:73700, 고:74300, 저:73700, 종:74000, 거래량:12434945, 거래대금:920046000000, 전일대비:-1200(53)
[20240213] 시:74800, 고:75200, 저:74400, 종:75200, 거래량:21966745, 거래대금:1645918000000, 전일대비:1100(50)
[20240208] 시:75000, 고:75200, 저:73600, 종:74100, 거래량:20810708, 거래대금:1545421000000, 전일대비:-900(53)
[20240207] 시:74600, 고:75500, 저:74300, 종:75000, 거래량:16566445, 거래대금:1241375000000, 전일대비:600(50)
[20240206] 시:74300, 고:74700, 저:73300, 종:74400, 거래량:14559254, 거래대금:1079406000000, 전일대비:100(50)
[20240205] 시:74200, 고:74800, 저:73500, 종:74300, 거래량:19026021, 거래대금:1407991000000, 전일대비:-900(53)
[20240202] 시:74000, 고:75200, 저:73700, 종:75200, 거래량:14955881, 거래대금:1116696000000, 전일대비:1600(50)
[20240201] 시:73000, 고:74200, 저:72900, 종:73600, 거래량:19881033, 거래대금:1460989000000, 전일대비:900(50)
[20240131] 시:73400, 고:74000, 저:72500, 종:72700, 거래량:15703560, 거래대금:1148592000000, 전일대비:-1600(53)
[20240130] 시:75000, 고:75300, 저:73700, 종:74300, 거래량:12244418, 거래대금:910103000000, 전일대비:-100(53)
[20240129] 시:73800, 고:75200, 저:73500, 종:74400, 거래량:13976521, 거래대금:1040949000000, 전일대비:1000(50)
[20240126] 시:73700, 고:74500, 저:73300, 종:73400, 거래량:11160062, 거래대금:824499000000, 전일대비:-700(53)
[20240125] 시:74200, 고:74800, 저:73700, 종:74100, 거래량:11737747, 거래대금:870261000000, 전일대비:100(50)
[20240124] 시:75200, 고:75200, 저:73500, 종:74000, 거래량:12860661, 거래대금:950729000000, 전일대비:-1200(53)
[20240123] 시:75700, 고:75800, 저:74300, 종:75200, 거래량:14786224, 거래대금:1109206000000, 전일대비:100(50)
[20240122] 시:75900, 고:76000, 저:75000, 종:75100, 거래량:19673375, 거래대금:1484936000000, 전일대비:400(50)
[20240119] 시:73500, 고:74700, 저:73000, 종:74700, 거래량:23363427, 거래대금:1729032000000, 전일대비:3000(50)
[20240118] 시:71600, 고:72000, 저:70700, 종:71700, 거래량:17853397, 거래대금:1274268000000, 전일대비:700(50)
[20240117] 시:73100, 고:73300, 저:71000, 종:71000, 거래량:22683660, 거래대금:1627050000000, 전일대비:-1600(53)
[20240116] 시:73500, 고:73700, 저:72500, 종:72600, 거래량:14760415, 거래대금:1075976000000, 전일대비:-1300(53)
[20240115] 시:73200, 고:74000, 저:73200, 종:73900, 거래량:13212339, 거래대금:973180000000, 전일대비:800(50)
[20240112] 시:73000, 고:74100, 저:72800, 종:73100, 거래량:13038939, 거래대금:956811000000, 전일대비:-100(53)
[20240111] 시:72900, 고:73600, 저:72700, 종:73200, 거래량:57691266, 거래대금:4206812000000, 전일대비:-400(53)
[20240110] 시:75000, 고:75200, 저:73200, 종:73600, 거래량:20259529, 거래대금:1497565000000, 전일대비:-1100(53)
[20240109] 시:77400, 고:77700, 저:74300, 종:74700, 거래량:26019249, 거래대금:1971736000000, 전일대비:-1800(53)
[20240108] 시:77000, 고:77500, 저:76400, 종:76500, 거래량:11088724, 거래대금:852681000000, 전일대비:-100(53)
[20240105] 시:76700, 고:77100, 저:76400, 종:76600, 거래량:11304316, 거래대금:866836000000, 전일대비:0(51)
[20240104] 시:76100, 고:77300, 저:76100, 종:76600, 거래량:15324439, 거래대금:1173912000000, 전일대비:-400(53)
[20240103] 시:78500, 고:78800, 저:77000, 종:77000, 거래량:21753644, 거래대금:1691690000000, 전일대비:-2600(53)
[20240102] 시:78200, 고:79800, 저:78200, 종:79600, 거래량:17142847, 거래대금:1356958000000, 전일대비:1100(50)
(3) 차트 데이터 조회 함수 캡슐화
차트 데이터 조회 함수인 `def _StockChart(self):` 함수를 하나의 캡슐로 생성하기 위해 해당 함수는 어떠한 인자들을 요구해야 할까? 일단 가장 기본적인 정보는 종목코드는 물론이고, 그 외의 경우에는 데이터를 어떠한 형태로 요청하고 수신받을지에 따라 그 형태는 많이 달라질 것이다. 따라서 일단 현재로서는 현재 구현한 코드에 대해서만 캡슐화 작업을 하도록 하자. 즉, 종목코드와 요청일자 범위에 대해서만 인자로 받는 것이다.
※ Line: 11, 13, 24, 26, 27
import win32com.client
class cybos:
def __init__(self):
self.cybos = win32com.client.Dispatch("CpUtil.CpCybos") ## COM 연결
self.stockcode = win32com.client.Dispatch("CpUtil.CpStockCode") ## COM 연결
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
self.codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") ## COM 연결
self.stockmst = win32com.client.Dispatch("DsCbo1.StockMst") ## COM 연결
self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart") ## COM 연결
self._StockChart("A005930", "20240101", "20240401")
def _StockChart(self, item_code, start_date, end_date):
"""
Type:5 (반환 데이터의 배열)
0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
"""
self.stockchart.SetInputValue(0, item_code) ## 종목코드
self.stockchart.SetInputValue(1, ord("1")) ## 요청 구분
self.stockchart.SetInputValue(2, end_date) ## 요청 종료일
self.stockchart.SetInputValue(3, start_date) ## 요청 시작일
# self.stockchart.SetInputValue(4, "") ## 요청 개수
self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37]) ## 데이터 배열
self.stockchart.SetInputValue(6, ord("D")) ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
self.stockchart.SetInputValue(7, ord("1")) ## 주기
self.stockchart.SetInputValue(8, ord("0")) ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
self.stockchart.SetInputValue(9, ord("0")) ## 수정주가 여부(0: 수정 X, 1: 수정 O)
self.stockchart.SetInputValue(10, ord("1")) ## 거래량 구분
self.stockchart.SetInputValue(11, ord("N")) ## 조기 적용 여부
self.stockchart.BlockRequest() ## 데이터 요청
len_fild = self.stockchart.GetHeaderValue(1) ## 요청한 필드 개수
array_fild = self.stockchart.GetHeaderValue(2) ## 팔드 배열
len = self.stockchart.GetHeaderValue(3) ## 데이터 개수 확인
for index in range(len):
date = self.stockchart.GetDataValue(0, index) ## 날짜(0)
open = self.stockchart.GetDataValue(1, index) ## 시가(2)
high = self.stockchart.GetDataValue(2, index) ## 고가(3)
low = self.stockchart.GetDataValue(3, index) ## 저가(4)
close = self.stockchart.GetDataValue(4, index) ## 종가(5)
dif = self.stockchart.GetDataValue(5, index) ## 전일대비(6)
vol = self.stockchart.GetDataValue(6, index) ## 거래량(8)
tvol = self.stockchart.GetDataValue(7, index) ## 거래대금(9)
pm = self.stockchart.GetDataValue(8, index) ## 대비 부호(37)
print(f"[{date}] 시:{open}, 고:{high}, 저:{low}, 종:{close}, 거래량:{vol}, 거래대금:{tvol}, 전일대비:{dif}({pm})")
▶ 실행 결과 확인하기
9
('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')
62
[20240401] 시:83200, 고:83300, 저:82000, 종:82000, 거래량:20116513, 거래대금:1661276000000, 전일대비:-400(53)
[20240329] 시:81200, 고:82500, 저:80900, 종:82400, 거래량:27126366, 거래대금:2224901000000, 전일대비:1600(50)
[20240328] 시:79400, 고:81000, 저:79200, 종:80800, 거래량:25084812, 거래대금:2014951000000, 전일대비:1000(50)
[20240327] 시:79200, 고:80000, 저:79200, 종:79800, 거래량:17424595, 거래대금:1387268000000, 전일대비:-100(53)
[20240326] 시:79700, 고:80100, 저:79200, 종:79900, 거래량:30551494, 거래대금:2435792000000, 전일대비:1700(50)
[20240325] 시:79600, 고:79800, 저:77800, 종:78200, 거래량:18703996, 거래대금:1472206000000, 전일대비:-700(53)
[20240322] 시:79600, 고:79900, 저:77800, 종:78900, 거래량:26724761, 거래대금:2104543000000, 전일대비:-400(53)
[20240321] 시:79200, 고:79300, 저:77700, 종:79300, 거래량:44569799, 거래대금:3509987000000, 전일대비:2400(50)
[20240320] 시:73700, 고:77200, 저:73400, 종:76900, 거래량:50106297, 거래대금:3799218000000, 전일대비:4100(50)
[20240319] 시:72300, 고:73000, 저:71700, 종:72800, 거래량:15376066, 거래대금:1109067000000, 전일대비:0(51)
[20240318] 시:72600, 고:73000, 저:72500, 종:72800, 거래량:11520348, 거래대금:837895000000, 전일대비:500(50)
[20240315] 시:73400, 고:73700, 저:72300, 종:72300, 거래량:22580555, 거래대금:1646273000000, 전일대비:-2000(53)
[20240314] 시:74400, 고:74500, 저:73600, 종:74300, 거래량:22545539, 거래대금:1672983000000, 전일대비:200(50)
[20240313] 시:73700, 고:74100, 저:73500, 종:74100, 거래량:15243134, 거래대금:1126213000000, 전일대비:800(50)
[20240312] 시:72600, 고:73500, 저:72100, 종:73300, 거래량:13011654, 거래대금:946370000000, 전일대비:900(50)
[20240311] 시:72900, 고:73100, 저:72300, 종:72400, 거래량:9740504, 거래대금:707795000000, 전일대비:-900(53)
[20240308] 시:72800, 고:73400, 저:72600, 종:73300, 거래량:19271349, 거래대금:1406734000000, 전일대비:1100(50)
[20240307] 시:73100, 고:73300, 저:72200, 종:72200, 거래량:14516963, 거래대금:1054959000000, 전일대비:-700(53)
[20240306] 시:73200, 고:73500, 저:72700, 종:72900, 거래량:21547905, 거래대금:1577128000000, 전일대비:-800(53)
[20240305] 시:74600, 고:74800, 저:73700, 종:73700, 거래량:19505125, 거래대금:1446710000000, 전일대비:-1200(53)
[20240304] 시:74300, 고:75000, 저:74000, 종:74900, 거래량:23210474, 거래대금:1730190000000, 전일대비:1500(50)
[20240229] 시:72600, 고:73400, 저:72000, 종:73400, 거래량:21176403, 거래대금:1543929000000, 전일대비:200(50)
[20240228] 시:72900, 고:73900, 저:72800, 종:73200, 거래량:11795859, 거래대금:866532000000, 전일대비:300(50)
[20240227] 시:73100, 고:73400, 저:72700, 종:72900, 거래량:13201981, 거래대금:963297000000, 전일대비:100(50)
[20240226] 시:72300, 고:73200, 저:72200, 종:72800, 거래량:14669352, 거래대금:1067725000000, 전일대비:-100(53)
[20240223] 시:73600, 고:74200, 저:72900, 종:72900, 거래량:16225166, 거래대금:1189838000000, 전일대비:-200(53)
[20240222] 시:73800, 고:73900, 저:72700, 종:73100, 거래량:15208934, 거래대금:1111907000000, 전일대비:100(50)
[20240221] 시:73400, 고:73700, 저:72900, 종:73000, 거래량:11503495, 거래대금:841682000000, 전일대비:-300(53)
[20240220] 시:73700, 고:73700, 저:72800, 종:73300, 거래량:14681477, 거래대금:1074233000000, 전일대비:-500(53)
[20240219] 시:72800, 고:73900, 저:72800, 종:73800, 거래량:12726404, 거래대금:936829000000, 전일대비:1000(50)
[20240216] 시:73300, 고:73400, 저:72500, 종:72800, 거래량:13444781, 거래대금:979246000000, 전일대비:-200(53)
[20240215] 시:74200, 고:74400, 저:73000, 종:73000, 거래량:14120600, 거래대금:1037048000000, 전일대비:-1000(53)
[20240214] 시:73700, 고:74300, 저:73700, 종:74000, 거래량:12434945, 거래대금:920046000000, 전일대비:-1200(53)
[20240213] 시:74800, 고:75200, 저:74400, 종:75200, 거래량:21966745, 거래대금:1645918000000, 전일대비:1100(50)
[20240208] 시:75000, 고:75200, 저:73600, 종:74100, 거래량:20810708, 거래대금:1545421000000, 전일대비:-900(53)
[20240207] 시:74600, 고:75500, 저:74300, 종:75000, 거래량:16566445, 거래대금:1241375000000, 전일대비:600(50)
[20240206] 시:74300, 고:74700, 저:73300, 종:74400, 거래량:14559254, 거래대금:1079406000000, 전일대비:100(50)
[20240205] 시:74200, 고:74800, 저:73500, 종:74300, 거래량:19026021, 거래대금:1407991000000, 전일대비:-900(53)
[20240202] 시:74000, 고:75200, 저:73700, 종:75200, 거래량:14955881, 거래대금:1116696000000, 전일대비:1600(50)
[20240201] 시:73000, 고:74200, 저:72900, 종:73600, 거래량:19881033, 거래대금:1460989000000, 전일대비:900(50)
[20240131] 시:73400, 고:74000, 저:72500, 종:72700, 거래량:15703560, 거래대금:1148592000000, 전일대비:-1600(53)
[20240130] 시:75000, 고:75300, 저:73700, 종:74300, 거래량:12244418, 거래대금:910103000000, 전일대비:-100(53)
[20240129] 시:73800, 고:75200, 저:73500, 종:74400, 거래량:13976521, 거래대금:1040949000000, 전일대비:1000(50)
[20240126] 시:73700, 고:74500, 저:73300, 종:73400, 거래량:11160062, 거래대금:824499000000, 전일대비:-700(53)
[20240125] 시:74200, 고:74800, 저:73700, 종:74100, 거래량:11737747, 거래대금:870261000000, 전일대비:100(50)
[20240124] 시:75200, 고:75200, 저:73500, 종:74000, 거래량:12860661, 거래대금:950729000000, 전일대비:-1200(53)
[20240123] 시:75700, 고:75800, 저:74300, 종:75200, 거래량:14786224, 거래대금:1109206000000, 전일대비:100(50)
[20240122] 시:75900, 고:76000, 저:75000, 종:75100, 거래량:19673375, 거래대금:1484936000000, 전일대비:400(50)
[20240119] 시:73500, 고:74700, 저:73000, 종:74700, 거래량:23363427, 거래대금:1729032000000, 전일대비:3000(50)
[20240118] 시:71600, 고:72000, 저:70700, 종:71700, 거래량:17853397, 거래대금:1274268000000, 전일대비:700(50)
[20240117] 시:73100, 고:73300, 저:71000, 종:71000, 거래량:22683660, 거래대금:1627050000000, 전일대비:-1600(53)
[20240116] 시:73500, 고:73700, 저:72500, 종:72600, 거래량:14760415, 거래대금:1075976000000, 전일대비:-1300(53)
[20240115] 시:73200, 고:74000, 저:73200, 종:73900, 거래량:13212339, 거래대금:973180000000, 전일대비:800(50)
[20240112] 시:73000, 고:74100, 저:72800, 종:73100, 거래량:13038939, 거래대금:956811000000, 전일대비:-100(53)
[20240111] 시:72900, 고:73600, 저:72700, 종:73200, 거래량:57691266, 거래대금:4206812000000, 전일대비:-400(53)
[20240110] 시:75000, 고:75200, 저:73200, 종:73600, 거래량:20259529, 거래대금:1497565000000, 전일대비:-1100(53)
[20240109] 시:77400, 고:77700, 저:74300, 종:74700, 거래량:26019249, 거래대금:1971736000000, 전일대비:-1800(53)
[20240108] 시:77000, 고:77500, 저:76400, 종:76500, 거래량:11088724, 거래대금:852681000000, 전일대비:-100(53)
[20240105] 시:76700, 고:77100, 저:76400, 종:76600, 거래량:11304316, 거래대금:866836000000, 전일대비:0(51)
[20240104] 시:76100, 고:77300, 저:76100, 종:76600, 거래량:15324439, 거래대금:1173912000000, 전일대비:-400(53)
[20240103] 시:78500, 고:78800, 저:77000, 종:77000, 거래량:21753644, 거래대금:1691690000000, 전일대비:-2600(53)
[20240102] 시:78200, 고:79800, 저:78200, 종:79600, 거래량:17142847, 거래대금:1356958000000, 전일대비:1100(50)
실행 결과를 보면, 해당 칸에 데이터를 직접 입력한 후에 데이터를 조회하는 것과 `self._StockChart()` 함수에 각각의 인자들(종목코드, 시작일자, 종료일자)을 전달하여 데이터를 조회하는 것에 있어서 그 결과값에는 어떠한 차이도 없음을 확인할 수 있다.
'AUTO TRADE > [대신증권] CYBOS PLUS' 카테고리의 다른 글
대신증권 CYBOS PLUS 시작하기 (7) - 차트조회 클래스 생성하기 (0) | 2024.08.04 |
---|---|
대신증권 CYBOS PLUS 시작하기 (6) - 분봉차트 데이터 조회하기 (0) | 2024.08.04 |
대신증권 CYBOS PLUS 시작하기 (4) - 특정종목 현재가 조회하기 (0) | 2024.08.03 |
대신증권 CYBOS PLUS 시작하기 (3) - 대신증권 모듈 이해하기 (0) | 2024.07.29 |
대신증권 CYBOS PLUS 시작하기 (2) - 연결함수 캡슐화 (0) | 2024.07.26 |
소중한 공감 감사합니다