Skip to content

Commit 36895a5

Browse files
committed
feat: 업비트 주문 리스트 조회 API 추가(v1.4.8)에 맞춰 관련 메서드 추가
1 parent e5f1c98 commit 36895a5

File tree

3 files changed

+233
-33
lines changed

3 files changed

+233
-33
lines changed

README.md

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -63,39 +63,42 @@ data = res.json()
6363
[업비트 REST API][upbit docs api]`Upbit` 클래스의 메서드로 제공합니다.
6464
자세한 내용은 [upbit.py](https://github.com/designmeme/python-upbit-api/blob/main/upbit/upbit.py) 파일 내 docstring 참조.
6565

66-
| | | 메서드명 |
67-
|----|:------------|:-------------|
68-
| 자산 | 전체 계좌 조회 | get_accounts |
69-
| 주문 | 주문 가능 정보 | get_order_chance |
70-
| | 개별 주문 조회 | get_order |
71-
| | 주문 리스트 조회 | get_orders |
72-
| | 주문 취소 접수 | delete_order |
73-
| | 주문하기 | create_order |
74-
| 출금 | 출금 리스트 조회 | get_withdraws |
75-
| | 개별 출금 조회 | get_withdraw |
76-
| | 출금 가능 정보 | get_withdraw_chance |
77-
| | 디지털 자산 출금하기 | create_withdraw_coin |
78-
| | 원화 출금하기 | create_withdraw_krw |
79-
| | 출금 허용 주소 리스트 조회 | get_withdraw_addresses |
80-
| 입금 | 입금 리스트 조회 | get_deposits |
81-
| | 개별 입금 조회 | get_deposit |
82-
| | 입금 주소 생성 요청 | create_coin_address |
83-
| | 전체 입금 주소 조회 | get_coin_addresses |
84-
| | 개별 입금 주소 조회 | get_coin_address |
85-
| | 원화 입금하기 | create_deposit_krw |
86-
| | 계정주 확인(트래블룰 검증)가능 거래소 리스트 조회 | get_vasps |
66+
| | | 메서드명 |
67+
|----|:------------|:---------------------------|
68+
| 자산 | 전체 계좌 조회 | get_accounts |
69+
| 주문 | 주문 가능 정보 | get_order_chance |
70+
| | 개별 주문 조회 | get_order |
71+
| | 주문 리스트 조회 | get_orders |
72+
| | id로 주문리스트 조회 | get_orders_by_id |
73+
| | 체결 대기 주문 (Open Order) 조회 | get_open_orders |
74+
| | 종료된 주문 (Closed Order) 조회 | get_closed_orders |
75+
| | 주문 취소 접수 | delete_order |
76+
| | 주문하기 | create_order |
77+
| 출금 | 출금 리스트 조회 | get_withdraws |
78+
| | 개별 출금 조회 | get_withdraw |
79+
| | 출금 가능 정보 | get_withdraw_chance |
80+
| | 디지털 자산 출금하기 | create_withdraw_coin |
81+
| | 원화 출금하기 | create_withdraw_krw |
82+
| | 출금 허용 주소 리스트 조회 | get_withdraw_addresses |
83+
| 입금 | 입금 리스트 조회 | get_deposits |
84+
| | 개별 입금 조회 | get_deposit |
85+
| | 입금 주소 생성 요청 | create_coin_address |
86+
| | 전체 입금 주소 조회 | get_coin_addresses |
87+
| | 개별 입금 주소 조회 | get_coin_address |
88+
| | 원화 입금하기 | create_deposit_krw |
89+
| | 계정주 확인(트래블룰 검증)가능 거래소 리스트 조회 | get_vasps |
8790
| | 입금 UUID로 트래블룰 검증하기 | verify_travel_rule_by_uuid |
8891
| | 입금 TxID로 트래블룰 검증하기 | verify_travel_rule_by_txid |
89-
| 서비스 정보 | 입출금 현황 | get_wallet_status |
90-
| | API 키 리스트 조회 | get_api_keys |
91-
| 시세 종목 조회 | 마켓 코드 조회 | get_markets |
92-
| 시세 캔들 조회 | 분(Minute) 캔들 | get_candles_minute |
93-
| | 일(Day) 캔들 | get_candles_day |
94-
| | 주(Week) 캔들 | get_candles_week |
95-
| | 월(Month) 캔들 | get_candles_month |
96-
| 시세 체결 조회 | 최근 체결 내역 | get_trades_ticks |
97-
| 시세 현재가 조회 | 현재가 정보 | get_ticker |
98-
| 시세 호가 조회 | 호가 정보 | get_orderbook |
92+
| 서비스 정보 | 입출금 현황 | get_wallet_status |
93+
| | API 키 리스트 조회 | get_api_keys |
94+
| 시세 종목 조회 | 마켓 코드 조회 | get_markets |
95+
| 시세 캔들 조회 | 분(Minute) 캔들 | get_candles_minute |
96+
| | 일(Day) 캔들 | get_candles_day |
97+
| | 주(Week) 캔들 | get_candles_week |
98+
| | 월(Month) 캔들 | get_candles_month |
99+
| 시세 체결 조회 | 최근 체결 내역 | get_trades_ticks |
100+
| 시세 현재가 조회 | 현재가 정보 | get_ticker |
101+
| 시세 호가 조회 | 호가 정보 | get_orderbook |
99102

100103
### Requests 사용
101104
[Requests][requests] 라이브러리를 사용합니다.

upbit/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
- desc: 내림차순
1212
"""
1313

14+
OpenOrderState = Literal['wait', 'watch']
15+
ClosedOrderState = Literal['done', 'cancel']
1416
OrderState = Literal['wait', 'watch', 'done', 'cancel']
1517
"""주문 상태
1618

upbit/upbit.py

Lines changed: 197 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
TransactionType,
3232
MinuteUnit,
3333
RequestGroup,
34-
RemainingReq,
34+
RemainingReq, OpenOrderState, ClosedOrderState,
3535
)
3636

