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

코인 자동매매 프로그램 샘플 예제 - 파이썬 업비트 비트코인 자동매매

Tech&Fin 2021. 9. 7. 17:37
반응형

지금까지 비트코인 자동매매 프로그램을 작성하기 위해 여러가지 지표를 구하는 모듈이나 매수/매도 로직을 살펴 보았는데요.

 

이번 시간에는 해당 로직들을 이용하여 24시간 매수/매도를 진행하는 프로그램을 아주 간단하게 만들어 볼 예정입니다. 

 

오늘 살펴볼 로직은 수익을 내는 로직이 아닙니다. 아주 단순하게 RSI 지표만을 이용하여 반복적으로 매수/매도를 실행하는 로직입니다.

대략적인 프로그램 구조만 활용하시고 실제로 매수/매도에 사용하시기 전에는 본인이 세운 전략에 맞게 매수/매도 시점을 구현하여야 합니다.

본 블로그에서 제공되는 내용은 완벽하지 않기 때문에 실제 매수/매도 시 발생할 수 있는 부분에 대해서는 책임지지 않습니다. 이 점 주의하셔서 실제 매매시 유의 하시기 바랍니다.

 

각종 지표를 구하는 로직을 아직 확인하지 못하셨다면 아래 링크를 통해 확인하실 수 있습니다.

 

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

 

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

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

