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

KRW 원화 잔고 조회 - 파이썬 업비트 비트코인 자동매매

Tech&Fin 2021. 7. 7. 16:55
반응형

종목을 매수할 때 원하는 금액을 입력하여 매수할 수도 있지만 현재 보유하고 있는 원화 잔고 전부를 사용하여 매수를 하고자 할 때도 있습니다.

 

이번 시간에는 현재 KRW 잔고 정보를 조회하여 수수료를 제외하고 실제 매수 가능한 최대 금액을 구하는 방법에 대해서 살펴 보겠습니다.

 

함께 사용할 수 있는 시장가 매수 로직은 아래 포스트를 참고 부탁 드립니다.

 

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

 

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

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

technfin.tistory.com

 

 

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

     

    원화(KRW) 잔고 정보

    현재 업비트 기준 원화 마켓 일반 거래 매수/매도 수수료는 0.05% 입니다. 예약 매수/매도는 수수료가 더 비싸고 BTC 마켓 등 다른 마켓의 수수료 역시 원화(KRW) 마켓과는 차이가 있으니 적용전에 수수료 체계를 확인해 보시는 것이 좋습니다.

     

    원화 잔고 정보 조회 로직

    # -----------------------------------------------------------------------------
    # - Name : get_krwbal
    # - Desc : KRW 잔고 조회
    # - Input
    # - Output
    #   1) KRW 잔고 Dictionary
    #     1. krw_balance : KRW 잔고
    #     2. fee : 수수료
    #     3. available_krw : 매수가능 KRW잔고(수수료를 고려한 금액)
    # -----------------------------------------------------------------------------
    def get_krwbal():
        try:
    
            # 잔고 리턴용
            rtn_balance = {}
    
            # 수수료 0.05%(업비트 기준)
            fee_rate = 0.05
    
            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)
    
            data = res.json()
    
            for dataFor in data:
                if (dataFor['currency']) == "KRW":
                    krw_balance = math.floor(Decimal(str(dataFor['balance'])))
    
            # 잔고가 있는 경우만
            if Decimal(str(krw_balance)) > Decimal(str(0)):
                # 수수료
                fee = math.ceil(Decimal(str(krw_balance)) * (Decimal(str(fee_rate)) / Decimal(str(100))))
    
                # 매수가능금액
                available_krw = math.floor(Decimal(str(krw_balance)) - Decimal(str(fee)))
    
            else:
                # 수수료
                fee = 0
    
                # 매수가능금액
                available_krw = 0
    
            # 결과 조립
            rtn_balance['krw_balance'] = krw_balance
            rtn_balance['fee'] = fee
            rtn_balance['available_krw'] = available_krw
    
            return rtn_balance
    
        # ----------------------------------------
        # Exception Raise
        # ----------------------------------------
        except Exception:
            raise

    조회 결과

    별도의 입력 변수는 없으며 함수를 호출하게 되면 아래 정보를 리턴하게 됩니다.

     

    ① krw_balance : 보유하고 있는 원화(KRW) 금액

    ② fee : 수수료 금액

    ③ available_krw : 수수료를 제외한 매수 가능 원화(KRW) 금액

     

    참고 사항

    단수 차이로 인해 1원 정도의 차이는 있을 수 있으며 앞서 말씀 드린바와 같이 매수/매도 방법이나 마켓에 따라서 수수료 체계가 다를 수 있으니 해당 부분에 대한 확인이 필요합니다.

     

    모듈 호출

    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, 소액 제외)
            krw_balance = upbit.get_krwbal()
    
            logging.info(krw_balance)
    
        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_balance : 777,783원

    ② fee : 389

    ③ available_krw : 777,394원

     

    위와 같이 수수료 389원을 제외한 매수 가능 최대 원화(KRW) 금액인 777,394원이 조회 되었습니다.

    반응형