행위

대신증권 분봉 조회

DB CAFE

thumb_up 추천메뉴 바로가기


원본>> https://money2.daishin.com/e5/mboard/ptype_basic/plusPDS/DW_Basic_Read.aspx?boardseq=299&seq=49&page=1&searchString=%ec%a3%bc%ea%b0%80&prd=&lang=7&p=8831&v=8638&m=9508

1 대신증권 원본[편집]

import win32com.client
 
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
    print("PLUS가 정상적으로 연결되지 않음. ")
    exit()
 
# 차트 객체 구하기
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
 
objStockChart.SetInputValue(0, 'A005930')   #종목 코드 - 삼성전자
objStockChart.SetInputValue(1, ord('2')) # 개수로 조회
objStockChart.SetInputValue(4, 100) # 최근 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("날짜", "시가", "고가", "저가", "종가", "거래량")
print("빼기빼기==============================================-")
 
for i in range(len):
    day = objStockChart.GetDataValue(0, i)
    open = objStockChart.GetDataValue(1, i)
    high = objStockChart.GetDataValue(2, i)
    low = objStockChart.GetDataValue(3, i)
    close = objStockChart.GetDataValue(4, i)
    vol = objStockChart.GetDataValue(5, i)
    print (day, open, high, low, close, vol)


2 분봉데이터 적재[편집]

import win32com.client
import dbcon_synol
import pymysql
import time
import datetime
import UTIL_SLACK_CALL

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

# DB 연결
db = dbcon_synol.conn()
cursor = db.cursor(pymysql.cursors.DictCursor)

def selectLimitStockList(cursor):
    # 종목코드 기준으로 tb_stock_daily_info 테이블에 적재된 max(일자) +1  값 , 현재 일자 조회
    selectSql = "SELECT tl.stock_cd" \
                "     , tl.stock_kind_cd" \
                "     , IFNULL(DATE_FORMAT(DATE_ADD(MAX(td.date), INTERVAL +1 DAY),'%Y%m%d'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -900 DAY), '%Y%m%d')) AS start_date" \
                "	  , DATE_FORMAT(CURDATE(), '%Y%m%d') AS end_date" \
                "  FROM vw_stock_list tl" \
                "  JOIN (SELECT td.stock_cd,stock_kind_cd,td.volume,td.date" \
                "         from tb_stock_daily_info_3h td" \
                "       WHERE 1=1" \
                "         AND CONVERT(CLS_PRICE,SIGNED) > CONVERT(START_PRICE,SIGNED)" \
                "         AND CONVERT(CLS_PRICE,signed) BETWEEN 1000 AND 9000" \
                "         AND ROUND((CLS_PRICE - START_PRICE)/START_PRICE * 100,1) BETWEEN 0 AND 30" \
                "       LIMIT 30" \
                "       ) td" \
                "    ON tl.stock_cd=td.stock_cd" \
                "   AND tl.stock_kind_cd = td.stock_kind_cd" \
                " WHERE 1=1" \
                " GROUP BY tl.stock_cd  ,tl.stock_kind_cd" \
                " ORDER BY td.volume DESC;"
    print("selectSql:"+selectSql)
    cursor.execute(selectSql)
    result=cursor.fetchall()
    return result

def selectAllStockList(cursor):
    # 종목코드 기준으로 tb_stock_daily_info 테이블에 적재된 max(일자) +1  값 , 현재 일자 조회
    selectSql = "SELECT tl.stock_cd" \
                "     , tl.stock_kind_cd" \
                "     , IFNULL(DATE_FORMAT(DATE_ADD(MAX(td.date), INTERVAL +1 DAY),'%Y%m%d'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -900 DAY), '%Y%m%d')) AS start_date" \
                "	  , DATE_FORMAT(CURDATE(), '%Y%m%d') AS end_date" \
                " FROM vw_stock_list tl" \
                " JOIN tb_stock_daily_info td" \
                "   ON tl.stock_cd=td.stock_cd" \
                "  AND tl.stock_kind_cd = td.stock_kind_cd" \
                " WHERE 1=1" \
                " GROUP BY tl.stock_cd  ,tl.stock_kind_cd" \
                " ;"
    print("selectSql:"+selectSql)
    cursor.execute(selectSql)
    result=cursor.fetchall()
    return result

