알고 있는 방법은 2가지 입니다.
- 하루씩 추출해서 보는 방법
- 분단위로 추출해서 보는 방법 ( 분은 사용자가 지정 가능하게 만들었음.)
import win32com.client
import time
import shutil
import os
import codecs
import pandas as pd
import numpy as np
from datetime import datetime
from tqdm import tqdm
# from pywinauto import application
# from pywinauto import timings
class CREON(object):
"""대신증권 크레온 API"""
def __init__(self):
# 연결 여부 체크
self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = self.objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
else:
print("정상적으로 연결되었음")
def setMethod(self, code, char, minutes=1, from_yyyymmdd=None, to_yyyymmdd=None, count=None):
"""
count는 보통 상식의 데이터 개수가 아니다.
여기서는 한번 요청 시 가져와지는 데이터의 개수이다.
한번 요청 시 최대 2856개 가능하다.
원하는 데이터 개수가 있으면 to_yyyymmdd 로 가져온 다음에 잘라서 사용한다.
하루에 분단위 데이터가 381개이다. (* 마지막 10분은 동시호가)
"""
# object 구하기
self.objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
self.objStockChart.SetInputValue(0, code) # 종목코드
if to_yyyymmdd:
self.objStockChart.SetInputValue(1, ord('1')) # 요청 구분 '1': 기간, '2': 개수
self.objStockChart.SetInputValue(2, from_yyyymmdd) # To 날짜
self.objStockChart.SetInputValue(3, to_yyyymmdd) # From 날짜
elif count:
self.objStockChart.SetInputValue(1, ord('2')) # 개수로 받기
self.objStockChart.SetInputValue(4, count) # 조회 개수
else:
raise print("기간을 입력해주세요.")
# 날짜, 시간,시가,고가,저가,종가,거래량
self.colnames = "날짜, 시간, 시가, 고가, 저가, 종가, 거래량".split(", ")
self.objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8])
# 날짜,시가,고가,저가,종가,거래량, 거래대금, 상장주식수, 시가총액, 외국인현보유수량, 기관순매수
# self.colnames = "날짜, 시가, 고가, 저가, 종가, 거래량, 거래대금, 상장주식수, 시가총액, 외국인현보유수량, 기관순매수".split(", ")
# self.objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 12, 13, 16, 20])
self.objStockChart.SetInputValue(6, ord(char)) # '차트 주기 - 분/틱 # # 'D', m'
if char == "m":
self.objStockChart.SetInputValue(7, minutes) # 분틱차트 주기 ## 1분은 1로
self.objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
self.data = {i: [] for i in self.colnames}
def checkRequest(self):
self.objStockChart.BlockRequest()
rqStatus = self.objStockChart.GetDibStatus()
if rqStatus != 0:
return False
self.count = self.objStockChart.GetHeaderValue(3)
if self.count <= 1:
return False
return int(self.count)
def checkRemainTime(self):
# 연속 요청 가능 여부 체크
remainTime = self.objCpCybos.LimitRequestRemainTime / 1000.
remainCount = self.objCpCybos.GetLimitRemainCount(1) # 시세 제한
print("남은시간: ",remainTime, " 남은개수: ", remainCount)
if remainCount <= 0:
print("15초당 60건으로 제한합니다.")
time.sleep(remainTime)
def getStockPriceMin(self):
while 1:
self.checkRemainTime()
rows = self.checkRequest()
if rows:
for i in range(rows):
for idx, col in enumerate(self.colnames):
self.data[col].append(self.objStockChart.GetDataValue(idx, i))
else:
break
self.data = pd.DataFrame(self.data).astype('str')
return self.data
1. 하루단위 조회 방법
code = 'A005930'
name='삼성전자'
creon = CREON()
#creon.setMethod(code=code, char="m", minutes=2, to_yyyymmdd=20200519,from_yyyymmdd=20200520)
creon.setMethod(code=code, char="D", to_yyyymmdd=20200519,from_yyyymmdd=20200520)
getStockPrice = creon.getStockPriceMin()
print('---------name : {} 요청은 완료됬습니다.'.format(name))
2. 분단위 조회방법 ( 예제는 2분단위 )
code = 'A005930'
name='삼성전자'
creon = CREON()
creon.setMethod(code=code, char="m", minutes=2, to_yyyymmdd=20200519,from_yyyymmdd=20200520)
#creon.setMethod(code=code, char="D", to_yyyymmdd=20200519,from_yyyymmdd=20200520)
getStockPrice = creon.getStockPriceMin()
print('---------name : {} 요청은 완료됬습니다.'.format(name))