프로젝트/비트코인 자동매매

원하는 보조지표만 한번에 조회하기 - 파이썬 업비트 비트코인 자동매매

Tech&Fin 2021. 11. 12. 12:18
반응형

예전에 각종 보조지표들을 한번에 조회하는 방법에 대해서 살펴 보았는데요.

 

보조지표를 구하기 위해서는 캔들 데이터가 필요하고 캔들 데이터는 업비트 API를 호출해야 하기 때문에 여러 보조 지표를 구하기 위해 반복해서 API를 호출하는 것을 피하기 위해 캔들을 조회하기 위한 API는 한 번만 호출하고 여러 보조 지표를 한번에 구하는 로직을 구현했었습니다.

 

하지만 해당 로직 역시 불필요한 보조지표까지 모두 계산을 하기 때문에 속도 측면에서 불리한 점을 발견하게 되어 이번 시간에는 원하는 보조지표만 한번의 API 호출로 계산하여 속도를 개선한 로직을 살펴 보려고 합니다.

 

과거에 포스팅한 보조지표 한번에 조회하는 방법은 아래 포스팅에서 확인하실 수 있습니다.

 

2021.08.10 - [프로젝트/비트코인 자동매매] - 보조 지표 한번에 구하기 - 파이썬 업비트 비트코인 자동매매

 

보조 지표 한번에 구하기 - 파이썬 업비트 비트코인 자동매매

지금까지 몇 차례에 걸쳐 업비트 API와 파이썬을 이용한 비트코인 자동매매 프로그램을 만드는데 사용하게 될 보조지표를 구하는 방법들을 개별적으로 살펴 보았습니다. 하지만 개별적으로 보

technfin.tistory.com

 

현재 테크앤핀에서 다루고 있는 비트코인 자동매매 프로그램 만들기에 대한 그 동안의 포스팅은 아래 카테고리에서 확인하실 수 있습니다.

 

https://technfin.tistory.com/category/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%20%EC%9E%90%EB%8F%99%EB%A7%A4%EB%A7%A4

 

'프로젝트/비트코인 자동매매' 카테고리의 글 목록

코딩&재테크 이야기

technfin.tistory.com

 

 

목차 - 클릭하면 이동합니다.

     

    원하는 보조지표 한번에 구하기

    공통모듈 - upbit.py

    # -----------------------------------------------------------------------------
    # - Name : get_indicator_sel
    # - Desc : 보조지표 조회(원하는 지표만)
    # - Input
    #   1) target_item : 대상 종목
    #   2) tick_kind : 캔들 종류 (1, 3, 5, 10, 15, 30, 60, 240 - 분, D-일, W-주, M-월)
    #   3) inq_range : 캔들 조회 범위
    #   4) loop_cnt : 지표 반복계산 횟수
    #   5) 보조지표 : 리스트
    # - Output
    #   1) 보조지표
    # -----------------------------------------------------------------------------
    def get_indicator_sel(target_item, tick_kind, inq_range, loop_cnt, indi_type):
        try:
    
            # 보조지표 리턴용
            indicator_data = {}
    
            # 캔들 데이터 조회용
            candle_datas = []
    
            # 캔들 추출
            candle_data = get_candle(target_item, tick_kind, inq_range)
    
            if len(candle_data) >= 30:
    
                # 조회 횟수별 candle 데이터 조합
                for i in range(0, int(loop_cnt)):
                    candle_datas.append(candle_data[i:int(len(candle_data))])
    
                if 'RSI' in indi_type:
                    # RSI 정보 조회
                    rsi_data = get_rsi(candle_datas)
                    indicator_data['RSI'] = rsi_data
    
                if 'MFI' in indi_type:
                    # MFI 정보 조회
                    mfi_data = get_mfi(candle_datas)
                    indicator_data['MFI'] = mfi_data
    
                if 'MACD' in indi_type:
                    # MACD 정보 조회
                    macd_data = get_macd(candle_datas, loop_cnt)
                    indicator_data['MACD'] = macd_data
    
                if 'BB' in indi_type:
                    # BB 정보 조회
                    bb_data = get_bb(candle_datas)
                    indicator_data['BB'] = bb_data
    
                if 'WILLIAMS' in indi_type:
                    # WILLIAMS %R 조회
                    williams_data = get_williams(candle_datas)
                    indicator_data['WILLIAMS'] = williams_data
    
                if 'MA' in indi_type:
                    # MA 정보 조회
                    ma_data = get_ma(candle_datas, loop_cnt)
                    indicator_data['MA'] = ma_data
    
                if 'CCI' in indi_type:
                    # CCI 정보 조회
                    cci_data = get_cci(candle_data, loop_cnt)
                    indicator_data['CCI'] = cci_data
    
                if 'CANDLE' in indi_type:
                    indicator_data['CANDLE'] = candle_data
    
            return indicator_data
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise

    기존 로직을 수정하여 원하는 보조지표명을 리스트 형태로 전달하면 해당 보조지표들만 계산하여 리턴하도록 수정하여 원하지 않는 보조지표는 계산하지 않아 속도 측면에서 개선이 되었습니다.

     

    반응형

     

    기존과 동일하게 캔들 데이터는 한번만 조회하기 때문에 업비트 API 호출은 한 번만 이루어 집니다.

     

    호출 방법

    import time
    import os
    import sys
    import logging
    import traceback
    import math
    
    from decimal import Decimal
    
    # 공통 모듈 Import
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    from module import upbit
    
    
    # -----------------------------------------------------------------------------
    # - Name : main
    # - Desc : 메인
    # -----------------------------------------------------------------------------
    if __name__ == '__main__':
    
        # noinspection PyBroadException
        try:
    
            upbit.set_loglevel('I')
    
            indicators = upbit.get_indicator_sel('KRW-DOGE', '60', 200, 5,['RSI', 'CANDLE'])
    
            # 보조지표 추출
            rsi_data = indicators['RSI']
            candles = indicators['CANDLE']
    
            logging.info(rsi_data)
            logging.info(candles)
    
        except KeyboardInterrupt:
                logging.error("KeyboardInterrupt Exception 발생!")
                logging.error(traceback.format_exc())
                sys.exit(-100)
    
        except Exception:
            logging.error("Exception 발생!")
            logging.error(traceback.format_exc())
            sys.exit(-200)
    indicators = upbit.get_indicator_sel('KRW-DOGE', '60', 200, 5,['RSI', 'CANDLE'])

    위와 같이 호출하면서 원하는 보조지표명을 리스트에 담아서 보내면 해당 보조지표만 계산하게 됩니다.

     

    마치며

    업비트 API는 호출 횟수에 제한이 있기 때문에 자주 호출하면 다른 프로그램에서 호출할 수 있는 기회가 없어지고 전반적으로 속도가 떨어지게 됩니다.

     

    120개 가량이 되는 모든 종목을 조회할 때는 더더욱 속도가 중요하기 때문에 기존 로직을 수정하여 속도를 조금 더 빠르게 개선하시면 좋을 것 같습니다.

     

    블로그를 구독해 주시면 소식을 조금 더 빨리 받아 보실 수 있습니다.

    반응형