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

잔고 정보 조회 - 파이썬 업비트 비트코인 자동매매

Tech&Fin 2021. 6. 24. 14:09
반응형

자동 매도 로직을 구현하기 위해서는 현재 보유하고 있는 종목의 잔고 정보를 알아야 하는데요. 이번 시간에는 보유종목에 대해 잔고 정보를 조회하는 로직에 대해서 살펴 보겠습니다.

 

매도 로직은 아래 포스트를 참고 부탁 드립니다.

 

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

 

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

지난 시간에 이어 이번에는 시장가 매도 로직에 대해서 살펴 보겠습니다. 공통모듈 만들기 및 시장가 매수 로직 관련은 아래 포스트를 참고 부탁 드립니다. 2021.06.06 - [프로젝트/비트코인 자동매

technfin.tistory.com

 

2021.06.17 - [프로젝트/비트코인 자동매매] - 지정가 매도 로직 - 파이썬 업비트 비트코인 자동매매

 

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

이번 시간에는 가격을 지정하여 매도하는 지정가 매도 로직에 대해서 살펴 보겠습니다. 관련된 로직으로 시장가 매수 및 매도 로직은 아래 포스트를 참고 부탁 드리겠습니다. 2021.06.09 - [프로젝

technfin.tistory.com

 

 

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

     

    잔고(계좌) 정보

    예를 들어 KRW 100원에 매수한 도지코인(KRW-DOGE)을 10% 수익 구간에서 자동 매도하고 싶은 경우 현재 보유하고 있는 도지 코인의 수량과 매수 평균 금액을 알아야 합니다.

     

    지금부터 살펴 볼 잔고를 조회하는 로직을 이용해 보유 수량 및 매수 평균 금액을 조회 할 수 있습니다.

     

    잔고 정보 조회 로직

    # -----------------------------------------------------------------------------
    # - Name : get_accounts
    # - Desc : 잔고정보 조회
    # - Input
    #   1) except_yn : KRW 및 소액 제외
    #   2) market_code : 마켓코드 추가(매도시 필요)
    # - Output
    #   1) 잔고 정보
    # -----------------------------------------------------------------------------
    # 계좌 조회
    def get_accounts(except_yn, market_code):
        try:
    
            rtn_data = []
    
            # 소액 제외 기준
            min_price = 5000
    
            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}
    
            res = send_request("GET", server_url + "/v1/accounts", "", headers)
            account_data = res.json()
    
            for account_data_for in account_data:
    
                # KRW 및 소액 제외
                if except_yn == "Y" or except_yn == "y":
                    if account_data_for['currency'] != "KRW" and Decimal(str(account_data_for['avg_buy_price'])) * (Decimal(str(account_data_for['balance'])) + Decimal(str(account_data_for['locked']))) >= Decimal(str(min_price)):
                        rtn_data.append(
                            {'market': market_code + '-' + account_data_for['currency'], 'balance': account_data_for['balance'],
                             'locked': account_data_for['locked'],
                             'avg_buy_price': account_data_for['avg_buy_price'],
                             'avg_buy_price_modified': account_data_for['avg_buy_price_modified']})
                else:
                    rtn_data.append(
                        {'market': market_code + '-' + account_data_for['currency'], 'balance': account_data_for['balance'],
                         'locked': account_data_for['locked'],
                         'avg_buy_price': account_data_for['avg_buy_price'],
                         'avg_buy_price_modified': account_data_for['avg_buy_price_modified']})
    
            return rtn_data
    
        # ----------------------------------------
        # Exception Raise
        # ----------------------------------------
        except Exception:
            raise

    입력 변수

    ① except_yn : Y 또는 N

    Y로 변수를 넘기면 KRW 잔액 및 소액(5,000원) 미만 보유 종목은 제외하고 조회 할 수 있습니다. 그 외에는 KRW 및 소액 보유 종목을 모두 리턴하게 됩니다.

     

    ② market_code : KRW, BTC, USDT 등 마켓코드

    잔고 정보에는 마켓 코드가 붙어있지 않습니다. 매도를 하기 위해서는 마켓 코드가 붙은 종목 코드(KRW-DOGE)가 필요하기 때문에 매도를 하려는 마켓 코드를 넘기면 코드를 붙여서 리턴하게 됩니다.

     

    조회 결과

    ① market : 마켓코드(ex. KRW-DOGE)

    ② balance : 잔고 수량
    ③ locked : 미체결 잔고 수량
    ④ avg_buy_price : 매수 평균가
    ⑤ avg_buy_price_modified : 사용자가 수정한 매수 평균가

     

    실제 보유 수량은 잔고 수량 + 미체결 잔고 수량입니다. 예를 들어 100개의 도지코인을 보유하고 있는데 30개는 매도를 걸어 아직 체결되지 않은 상태라면 잔고수량에 70ㅇ 조회되고 미체결 잔고수량에 30이 조회되게 됩니다.

     

    참고 사항

    간혹 에어드랍을 받아 소액의 잔고를 보유한 종목이 있을 수 있기 때문에 소액 종목을 제외하는 금액을 min_price = 5000으로 설정하였습니다.

     

    모듈 호출

    import os
    import sys
    import logging
    import traceback
    
    # 공통 모듈 Import
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    from lib import upbit as upbit  # noqa
    
    # -----------------------------------------------------------------------------
    # - 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!
            # ---------------------------------------------------------------------
            # 잔고 조회(KRW, 소액 제외)
            account_data = upbit.get_accounts("Y", "KRW")
    
            for account_data_for in account_data:
                logging.info(account_data_for)
    
            logging.info('')
    
            # 잔고 조회(KRW, 소액 포함)
            account_data = upbit.get_accounts("N", "KRW")
    
            for account_data_for in account_data:
                logging.info(account_data_for)
    
        except KeyboardInterrupt:
            logging.error("KeyboardInterrupt Exception 발생!")
            logging.error(traceback.format_exc())
            sys.exit(1)
    
        except Exception:
            logging.error("Exception 발생!")
            logging.error(traceback.format_exc())
            sys.exit(1)

    공통 모듈에 로직을 작성하고 아래와 같이 호출하면 결과를 받을 수 있습니다.

     

    # 잔고 조회(KRW, 소액 제외)

    account_data = upbit.get_accounts("Y", "KRW")

     

    # 잔고 조회(KRW, 소액 포함)
    account_data = upbit.get_accounts("N", "KRW")

     

    실행 결과

    ① KRW 및 소액을 제외한 종목 2개가 조회 되었습니다.

    ② KRW 및 소액 종목인 WIN, VTHO가 포함된 총 5개 잔고 정보가 조회 되었습니다.

    반응형