본문 바로가기

Dot Programming/Python

[Python] 크레온 API를 통한 주식 자동화 프로그램 만들기 (OS : Window)

해당 프로젝트는 크레온 API가 오직 Windows에서만 작동하기 때문에 Windows OS에서 작업한다

     

     

    1. python 설치하기

    설치하러 가기

     

    Python Releases for Windows

    The official home of the Python Programming Language

    www.python.org

     

    1) 64bit는 크레온 API가 작동하지 않기 때문에 32bit로 다시 다운받아줘야 한다

     

    python 3.8.6 windows 버전으로 설치

     

     

    2) 설치에 나오는 것 모든 것을 다 체크해주고 설치가 완료되면 제어판 > 시스템 > 고급 시스템 설정 > 환경 변수에서 python이 변수로 설정되었는지 확인해준다

     

    환경변수

     

     

    3) 그리고 python폴더에 들어가서 python.exepythonw.exe 설정 > 호환성 > 관리자 권한으로 이 프로그램 실행 부분을 체크해준다.

    권리자 권한 실행 체크

     

     

    4) cmd에서 python을 입력하면 python.exe가 실행되면 설치 성공!

     

     

     

     

    2. VS Code로 py 실행

    1) VScode에서 /stockauto 폴더를 생성하여 실행한 다음 terminal(cmd)을 열어 라이브러리를 설치해준다

    $ pip install pywinauto

    → pywinauto는 윈도우 작업을 자동화하는 파이썬 라이브러리이다.

     

    2) test.py 파일을 생성한다

    그러면 아래와 같은 알림이 뜨는데 이는 VS Code에서 지원하는 python 확장 프로그램으로 install을 클릭하여 설치한다 (juptyer도 설치)

     

    jupyter를 실행시켜 (ctrl+shift+p) > python select interpreter를 선택한 후 이번에 설치한 v3.8.6 32bit를 선택해준다.

     

    그럼 vscode하단에 해당 버전이 설정되었다는 것을 확인시켜준다.

     

     

    3. 크레온API로 주식 투자 코드짜보기

    크레온 API 자료실

     

    크레온플러스자료실 - 크레온

     

    money2.creontrade.com

    사전으로 대신증권 크레온 앱 다운 > 크레온 비대면 계좌 개설 > 윈도우에 크레온 HTS 다운을 실행해줘야 한다.

     

    힘들게 고생하지말고 API 복붙하면 간단하다. 

     

    종목리스트 구하기 코드

    import win32com.client
     
    # 연결 여부 체크
    objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
    bConnect = objCpCybos.IsConnect
    if (bConnect == 0):
        print("PLUS가 정상적으로 연결되지 않음. ")
        exit()
     
    # 종목코드 리스트 구하기
    objCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
    codeList = objCpCodeMgr.GetStockListByMarket(1) #거래소
    codeList2 = objCpCodeMgr.GetStockListByMarket(2) #코스닥
     
     
    print("거래소 종목코드", len(codeList))
    for i, code in enumerate(codeList):
        secondCode = objCpCodeMgr.GetStockSectionKind(code)
        name = objCpCodeMgr.CodeToName(code)
        stdPrice = objCpCodeMgr.GetStockStdPrice(code)
        print(i, code, secondCode, stdPrice, name)
     
    print("코스닥 종목코드", len(codeList2))
    for i, code in enumerate(codeList2):
        secondCode = objCpCodeMgr.GetStockSectionKind(code)
        name = objCpCodeMgr.CodeToName(code)
        stdPrice = objCpCodeMgr.GetStockStdPrice(code)
        print(i, code, secondCode, stdPrice, name)
     
    print("거래소 + 코스닥 종목코드 ",len(codeList) + len(codeList2))

     

    $python test.py

    (크레온Plus가 로그인 되어있는 상태에서 실행)

     

    실행결과

     

     

     

    4. 주가 Slack 알림 봇 만들기

    1) api.slack.com 에서 stock-bot을 만든 후 자신의 채널에 추가해준다.

     

     

     

    python프로젝트 폴더에 slacker 라이브러리를 설치한다 (link)

    $ pip install slacker

    슬랙의 정책 업데이트가 있어서 위의 라이브러리는 더이상 사용하지 못한다

    (api.slack.com/changelog/2021-02-24-how-we-broke-your-slack-app)

     

    2) 그래서 대신 requests 라이브러리를 설치한다.

    $ pip install requests

     

    3)requests를 활용하여 slacker의 기능을 하는 아래의 코드를 복붙한다.

    post_message의 첫 번째 인자 myToken에는 slack에서 제공한 oauth토큰을 넣어주고

    두번째에는 채널 이름, 세 번째에는 보낼 메세지를 입력한다.

    slackbot.py

    import requests
     
    def post_message(token, channel, text):
        response = requests.post("https://slack.com/api/chat.postMessage",
            headers={"Authorization": "Bearer "+token},
            data={"channel": channel,"text": text}
        )
        print(response)
     
    myToken = "xoxb-123*****"
     
    post_message(myToken,"#stock","jocoding")
    

     

    4) 실행하면 아래와 같이 slack에 메세지가 전달된다.

    $python slackbot.py

     

    slack화면

     

     

    이제 저 세 번째 인자 메세지에 다른 정보를 입력하면  slack을 통해 주가를 확인할 수 있게 된다.

     

    크레온Plus API에서 '주식 현재가 조회' 코드를 가져와 적용하면 아래와 같다.

    import win32com.client
     
    # 연결 여부 체크
    objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
    bConnect = objCpCybos.IsConnect
    if (bConnect == 0):
        print("PLUS가 정상적으로 연결되지 않음. ")
        exit()
     
    # 현재가 객체 구하기
    objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
    objStockMst.SetInputValue(0, 'A005930')   #종목 코드 - 삼성전자
    objStockMst.BlockRequest()
     
    # 현재가 통신 및 통신 에러 처리 
    rqStatus = objStockMst.GetDibStatus()
    rqRet = objStockMst.GetDibMsg1()
    print("통신상태", rqStatus, rqRet)
    if rqStatus != 0:
        exit()
     
    # 현재가 정보 조회
    offer = objStockMst.GetHeaderValue(16)  #매도호가
    
    
    import requests
     
    def post_message(token, channel, text):
        response = requests.post("https://slack.com/api/chat.postMessage",
            headers={"Authorization": "Bearer "+token},
            data={"channel": channel,"text": text}
        )
        print(response)
     
    myToken = "xoxb-1816391606471-1837334229092-qyNvyhx6plJMTV8HDVLulHcg"
     
    post_message(myToken,"#stock","삼성 주가: "+ str(offer))
    

     

     


    ※ 출처

    조코딩님 유튜브