본문 바로가기
개발/파이썬

[CREON PLUS API 활용] 종목별 기관/외국인/개인 매수 수량/금액 조회

by esstory 2018. 9. 29.

크레온 플러스(CREON PLUS) 를 이용해서 종목별 기관/외국인/개인 매수 수량/금액을 조회하는 간단한 샘플입니다 


import sys
# from PyQt5.QtWidgets import *
import win32com.client
import ctypes
import time
 
###############################################
# PLUS 공통 OBJECT
g_objCodeMgr = win32com.client.Dispatch('CpUtil.CpCodeMgr')
g_objCpStatus = win32com.client.Dispatch('CpUtil.CpCybos')
g_objCpTrade = win32com.client.Dispatch('CpTrade.CpTdUtil')
 
g_objFutureMgr = win32com.client.Dispatch('CpUtil.CpFutureCode')
 
 
################################################
# PLUS 실행 기본 체크 함수
# type - 0 : 주문 아님 1: 주문 포함
def InitPlusCheck(type):
    # 프로세스가 관리자 권한으로 실행 여부
    if ctypes.windll.shell32.IsUserAnAdmin():
        print('정상: 관리자권한으로 실행된 프로세스입니다.')
    else:
        print('오류: 일반권한으로 실행됨. 관리자 권한으로 실행해 주세요')
        return False
 
    # 연결 여부 체크
    if (g_objCpStatus.IsConnect == 0):
        print("PLUS가 정상적으로 연결되지 않음. ")
        return False
 
    #주문 관련 초기화
    if type == 1 :
        if (g_objCpTrade.TradeInit(0) != 0):
            print("주문 초기화 실패")
            return False
 
    return True
 
# 통신 제한 회피를 위한 대기 함수
# type 0 - 주문 관련 제한 1 - 시세 관련 제한
def waitRqLimit(type):
    remainCount = g_objCpStatus.GetLimitRemainCount(type)
 
    if remainCount > 0:
        return True
 
    remainTime = g_objCpStatus.LimitRequestRemainTime
    print('조회 제한 회피 time wait %.2f초 ' % (remainTime / 1000.0))
    time.sleep(remainTime / 1000)
    return True
 
 
class CpRp7254:
    def __init__(self):
        self.objRq = win32com.client.Dispatch('CpSysDib.CpSvr7254')
        self.objRq.SetInputValue(1, 6)  # 일자별
        self.objRq.SetInputValue(4, ord('0'))  # '0' 순매수 '1' 매매비중
        self.objRq.SetInputValue(5, 0)  # '전체
 
    # in_NumOrMoney '1' 순매수량 '2' 추정금액(백만)
    def Request(self, code, rqCnt, in_NumOrMoney):
        self.objRq.SetInputValue(0, code)
        self.objRq.SetInputValue(6, in_NumOrMoney)  # '1' 순매수량 '2' 추정금액(백만)
 
        ret7254 = []
 
        while True:
            # 조회 제한 체크 - 시세 연속 조회 제한회피를 위한 sleep
            waitRqLimit(1)
            self.objRq.BlockRequest()
            # 현재가 통신 및 통신 에러 처리
            rqStatus = self.objRq.GetDibStatus()
            if rqStatus != 0:
                return (False, ret7254)
 
            cnt = self.objRq.GetHeaderValue(1)
 
            for i in range(cnt):
                item = {}
                fixed = self.objRq.GetDataValue(18, i)
                # 잠정치는 일단 버린다
                if (fixed == ord('0')):
                    continue
 
                item['거래량'] = self.objRq.GetDataValue(17, i)
                item['일자'] = self.objRq.GetDataValue(0, i)
                item['종가'] = self.objRq.GetDataValue(14, i)
                item['개인'] = self.objRq.GetDataValue(1, i)
                item['외국인'] = self.objRq.GetDataValue(2, i)
                item['기관'] = self.objRq.GetDataValue(3, i)
                item['대비율'] = self.objRq.GetDataValue(16, i)
                ret7254.append(item)
 
                if (len(ret7254) >= rqCnt):
                    break
                #end of for
 
            # 연속 조회 가능 체크
            if self.objRq.Continue == False:
                break
            # 데이터 개수 확인
            if (len(ret7254) >= rqCnt):
                break
            #end of while
 
 
        return (True, ret7254)
 
if __name__ == "__main__":
    if False == InitPlusCheck(0):
        exit(0)
 
 
    obj7254 = CpRp7254()
 
    ret, ret7254 = obj7254.Request('A005930', 100, ord('1'))
 
    if ret == False:
        print('7254 요청 실패')
        exit(0)
 
    for item in ret7254:
        print(item)


조회 결과 




  • CpSysDib.CpSvr7254 : 크레온 플러스 조회 서비스 (링크 클릭 시 도움말 연결)

  • InitPlusCheck() : 크레온 플러스를 실행하기 위한 기본 조건 체크 (관리자 권한 여부, plus 실행 여부 등 체크)

  • waitRqLimit() : 시세 연속 조회 제한 회피를 위한 타이머 체크 코드

  • class CpRp7254 : 투자주체별 매매 현황 조회하는 클래스로 실제 통신 코드는 Request() 함수 참고


댓글