본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

CREON PLUS를 이용한 주식 일자별 시세 수집(python)

by 주용사 2023. 1. 8.
728x90

일자별 시세를 가져와야하는데 파일형태로 받아서 DB에 직접 넣는 형태를 취하고 싶었다. 데이터를 가져올 수 있는 증권사 api를 찾다가 대신증권 CREON PLUS를 찾았다.

https://androman.tistory.com/78

위의 링크는 가입부터 간단한 소스 돌리기 예제가 있는 링크이다. 키움은 https://wikidocs.net/6656

http://money2.creontrade.com/e5/mboard/ptype_basic/plusPDS/DW_Basic_Read.aspx?boardseq=299&seq=49&page=1&searchString=%ec%b0%a8%ed%8a%b8&prd=&lang=&p=8833&v=8639&m=9505

위의 링크는 대신증권에서 제공하는 샘플들이 있는 사이트이며,,내가 수정한 소스가 있는 곳이다.

--------

많은 데이터를 가져올시에 등급이 나눠져 있는 듯하다. 많은 데이터를 요구하면 고객센터에 문의하라는 경고 문자가 나온다.

소스를 보면 자료를 받는 부분이 3개의 파트로 나뉘는데 BlockRequest()의 문제 같다. 완전히 해결된 소스는 아니다.

종목코드가 들어있는 txt파일을 읽어와서 하나씩 넣어주면서 일자별 데이터를 받아온다. 40분~1시간 걸렸던 것 같다.

기간으로 조회는 잘안되어서 일단 주석처리하고 최근날로부터 최대개수를 받는 방식을 취했으나 이것도 딱히 완전한 방법은 아닌거같다.

밑에 소스를 재활용 할꺼면 if 날짜 == 20101010 같은 부분을 조정해야한다. 아니면 이빨 빠진다. 오늘날짜가 20200422이니 이날짜를 기준으로 +를 해주면 된다.

+++수정주가를 받아오는데 키움증권이랑 비교하면 또 값이 다르다..1990년도?정도부턴 똑같아지는 현상은 발견했지만..

import win32com.client
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
    print("PLUS가 정상적으로 연결되지 않음. ")
    exit()

def codeparsing():
    fff = open('C:/Users/changjo/Documents/code.txt','r')
    while True:
        line = fff.readline()
        tmp = str(line.zfill(7))
        print(tmp[:6])
        myapi(tmp[:6])
        if not line: break
    
def myapi(orgcode):
    #orgcode = 294140
    code = 'A{0}'.format(orgcode)
    print(code)
    # 차트 객체 구하기
    objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
 
    objStockChart.SetInputValue(0, code)   #종목 코드 - 삼성전자

    objStockChart.SetInputValue(1, ord('1'))  # 기간으로 받기
    #objStockChart.SetInputValue(2, 20170101)  # To 날짜
    #objStockChart.SetInputValue(3, 20200421)  # From 날짜
    objStockChart.SetInputValue(1, ord('2')) # 개수로 조회
    objStockChart.SetInputValue(4, 50000) # 최근 100일 치
    objStockChart.SetInputValue(5, [0,2,3,4,5, 8]) #날짜,시가,고가,저가,종가,거래량
    objStockChart.SetInputValue(6, ord('D')) # '차트 주가 - 일간 차트 요청
    objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
    objStockChart.BlockRequest()
    
    len = objStockChart.GetHeaderValue(3)
    #print("날짜", "시가", "고가", "저가", "종가", "거래량")
    filename = 'C:/Users/chun/Documents/stock/{0}.txt'.format(orgcode)
    ff = open(filename,'a', newline='')
    
    for i in range(len):
        day = objStockChart.GetDataValue(0, i)
        
        open1 = objStockChart.GetDataValue(1, i)
        high = objStockChart.GetDataValue(2, i)
        low = objStockChart.GetDataValue(3, i)
        close1 = objStockChart.GetDataValue(4, i)
        vol = objStockChart.GetDataValue(5, i)
        data = '{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}'.format(day,orgcode,open1,high,low,close1,vol,'\n')
        #print (day, open1, high, low, close1, vol)
        ff.write(data)
        if day == 20061031:
            break
    
    objStockChart.BlockRequest()
    len = objStockChart.GetHeaderValue(3)
    for i in range(len):
        day = objStockChart.GetDataValue(0, i)
    
        open1 = objStockChart.GetDataValue(1, i)
        high = objStockChart.GetDataValue(2, i)
        low = objStockChart.GetDataValue(3, i)
        close1 = objStockChart.GetDataValue(4, i)
        vol = objStockChart.GetDataValue(5, i)
        data = '{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}'.format(day,orgcode,open1,high,low,close1,vol,'\n')
        #print (day, open1, high, low, close1, vol)
        ff.write(data)
        if day == 19940323:
            break
        
    objStockChart.BlockRequest()
    len = objStockChart.GetHeaderValue(3)
    for i in range(len):
        day = objStockChart.GetDataValue(0, i)
            
        open1 = objStockChart.GetDataValue(1, i)
        high = objStockChart.GetDataValue(2, i)
        low = objStockChart.GetDataValue(3, i)
        close1 = objStockChart.GetDataValue(4, i)
        vol = objStockChart.GetDataValue(5, i)
        data = '{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}'.format(day,orgcode,open1,high,low,close1,vol,'\n')
        #print (day, open1, high, low, close1, vol)
        ff.write(data)
        if day == 19740102:
            break
    ff.close()

if __name__ == "__main__":
    codeparsing()

위에서소스가 데이터를 받아온다면 밑에 소스는 데이터를 DB에 넣어준다.

디렉토리를 읽어서 파일명을 가져오고 이걸 기반으로 LOAD DATA를 해준다.

#include "changjo.h"

int main(int argc, char** argv)
{
        MYSQL *pConn;
        pConn = db_init(접속정보);

        DIR *dp;
        struct dirent *item;
        struct stat statbuf;

        int count = 0;
        dp = opendir("/home/changjo/stock/");
        if(dp!=NULL)
        {
                while(1)
                {
                        item = readdir(dp);
                        lstat(item->d_name, &statbuf);
                        if(item == NULL)
                                break;

                        if(S_ISDIR(statbuf.st_mode) && strcmp(item->d_name, "..") && strcmp(item->d_name, "."))
                        {
                                char query[1024];
                                memset(query, 0x00, sizeof(query));
                                sprintf(query, "LOAD DATA LOCAL INFILE \'/home/changjo/stock/%.*s\' INTO TABLE CDB.STOCK FIELDS TERMINATED BY '|'(TRADE_DATE, CODE, OPEN_PRICE, HIGH_PRICE, LOW_PRICE, CLOSE_PRICE, VOLUME) ;", strlen(item->d_name), item->d_name);
                                printf("[%d][%s]\n", ++count,query);
                                int check = mysql_real_query(pConn, query, strlen(query));

                                if(check ==0)
                                {
                                        //exit(1);
                                }
                                else
                                        printf("Fail!! why? %s\n", mysql_error(pConn));
                        }
                }
                closedir(dp);
        }

        mysql_close(pConn);

        return 0;
}
 
728x90