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

파이썬 업비트 비트코인 자동매매 - 시장가 매도 로직

Tech&Fin 2021. 6. 9. 23:58
반응형

지난 시간에 이어 이번에는 시장가 매도 로직에 대해서 살펴 보겠습니다.

 

공통모듈 만들기 및 시장가 매수 로직 관련은 아래 포스트를 참고 부탁 드립니다.

 

2021.06.06 - [프로젝트/비트코인 자동매매] - 비트코인 자동매매 - 프로젝트 구조 만들기

 

비트코인 자동매매 - 프로젝트 구조 만들기

이번 시간에는 본격적으로 로직을 만들고 살을 붙이기 전에 프로젝트 구조를 만들어 보도록 하겠습니다. 비트코인 자동매매 프로그램을 만드는 것이 얼마나 간단한지는 아래 포

technfin.tistory.com

 

2021.06.09 - [프로젝트/비트코인 자동매매] - 파이썬 업비트 비트코인 자동매매 - 시장가 매수 로직

 

파이썬 업비트 비트코인 자동매매 - 시장가 매수 로직

지난 시간에 공통적인 모듈을 이용해서 전체적인 프로젝트 구조를 만드는 방법에 대해서 살펴 보았는데요. 앞으로 공통 모듈에 여러가지 기능들을 심어갈 예정입니다. 이번 시간에는 시장가 매

technfin.tistory.com

 

 

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

     

    시장가 매도

    시장가 매수와 마찬가지로 원하는 수량을 호가에 매도하는 방법입니다. 빠르게 매도할 수 있지만 낮은 가격에 매도 될 수 있다는 단점이 있기 때문에 적절한 상황에 사용해야 합니다.

     

    잔고 수량 조회 로직

    시장가 매도를 하려면 잔고 수량을 알아야 합니다. 물론 직접 원하는 매도 수량을 입력할 수도 있지만 보통은 잔고 수량을 조회한 후에 전량 매도 또는 부분 매도를 할 수 있습니다.

     

    # -----------------------------------------------------------------------------
    # - Name : get_balance
    # - Desc : 주문가능 잔고 조회
    # - Input
    #   1) target_item : 대상 종목
    # - Output
    #   2) rtn_balance : 주문가능 잔고
    # -----------------------------------------------------------------------------
    def get_balance(target_item):
        try:
    
            # 주문가능 잔고 리턴용
            rtn_balance = 0
    
            # 최대 재시도 횟수
            max_cnt = 0
    
            payload = {
                'access_key': access_key,
                'nonce': str(uuid.uuid4()),
            }
    
            jwt_token = jwt.encode(payload, secret_key)
            authorize_token = 'Bearer {}'.format(jwt_token)
            headers = {"Authorization": authorize_token}
    
            # 잔고가 조회 될 때까지 반복
            while True:
    
                # 조회 회수 증가
                max_cnt = max_cnt + 1
    
                res = send_request("GET", server_url + "/v1/accounts", "", headers)
                my_asset = res.json()
    
                # 해당 종목에 대한 잔고 조회
                # 잔고는 마켓에 상관없이 전체 잔고가 조회됨
                for myasset_for in my_asset:
                    if myasset_for['currency'] == target_item.split('-')[1]:
                        rtn_balance = myasset_for['balance']
    
                # 잔고가 0 이상일때까지 반복
                if Decimal(str(rtn_balance)) > Decimal(str(0)):
                    break
    
                # 최대 100회 수행
                if max_cnt > 100:
                    break
    
                logging.info("[주문가능 잔고 리턴용] 요청 재처리중...")
    
            return rtn_balance
    
        # ----------------------------------------
        # Exception Raise
        # ----------------------------------------
        except Exception:
            raise

    종목코드를 넘기면 해당 종목에 대해서 보유하고 있는 수량을 리턴합니다.

     

    잔고는 마켓과는 상관없이 종목에 대한 잔고로 통합되어 있습니다. 예를들어 KRW와 BTC마켓에 모두 존재하는 도지코인을 KRW 마켓에서 1개, BTC 마켓에서 매수했다고 한다면 잔고는 DOGE라는 코드로 2개가 조회 됩니다. 해당 수량은 어떤 마켓에서도 매도를 할 수 있습니다.

     

    시장가 매도 로직

    시장가 매도 로직 역시 공통 모듈에 작성하면 필요한 곳에서 쉽게 호출하여 사용하실 수 있습니다.

     

    # -----------------------------------------------------------------------------
    # - Name : sellcoin_mp
    # - Desc : 시장가 매도
    # - Input
    #   1) target_item : 대상종목
    # - Output
    #   1) rtn_data : 매도결과
    # -----------------------------------------------------------------------------
    # 시장가 매도
    def sellcoin_mp(target_item):
        try:
    
            # 잔고 조회
            cur_balance = get_balance(target_item)
    
            query = {
                'market': target_item,
                'side': 'ask',
                'volume': cur_balance,
                'ord_type': 'market',
            }
    
            query_string = urlencode(query).encode()
    
            m = hashlib.sha512()
            m.update(query_string)
            query_hash = m.hexdigest()
    
            payload = {
                'access_key': access_key,
                'nonce': str(uuid.uuid4()),
                'query_hash': query_hash,
                'query_hash_alg': 'SHA512',
            }
    
            jwt_token = jwt.encode(payload, secret_key)
            authorize_token = 'Bearer {}'.format(jwt_token)
            headers = {"Authorization": authorize_token}
    
            res = send_request("POST", server_url + "/v1/orders", query, headers)
            rtn_data = res.json()
    
            logging.info("")
            logging.info("----------------------------------------------")
            logging.info("시장가 매도 완료!")
            logging.info(rtn_data)
            logging.info("----------------------------------------------")
    
            return rtn_data
    
        # ----------------------------------------
        # Exception Raise
        # ----------------------------------------
        except Exception:
            raise

    매도 대상 종목코드를 변수로 넘기면 현재 잔고 수량을 조회한 후에 전량 시장가 매도하게 됩니다.

     

    다음 시간에는 지정가 매도에 대해서 살펴 보도록 하겠습니다.

    반응형