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

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

Tech&Fin 2021. 7. 8. 14:39
반응형

지정가로 매수 또는 매도를 걸어 놓은 경우에 아직 체결되지 않은 미체결 주문을 취소해야 할 필요가 있는데요. 이번 시간에는 미체결 주문에 대해서 취소하는 로직에 대해서 살펴 보도록 하겠습니다.

 

미체결 주문을 취소하기 위해서는 먼저 미체결 주문을 조회해야 하는데요. 관련 내용은 아래 포스트를 참고 부탁 드립니다.

 

2021.07.08 - [프로젝트/비트코인 자동매매] - 미체결 주문 조회 - 파이썬 업비트 비트코인 자동매매

 

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

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

technfin.tistory.com

 

 

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

     

    미체결 주문 취소

    이전 포스트에서 설명 드린바와 같이 지정가로 매수 또는 매도를 걸어 놓은 상태에서는 주문이 체결되기 전까지 해당 수량 및 금액이 묶여서 다른 처리를 할 수 없게 됩니다.

     

    아직 체결되지 않은 주문을 취소하고 싶거나 금액을 변경하고 싶은 경우에는 미체결 된 주문을 먼저 취소한 후에 다시 매수 및 매도 요청을 해야 합니다.

     

    미체결 주문을 취소하기 위해서는 주문 고유 번호인 UUID 코드를 알고 있어야 하기 때문에 미체결 된 주문을 먼저 조회해야 하는데요. 해당 내용은 위에 링크로 안내된 지난 포스트를 참고 부탁 드립니다.

     

    주문 고유 ID를 이용한 주문 취소 로직

    # -----------------------------------------------------------------------------
    # - Name : cancel_order_uuid
    # - Desc : 미체결 주문 취소 by UUID
    # - Input
    #   1) order_uuid : 주문 키
    # - Output
    #   1) 주문 내역 취소
    # -----------------------------------------------------------------------------
    def cancel_order_uuid(order_uuid):
        try:
    
            query = {
                'uuid': order_uuid,
            }
    
            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("DELETE", server_url + "/v1/order", query, headers)
            rtn_data = res.json()
    
            return rtn_data
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise

     

    입력 변수

    ① order_uuid : 주문 고유 번호

     

    처리 결과

    주문 고유 번호를 변수로 입력하면 해당 주문건을 취소한 후 결과를 리턴하게 됩니다.

     

    미체결 주문 취소 로직

    # -----------------------------------------------------------------------------
    # - Name : cancel_order
    # - Desc : 미체결 주문 취소
    # - Input
    #   1) target_item : 대상종목
    #   2) side : 매수/매도 구분(BUY/bid:매수, SELL/ask:매도, ALL:전체)
    # - Output
    # -----------------------------------------------------------------------------
    def cancel_order(target_item, side):
        try:
    
            # 미체결 주문 조회
            order_data = get_order(target_item)
    
            # 매수/매도 구분
            for order_data_for in order_data:
    
                if side == "BUY" or side == "buy":
                    if order_data_for['side'] == "ask":
                        order_data.remove(order_data_for)
                elif side == "SELL" or side == "sell":
                    if order_data_for['side'] == "bid":
                        order_data.remove(order_data_for)
    
            # 미체결 주문이 있으면
            if len(order_data) > 0:
    
                # 미체결 주문내역 전체 취소
                for order_data_for in order_data:
                    cancel_order_uuid(order_data_for['uuid'])
    
        # ----------------------------------------
        # 모든 함수의 공통 부분(Exception 처리)
        # ----------------------------------------
        except Exception:
            raise

    주문 고유ID인 UUID를 이용하여 미체결 주문을 취소하기 위해서는 먼저 미체결 주문 내역을 조회해야 합니다. 위의 로직을 이용하면 원하는 종목의 매수 또는 매도 혹은 전체 주문을 조회한 후 취소할 수 있습니다.

     

    입력 변수

    ① target_item : 주문을 취소하고자 하는 대상 종목 코드

    ② side : 매수/매도 구분 (BUY/bid:매수, SELL/ask:매도, ALL:전체)

     

    모듈 호출

    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("취소전")
            logging.info(locked_trade)
    
            # 미체결 주문 취소
            upbit.cancel_order('KRW-DOGE', 'BUY')
    
            # 미체결 주문 재조회
            locked_trade = upbit.get_order('KRW-DOGE')
            logging.info("취소후")
            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)

    공통 모듈에 미체결 조회 및 취소 관련 로직을 작성한 후 아래와 같이 호출하면 미체결 주문을 취소할 수 있습니다.

     

    # 미체결 주문 취소
    upbit.cancel_order('KRW-DOGE', 'BUY')

     

    실행 결과

    ①과 같이 호출하게 되면 주문이 취소 처리 됩니다.

     

    ②번은 취소전 ③번은 취소후에 미체결 주문 내역을 조회한 결과이며 정상적으로 취소되어 더 이상 미체결 주문내역이 남아있지 않음을 확인할 수 있습니다.

    반응형