technfin.tistory.com

 

 

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

     

    RSI 지표를 이용한 자동매매 프로그램 샘플

    오늘 알아볼 주된 내용은 원하는 시점에 자동으로 매수를 하고 매수후에는 자동으로 매도를 하여 24시간 신경을 쓰지 않아도 프로그램이 자동으로 매수/매도를 반복하는 것 입니다.

     

    하지만 업비트 API는 가끔 알수 없는 오류를 발생 시킬 수 있고 해당 경우에 파이썬 프로그램은 오류로 인해 종료되기 때문에 24시간 가동은 어려울 수도 있습니다.

     

    업비트의 오류는 우리가 해결할 수 없는 문제이기 때문에 파이썬에서 프로그램이 오류로 종료되더라도 다시 실행 되도록 하는 방법밖에 없는데 이 부분에 대해서는 여러가지 아이디어가 있을 수 있으니 차차 다루어 보도록 하겠습니다.

     

    오늘 알아볼 내용은 아주 간단한 샘플 프로그램으로 전체 종목을 모니터링 중에 RSI 지표가 입력된 값 미만으로 떨어지면 매수하고 매수 후에는 매수된 종목을 모니터링 하다가 RSI 지표가 입력된 값을 초과하면 매도하는 로직입니다.

     

    해당 방법으로 계속해서 프로그램을 강제 종료하기 전까지 매수/매도를 반복하게 됩니다.

     

    업비트 API를 이용한 자동매매 프로그램 샘플

    import time
    import os
    import sys
    import logging
    import math
    import traceback
    
    from decimal import Decimal
    
    # 공통 모듈 Import
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    from lib import upbit as upbit  # noqa
    
    
    # -----------------------------------------------------------------------------
    # - Name : start_selltrade
    # - Desc : 매도 로직
    # - Input
    # 1) target_item : 대상 종목
    # 2) rsi_sell_value : 매도 기준 RSI 값
    # 3) rsi_buy_value : 매수 기준 RSI 값
    # 4) buy_amt : 매수 금액
    # -----------------------------------------------------------------------------
    def start_selltrade(target_item, rsi_sell_valuel, rsi_buy_value, buy_amt):
        try:
    
            # 매도 될때까지 반복
            while True:
    
                logging.info('매도 로직 가동중...')
    
                # 해당 종목의 RSI 지표 산출
                # 1. 10분봉 기준 RSI 지표 산출
                rsi_data = upbit.get_indicators(target_item, '10', 200, 5)
    
                # RSI 값이 기준값을 초과하면 매도
                if Decimal(rsi_data[0][0]['RSI']) > Decimal(rsi_sell_value):
    
                    # 기준 충족 종목 RSI 데이터
                    logging.info(rsi_data)
    
                    # 시장가 매도
                    logging.info('시장가 매도 시작!')
                    #upbit.sellcoin_mp(target_item, 'Y')
    
                    # 매도 시간 처리 고려
                    time.sleep(3)
    
                    # 다시 매수 로직 시작
                    start_buytrade(rsi_buy_value, rsi_sell_value, buy_amt)
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise
    
    
    # -----------------------------------------------------------------------------
    # - Name : start_buytrade
    # - Desc : 매수 로직
    # - Input
    # 1) rsi_buy_value : 매수 기준 RSI 값
    # 2) rsi_sell_value : 매도 기준 RSI 값
    # 3) buy_amt : 매수금액
    # -----------------------------------------------------------------------------
    def start_buytrade(rsi_buy_value, rsi_sell_value, buy_amt):
        try:
    
            data_cnt = 0
    
            # 매수 될 때까지 반복 수행
            while True:
    
                # 전체 종목 추출
                # 1. KRW마켓
                # 2. BTC, ETH 제외
                item_list = upbit.get_items('KRW', 'BTC,ETH')
    
                # 전체 종목 반복
                for item_list_for in item_list:
    
                    # 해당 종목의 RSI 지표 산출
                    # 1. 10분봉 기준 RSI 지표 산출
                    rsi_data = upbit.get_indicators(item_list_for['market'], '10', 200, 5)
    
                    # RSI 값이 기준값 미만으로 떨어지면 매수
                    if Decimal(rsi_data[0][0]['RSI']) < Decimal(rsi_buy_value):
    
                        # 기준 충족 종목 로깅
                        logging.info(item_list_for)
    
                        # 기준 충족 종목 RSI 데이터
                        logging.info(rsi_data)
    
                        # 시장가 매수
                        logging.info('시장가 매수 시작!')
                        #upbit.buycoin_mp(item_list_for['market'], buy_amt)
    
                        # 매수 시간 처리 고려
                        time.sleep(3)
    
                        # 매도 로직 호출
                        start_selltrade(item_list_for['market'], rsi_sell_value, rsi_buy_value, buy_amt)
    
                    if data_cnt == 0 or data_cnt % 100 == 0:
                        logging.info("매수 로직 가동중...[" + str(data_cnt) + "]")
    
                    # 조회건수증가
                    data_cnt = data_cnt + 1
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise
    
    
    # -----------------------------------------------------------------------------
    # - Name : main
    # - Desc : 메인
    # -----------------------------------------------------------------------------
    if __name__ == '__main__':
    
        # noinspection PyBroadException
        try:
    
            print("***** USAGE ******")
            print("[1] 로그레벨(D:DEBUG, E:ERROR, 그외:INFO)")
    
            # 로그레벨(D:DEBUG, E:ERROR, 그외:INFO)
            upbit.set_loglevel('I')
    
            # ---------------------------------------------------------------------
            # Logic Start!
            # ---------------------------------------------------------------------
            rsi_buy_value = input("매수 기준 RSI 값(ex. 30):")
            rsi_sell_value = input("매도 기준 RSI 값(ex. 70):")
            buy_amt = input("매수금액(ex:10000):")
    
            logging.info("매수 기준 RSI 값:" + str(rsi_buy_value))
            logging.info("매도 기준 RSI 값:" + str(rsi_sell_value))
            logging.info("매수금액:" + str(buy_amt))
    
            # 매수로직 시작
            start_buytrade(rsi_buy_value, rsi_sell_value, buy_amt)
    
        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)

    ① 매수 기준 RSI 값

    ② 매도 기준 RSI 값

    ③ 매수 금액

     

    프로그램을 실행하면 위의 값을 입력 받도록 되어 있고 원하는 값을 입력하면 자동매매 프로그램이 시작됩니다.

     

    이후 매수 기준 RSI값에 도달하는 종목이 생기면 시장가 매수를 입력된 금액만큼 하게되고 매수 후에는 매도 로직이 가동 됩니다.

     

    매수한 종목이 매도 기준 RSI값에 도달하는 경우 시장가 매도 처리를 하고 다시 매수 로직이 가동 됩니다.

     

    ※ 실제 매수/매도가 일어날 수 있기 때문에 시장가 매수/매도를 호출하는 부분은 일단 주석처리 해 두었으니 필요하신 경우 주석을 풀고 사용하시면 될 것 같습니다.

     

    ※ 위의 프로그램 만으로는 동작하지 않습니다. 지금까지 알아본 로직들을 공통 모듈에 만들어야 동작합니다. 관련된 내용은 이전 포스트들에서 다루었으니 처음부터 블로그를 천천히 살펴 보시면서 공통 모듈 구조를 만들고 필요한 로직을 넣으시면 될 것 같습니다.

     

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

    반응형