본문 바로가기
stock/system-trading

creon- 종목 일자별 데이터 가져오기

by sniffer-k 2023. 6. 12.
  • 기본 구조
    • 크레온 python 환경에서 종목별 일자별 데이터를 가져오기 위해서 크게 2가지 ? 방법이 있다
    • objStockWeek = win32com.client.Dispatch("DsCbo1.StockWeek")
      • StockWeek 으로 가져오는 경우 5일 단위로 일자별 정보를 가져온다
    • objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
      • 차트 모듈을 이용하여 지정된 기간 단위로 일자별 정보를 가져온다

 

나중에 코드를 위해서라면... 차트 모듈("StockChart") 를 이용하여 가져오는게 편하다

 

챠트 모듈을 이용하여 일자별 데이터를 가져오는 샘플 코드는 다음과 같다.

 

import sys
import win32com.client
import ctypes
import numpy as np

g_objCpStatus = win32com.client.Dispatch('CpUtil.CpCybos')
g_objCpTrade = win32com.client.Dispatch('CpTrade.CpTdUtil')

def InitPlusCheck():
    # 프로세스가 관리자 권한으로 실행 여부
    if ctypes.windll.shell32.IsUserAnAdmin():
        print('정상: 관리자권한으로 실행된 프로세스입니다.')
    else:
        print('오류: 일반권한으로 실행됨. 관리자 권한으로 실행해 주세요')
        return False

    # 연결 여부 체크
    if (g_objCpStatus.IsConnect == 0):
        print("PLUS가 정상적으로 연결되지 않음. ")
        return False

    # # 주문 관련 초기화 - 계좌 관련 코드가 있을 때만 사용
    # if (g_objCpTrade.TradeInit(0) != 0):
    #     print("주문 초기화 실패")
    #     return False

    return True

# 차트 기본 데이터 통신
class CpStockChart:
    def __init__(self):
        self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
        self.objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")

    def Request(self, code, cnt, objSeries, final_data_list):
        #######################################################
        # 1. 일간 차트 데이터 요청  -> 세부 옵션 변경가능 
        self.objStockChart.SetInputValue(0, code)  # 종목 코드 -
        self.objStockChart.SetInputValue(1, ord('2'))  # 개수로 조회
        self.objStockChart.SetInputValue(4, cnt)  # 최근 100일치
        self.objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8])  # 날짜,시가,고가,저가,종가,거래량
        self.objStockChart.SetInputValue(6, ord('D'))  # '차트 주기 - 일간 차트 요청
        self.objStockChart.SetInputValue(9, ord('1'))  # 수정주가 사용
        self.objStockChart.BlockRequest()

        rqStatus = self.objStockChart.GetDibStatus()
        rqRet = self.objStockChart.GetDibMsg1()
        #print("통신상태", rqStatus, rqRet)
        if rqStatus != 0:
            exit()

        #######################################################
        # 2. 일간 차트 데이터 ==> CpIndexes.CpSeries 로 변환
        len = self.objStockChart.GetHeaderValue(3)

        #print("날짜", "시가", "고가", "저가", "종가", "거래량")
        #print("==============================================-")
        for i in range(len):
            day = self.objStockChart.GetDataValue(0, len - i - 1)
            open = self.objStockChart.GetDataValue(1, len - i - 1)
            high = self.objStockChart.GetDataValue(2, len - i - 1)
            low = self.objStockChart.GetDataValue(3, len - i - 1)
            close = self.objStockChart.GetDataValue(4, len - i - 1)
            vol = self.objStockChart.GetDataValue(5, len - i - 1)
            # print(day, open, high, low, close, vol)
            # objSeries.Add 종가, 시가, 고가, 저가, 거래량, 코멘트
            objSeries.Add(close, open, high, low, vol)

            day_list_tmp  = []
			# 인덱스 순서..로 저장
            day_list_tmp.append(day)        #0
            day_list_tmp.append(open)       #1
            day_list_tmp.append(high)       #2
            day_list_tmp.append(low)        #3
            day_list_tmp.append(close)      #4
            day_list_tmp.append(vol)        #5
            final_data_list.append(day_list_tmp)

        #print("==============================================-")

        return

class stocktest:
	def __init__(self):
		#0. 분석 대상 종목의 최종 데이터 정보 저장
		self.final_data_list =[]

		# 1. 차트 데이터 통신 요청
		self.objChart = CpStockChart()

		# CpIndexes.CpSeries : 차트 기본 데이터 관리 PLUS 객체
		self.objSeries = win32com.client.Dispatch("CpIndexes.CpSeries")


	def print_stock_info(self,code,days):

		# 테스트를 위해 jongmok 종목으로 미리 차트 데이터 구성
		self.objChart.Request(code, days, self.objSeries,self.final_data_list)

		index = 0
		for value in self.final_data_list:
			print(f'{index} {value[0]} {value[1]} {value[2]} {value[3]} {value[4]} {value[5]}' )
			index+=1
		

def test_main():
    
    day1_object = stocktest()
    
	#삼성전자 현재부터 100일전 일자별 자료 요청
    day1_object.print_stock_info("A005930",100);


    
if __name__ == "__main__":
    dage_main()

 

호출 결과는 다음과 같다

 

06.12 기준으로부터 100일 기록이니 2023.01.12 부터의 데이터가 출력된것을 확인할 수 있다

 

출력 결과

 

 

차트 데이터 요청에서 추가적인 옵션 정보는 다음과 같다

 

요청 필드 5

0: 날짜(ulong)
1:시간(long) - hhmm
2:시가(long or float)
3:고가(long or float)
4:저가(long or float)
5:종가(long or float)
6:전일대비(long or float) - 주) 대비부호(37)과 반드시 같이 요청해야 함
8:거래량(ulong or ulonglong) 주) 정밀도 만원 단위
9:거래대금(ulonglong)
10:누적체결매도수량(ulong or ulonglong) - 호가비교방식 누적체결매도수량
11:누적체결매수수량(ulong or ulonglong) - 호가비교방식 누적체결매수수량
 (주) 10, 11 필드는 분,틱 요청일 때만 제공
12:상장주식수(ulonglong)
13:시가총액(ulonglong)
14:외국인주문한도수량(ulong)
15:외국인주문가능수량(ulong)
16:외국인현보유수량(ulong)
17:외국인현보유비율(float)
18:수정주가일자(ulong) - YYYYMMDD
19:수정주가비율(float)
20:기관순매수(long)
21:기관누적순매수(long)
22:등락주선(long)
23:등락비율(float)
24:예탁금(ulonglong)
25:주식회전율(float)
26:거래성립률(float)
37:대비부호(char) - 수신값은 GetHeaderValue 8 대비부호와 동일

 

요청 필드 6 (차트 주기)

차트 주기 옵션

 


참고

https://money2.creontrade.com/e5/mboard/ptype_basic/plusPDS/DW_Basic_Read.aspx?boardseq=299&seq=42&page=2&searchString=%ec%a0%95%eb%b3%b4&prd=&lang=7&p=8833&v=8639&m=9505

 

728x90

'stock > system-trading' 카테고리의 다른 글

RSI-part2  (0) 2023.05.26
RSI - 테스트 - part1  (0) 2023.05.23
creon- 종목 정보 얻기  (0) 2023.05.22
creon - auto login example  (0) 2023.05.21
MFI (Money Flow Index)  (0) 2022.06.26