3737

@@ -412,7 +412,7 @@ def get_orders(self,
412412
limit: int = 100,
413413
order_by: OrderBy = 'desc',
414414
**kwargs) -> Response:
415-
"""주문 리스트 조회
415+
"""주문 리스트 조회 - Deprecated (2024.06~)
416416
417417
API 요청 및 응답에 대한 자세한 정보는 공식 문서 참고:
418418
`Upbit API Doc <https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C>`_
@@ -471,6 +471,201 @@ def get_orders(self,
471471

472472
return self._request('get', url, headers=headers, params=params, **kwargs)
473473

474+
def get_orders_by_id(self,
475+
*,
476+
market: Optional[str] = None,
477+
uuids: Optional[list[str]] = None,
478+
identifiers: Optional[list[str]] = None,
479+
order_by: OrderBy = 'desc',
480+
**kwargs) -> Response:
481+
"""id로 주문리스트 조회
482+
483+
API 요청 및 응답에 대한 자세한 정보는 공식 문서 참고:
484+
`Upbit API Doc <https://docs.upbit.com/reference/id%EB%A1%9C-%EC%A3%BC%EB%AC%B8-%EC%A1%B0%ED%9A%8C>`_
485+
486+
:param market: 마켓 코드 (ex. KRW-BTC)
487+
:param uuids: 주문 UUID 리스트
488+
:param identifiers: 주문 identifier 리스트
489+
:param order_by: 정렬 방식
490+
:param kwargs: `requests.Session.request` 호출에 사용할 파라미터
491+
492+
:raises upbit.exceptions.ApiKeyError: 인증 정보 없이 호출시 발생.
493+
494+
:return: API 서버 응답
495+
496+
Usage::
497+
498+
access_key = os.environ.get('UPBIT_OPEN_API_ACCESS_KEY')
499+
secret_key = os.environ.get('UPBIT_OPEN_API_SECRET_KEY')
500+
upbit = Upbit(access_key, secret_key)
501+
res = upbit.get_orders_by_id(uuids=['xxxxxxxx'])
502+
print(res.json())
503+
504+
[{
505+
"uuid": "d098ceaf-6811-4df8-97f2-b7e01aefc03f",
506+
"side": "bid",
507+
"ord_type": "limit",
508+
"price": "104812000",
509+
"state": "wait",
510+
"market": "KRW-BTC",
511+
"created_at": "2024-06-13T10:26:21+09:00",
512+
"volume": "0.00101749",
513+
"remaining_volume": "0.00006266",
514+
"reserved_fee": "53.32258094",
515+
"remaining_fee": "3.28375996",
516+
"paid_fee": "50.03882098",
517+
"locked": "6570.80367996",
518+
"executed_volume": "0.00095483",
519+
"executed_funds": "100077.64196",
520+
"trades_count": 1
521+
}, ...]
522+
"""
523+
url = self._endpoint + "/orders/uuids"
524+
params = {
525+
"market": market,
526+
"uuids[]": uuids,
527+
"identifiers[]": identifiers,
528+
"order_by": order_by,
529+
}
530+
headers = self._get_request_headers(params, headers=kwargs.pop('headers', None))
531+
532+
return self._request('get', url, headers=headers, params=params, **kwargs)
533+
534+
def get_open_orders(self,
535+
*,
536+
market: Optional[str] = None,
537+
state: OpenOrderState = 'wait',
538+
states: Optional[list[OpenOrderState]] = None,
539+
page: int = 1,
540+
limit: int = 100,
541+
order_by: OrderBy = 'desc',
542+
**kwargs) -> Response:
543+
"""체결 대기 주문 (Open Order) 조회
544+
545+
API 요청 및 응답에 대한 자세한 정보는 공식 문서 참고:
546+
`Upbit API Doc <https://docs.upbit.com/reference/%EB%8C%80%EA%B8%B0-%EC%A3%BC%EB%AC%B8-%EC%A1%B0%ED%9A%8C>`_
547+
548+
:param market: 마켓 코드 (ex. KRW-BTC)
549+
:param state: 주문 상태
550+
:param states: 주문 상태 리스트
551+
:param page: 페이지 수
552+
:param limit: 요청 개수
553+
:param order_by: 정렬 방식
554+
:param kwargs: `requests.Session.request` 호출에 사용할 파라미터
555+
556+
:raises upbit.exceptions.ApiKeyError: 인증 정보 없이 호출시 발생.
557+
558+
:return: API 서버 응답
559+
560+
Usage::
561+
562+
access_key = os.environ.get('UPBIT_OPEN_API_ACCESS_KEY')
563+
secret_key = os.environ.get('UPBIT_OPEN_API_SECRET_KEY')
564+
upbit = Upbit(access_key, secret_key)
565+
res = upbit.get_open_orders(market='KRW-BTC', state='wait')
566+
print(res.json())
567+
568+
[{
569+
"uuid": "d098ceaf-6811-4df8-97f2-b7e01aefc03f",
570+
"side": "bid",
571+
"ord_type": "limit",
572+
"price": "104812000",
573+
"state": "wait",
574+
"market": "KRW-BTC",
575+
"created_at": "2024-06-13T10:26:21+09:00",
576+
"volume": "0.00101749",
577+
"remaining_volume": "0.00006266",
578+
"reserved_fee": "53.32258094",
579+
"remaining_fee": "3.28375996",
580+
"paid_fee": "50.03882098",
581+
"locked": "6570.80367996",
582+
"executed_volume": "0.00095483",
583+
"executed_funds": "100077.64196",
584+
"trades_count": 1
585+
}, ...]
586+
"""
587+
url = self._endpoint + "/orders/open"
588+
params = {
589+
"market": market,
590+
"state": state,
591+
"states[]": states,
592+
"page": page,
593+
"limit": limit,
594+
"order_by": order_by,
595+
}
596+
headers = self._get_request_headers(params, headers=kwargs.pop('headers', None))
597+
598+
return self._request('get', url, headers=headers, params=params, **kwargs)
599+
600+
def get_closed_orders(self,
601+
*,
602+
market: Optional[str] = None,
603+
state: ClosedOrderState = 'done',
604+
states: Optional[list[ClosedOrderState]] = None,
605+
start_time: str | None = None,
606+
end_time: str | None = None,
607+
limit: int = 100,
608+
order_by: OrderBy = 'desc',
609+
**kwargs) -> Response:
610+
"""종료된 주문 (Closed Order) 조회
611+
612+
API 요청 및 응답에 대한 자세한 정보는 공식 문서 참고:
613+
`Upbit API Doc <https://docs.upbit.com/reference/%EC%A2%85%EB%A3%8C-%EC%A3%BC%EB%AC%B8-%EC%A1%B0%ED%9A%8C>`_
614+
615+
:param market: 마켓 코드 (ex. KRW-BTC)
616+
:param state: 주문 상태
617+
:param states: 주문 상태 리스트
618+
:param start_time: 조회 시작 시간 (주문 생성시간 기준)
619+
:param end_time: 조회 종료 시간 (주문 생성시간 기준)
620+
:param limit: 요청 개수
621+
:param order_by: 정렬 방식
622+
:param kwargs: `requests.Session.request` 호출에 사용할 파라미터
623+
624+
:raises upbit.exceptions.ApiKeyError: 인증 정보 없이 호출시 발생.
625+
626+
:return: API 서버 응답
627+
628+
Usage::
629+
630+
access_key = os.environ.get('UPBIT_OPEN_API_ACCESS_KEY')
631+
secret_key = os.environ.get('UPBIT_OPEN_API_SECRET_KEY')
632+
upbit = Upbit(access_key, secret_key)
633+
res = upbit.get_closed_orders(market='KRW-BTC', state='done')
634+
print(res.json())
635+
636+
[{
637+
"uuid": "e5715c44-2d1a-41e6-91d8-afa579e28731",
638+
"side": "ask",
639+
"ord_type": "limit",
640+
"price": "103813000",
641+
"state": "done",
642+
"market": "KRW-BTC",
643+
"created_at": "2024-06-13T10:28:36+09:00",
644+
"volume": "0.00039132",
645+
"remaining_volume": "0",
646+
"reserved_fee": "0",
647+
"remaining_fee": "0",
648+
"paid_fee": "20.44627434",
649+
"locked": "0",
650+
"executed_volume": "0.00039132",
651+
"executed_funds": "40892.54868",
652+
"trades_count": 2
653+
}, ...]
654+
"""
655+
url = self._endpoint + "/orders/closed"
656+
params = {
657+
"market": market,
658+
"state": state,
659+
"states[]": states,
660+
"start_time": start_time,
661+
"end_time": end_time,
662+
"limit": limit,
663+
"order_by": order_by,
664+
}
665+
headers = self._get_request_headers(params, headers=kwargs.pop('headers', None))
666+
667+
return self._request('get', url, headers=headers, params=params, **kwargs)
668+
474669
def delete_order(self,
475670
*,
476671
uuid: Optional[str] = None,

0 commit comments

Comments
 (0)