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

미체결 주문 조회 - 파이썬 업비트 비트코인 자동매매

Tech&Fin 2021. 7. 8. 11:12
반응형

지정가 매수/매도를 걸어놓은 경우에 아직 지정가에 도달하지 않은 경우 미체결 주문으로 남아있어 주문한 수량 만큼이 묶여서 다른 주문을 할 수 없게 됩니다.

 

이번 시간에는 아직 지정가에 도달하지 않아 체결 되지 않은 미체결 주문에 대해 조회하는 방법에 대해서 살펴 보려고 합니다.

 

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

 

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

 

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

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

technfin.tistory.com

 

 

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

     

    미체결 주문

    앞서 설명 드린바와 같이 지정가 매수/매도를 요청하게 되면 해당 지정가에 도달하기 전까지 수량이 묶이게 됩니다.

     

    원화 마켓에서 현재 원화(KRW) 잔고가 100만원 있다고 가정할 때 도지코인이 현재 250원인 상태에서 200원에 50만원을 지정가 매수 요청하게 되면 도지코인이 200원까지 떨어질때까지 매수가 이루어지지 않으며 해당 주문은 미체결 상태로 남아 있게 됩니다.

     

    그렇게 되면 원화 잔고 중 미체결 주문으로 남아있는 50만원은 Locked 상태로 묶이게 되어 다른 종목을 매수하기 위해서는 나머지 50만원만 사용이 가능하게 됩니다.

     

    만약 이러한 상태에서 이더리움을 100만원 구매하려고 한다면 해당 미체결 주문을 먼저 취소해야 하며 그러기 위해서는 묶여있는 미체결 주문을 먼저 조회해야 합니다.

     

    미체결 주문 조회 로직

    # -----------------------------------------------------------------------------
    # - Name : get_order
    # - Desc : 미체결 주문 조회
    # - Input
    #   1) target_item : 대상종목
    # - Output
    #   1) 미체결 주문 내역
    # -----------------------------------------------------------------------------
    def get_order(target_item):
        try:
            query = {
                'market': target_item,
                'state': 'wait',
            }
    
            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("GET", server_url + "/v1/orders", query, headers)
            rtn_data = res.json()
    
            return rtn_data
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise

     

    입력 변수

    ① target_item : 미체결 주문을 조회하기 위한 종목 코드

     

    조회 결과

    미체결 주문을 조회하게 되면 여러가지 데이터가 리턴되는데 그 중 아래 결과를 주로 사용하게 됩니다.

     

    ① uuid : 주문 고유 ID - 추후 주문 취소를 할 때 필요함

    ② side : 매수(bid) / 매도(ask) 구분

    ③ price : 지정한 가격 

    ④ market : 종목 코드

    ⑤ volume : 수량

    ⑥ remaining_volume : 미체결 수량

    ⑦ reserved_fee : 수수료

    ⑧ remaining_fee : 남은 수수료

    ⑨ locked : 묶여있는 금액(수수료 포함)

     

    참고 사항

    지정가 거래의 경우 해당 가격에 도달 하더라도 수량이 부족하면 여러번에 걸쳐 거래가 체결 될 수 있거나 일부만 체결 될 수 있기 때문에 ⑥ 미체결 수량 및 ⑧ 남은 수수료와 같은 항목이 발생할 수 있습니다.

     

    모듈 호출

    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!
            # ---------------------------------------------------------------------
            # 미체결 주문 조회
            locked_trade = upbit.get_order('KRW-DOGE')
    
            logging.info(locked_trade)
    
        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)

    공통 모듈에 작성 한 후 필요한 곳에서 아래와 같이 종목코드를 입력하여 호출할 수 있습니다.

     

    # 미체결 주문 조회

    locked_trade = upbit.get_order('KRW-DOGE')

     

    실행 결과

    ①과 같이 호출하게 되면 ②와 같은 실행 결과를 받을 수 있습니다.

     

    [2021/07/08 10:58:59 AM][INFO][test_module.py:31]:[{'uuid': '81329eec-817a-48db-9b68-1aed510fff89', 'side': 'bid', 'ord_type': 'limit', 'price': '200.0', 'state': 'wait', 'market': 'KRW-DOGE', 'created_at': '2021-07-08T10:58:07+09:00', 'volume': '2500.0', 'remaining_volume': '2500.0', 'reserved_fee': '250.0', 'remaining_fee': '250.0', 'paid_fee': '0.0', 'locked': '500250.0', 'executed_volume': '0.0', 'trades_count': 0}]

     

    실행 결과를 보면 200원에 2500개의 수량을 지정가 매수한 미체결 주문 내역에 대해서 조회가 되었으며 그로인해 묶여있는 KRW 잔고는 수수료 포함 50만 250원임을 알 수 있습니다.

     

    다음 시간에는 미체결 주문 조회를 이용한 주문 취소 로직에 대해서 살펴보겠습니다.

    반응형