def getHhmmStockinfo(stockCd, getStartDate , endDate):
    # 주식시간정보 임시저장
    stockHhmmInfo = []
    # 주식코드 저장
    # stockHhmmInfo.append(stockCd)

    # 차트 객체 구하기
    objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")

    # 0 - 종목코드(string): 주식(A003540), 업종(U001), ELW(J517016)의종목코드
    print("stockCd:"+stockCd)
    objStockChart.SetInputValue(0, stockCd)   # 종목 코드 - 삼성전자
    # objStockChart.SetInputValue(1, ord('2'))  # 개수로 조회
    # 1 - 요청구분(char):
    objStockChart.SetInputValue(1, ord('1'))    # '1':  기간 요청시  주,월,분,틱은 불가
                                                # '2': 갯수로 요청이고 분,틱 모드인 경우에는 요청 갯수 및 수신 갯수를 누적해서
                                                #      다음 데이터 요청을 체크해야 함.( 요청 갯수 <= 수신 갯수 비교하는 로직 추가)
    #2 요청종료일(ulong): YYYYMMDD형식으로데이터의마지막(가장최근) 날짜 Default(0) - 최근거래날짜
    objStockChart.SetInputValue(2, endDate) # endDate

    #3 - 요청시작일(ulong): YYYYMMDD형식으로데이터의시작(가장오래된) 날짜
    objStockChart.SetInputValue(3, getStartDate) #getStartDate or 20180111

    #4 - 요청개수(ulong): 요청할데이터의개수
    # objStockChart.SetInputValue(4, 100)  # 최근 100일 치

    #5 - 필드(long array): 필드 배열
    """
    필드값
    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 대비부호와동일
    """
    objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8, 9])  # 날짜,시간,시가,고가,저가,종가,거래량,거래대금

    #6 - 차트구분(char)
    """
    'D' 일
    'W' 주
    'M' 월
    'm' 분
    'T' 틱
    """
    objStockChart.SetInputValue(6, ord('m'))  # '차트 주가 - 일간 차트 요청
    objStockChart.SetInputValue(9, ord('1'))  # 수정주가 사용

    objStockChart.BlockRequest()

    numData = objStockChart.GetHeaderValue(3)
    numField = objStockChart.GetHeaderValue(1)

    # print("날짜","시간", "시가", "고가", "저가", "종가", "거래량", "거래금액")
    # print("==============================================-")
    if numData != 0:  # 상장폐지 종목 예외, 상장폐지 종목은 0 값을 받음
        for i in range(numData):
            tempValue=[(stockCd)]
            for j in range(numField):
                tempValue+=[(objStockChart.GetDataValue(j, i))]
            stockHhmmInfo.append(tempValue)
        # print(stockHhmmInfo)

    # for i in range(len):
    #     day = objStockChart.GetDataValue(0, i)
    #     hhmm = objStockChart.GetDataValue(1, i)
    #     open = objStockChart.GetDataValue(2, i)
    #     high = objStockChart.GetDataValue(3, i)
    #     low = objStockChart.GetDataValue(4, i)
    #     close = objStockChart.GetDataValue(5, i)
    #     vol = objStockChart.GetDataValue(6, i)
    #     amt = objStockChart.GetDataValue(7, i)
    #     # stockHhmmInfo.append(i)
    #     print(stockCd,day, hhmm,open, high, low, close, vol,amt)

        sql = "insert into tb_stock_hhmm_info(stock_cd,date,hhmm, start_price, high_price, low_price, cls_price, volume, total_trd_price) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.executemany(sql, stockHhmmInfo)
        # print(sql + "   적재완료")
        print(stockCd + "   적재완료")
        db.commit()

if __name__ == "__main__":
    now = datetime.datetime.now()
    for stockCd in selectAllStockList(cursor):
        if stockCd['start_date'] <= stockCd['end_date']:

         # 일 기준으로 데이터 적재
         # 변수  (종목코드, 종목부소속코드, DB에 적재된 MAX일자 +1, 기준이 되는 오늘일자 )
         getHhmmStockinfo(stockCd['stock_cd'], '20200605','20200605')
         # getHhmmStockinfo(stockCd['stock_cd'], stockCd['start_date'], stockCd['end_date'])

         # time.sleep(0.5)

    dbcon_synol.close(db)