ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CREON PLUS API 활용] 종목별 기관/외국인/개인 매수 수량/금액 조회
    개발/파이썬 2018.09.29 17:05

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    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(16)  # 일자별
            self.objRq.SetInputValue(4, ord('0'))  # '0' 순매수 '1' 매매비중
            self.objRq.SetInputValue(50)  # '전체
     
        # 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)
     
    cs


    조회 결과 




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

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

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

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


    댓글 0

Designed by black7375.