본문 바로가기

Python 파이썬 공부하기

파이썬 초보의 Daybit API 이용하기 - 4. 주문 넣기 예제

728x90
반응형


 이번에는 가장 핵심적인 기능인 주문을 넣는 것에 대해 알아보겠습니다.


모든 예제는 Daybit API 문서를 참고합니다.

https://docs.daybit.com/kr


create_order() 라는 함수가 있군요!

이 함수를 이용하면 주문을 할 수 있나봅니다.

주문에는 여러가지 옵션이 있는데, 예제에서는 가장 기본적인 주문으로 실행해보겠습니다.


참고로 이 함수의 파라미터 값들입니다.

이 값들을 입력하여 다양한 옵션의 주문을 넣을 수가 있습니다.

다양한 옵션들은 나중에 알아보도록 하겠습니다.




예제 :

import asyncio
from contextlib import suppress
from decimal import Decimal
from pprint import pprint

from pydaybit import Daybit, PARAM_API_KEY, PARAM_API_SECRET
from pydaybit.exceptions import OrderAlreadyClosed


async def current_price(daybit, quote, base):
summary_intvl = sorted((await daybit.market_summary_intvls()).keys())[0]
price = (await (daybit.market_summaries / summary_intvl)())['{}-{}'.format(quote, base)]['close']
return Decimal(price)


async def daybit_create_order_sell():
async with Daybit(params={PARAM_API_KEY: "Your active API Key",
PARAM_API_SECRET: "Your secret API Key"}) as daybit:
quote = 'USDT'
base = 'BTC'

tick_price = Decimal((await daybit.markets())['{}-{}'.format(quote, base)]['tick_price'])
tick_amount = Decimal((await daybit.coins())[base]['tick_amount'])

# amount * price should be greater than 10 USDT.
price = ((await current_price(daybit, quote, base)) * Decimal(1.2)).quantize(tick_price)
amount = (Decimal(10.5) / price).quantize(tick_amount)

response = await daybit.create_order(
sell=True,
role='both',
quote=quote,
base=base,
price=price,
amount=amount,
cond_type='none',
)
pprint(response)

with suppress(OrderAlreadyClosed):
await daybit.cancel_order(response['id'])


asyncio.get_event_loop().run_until_complete(daybit_create_order_sell())


API 문서에 나와있는 예제 코드입니다.


출력 결과 :

create_order 함수의 리턴값을 콘솔값에 출력합니다.

이 리턴 값에는 주문의 정보들이 들어있습니다.



주문 결과 :

그리고 실제로 주문내역을 보면  취소된 주문이 생성된 것을 알 수 있습니다.

예제에서는  주문 넣은뒤 곧바로 취소하도록 되어있는 것을 알 수 있습니다. 그러니 안심하고 예제를 실행해보셔도 됩니다.


참고로 BTC/USDT의 매도 주문이므로  BTC 잔고가 없으면 콘솔창에 에러가 뜨면서 

주문이 거절됩니다.







자 그럼 이제 코드를 하나하나 뜯어보겠습니다.



        quote = 'USDT'
        base = 'BTC'

주문을 넣을 코인을 정합니다.

quote와 base 변수는 후에 create_order 함수 인자에 들어갑니다.


quote 는  호가 코인입니다. 쉽게 말해 XX마켓(ex BTC마켓)할 때 XX인 것이지요

현재는 BTC, ETH, USDT가 있네요

base는 사고 팔 코인입니다.


BTC 마켓에서 ETH을 거래하고 싶으면

quote : 'BTC'

base = 'ETH'

가 되겠습니다.


        tick_price = Decimal((await daybit.markets())['{}-{}'.format(quote, base)]['tick_price'])
        tick_amount = Decimal((await daybit.coins())[base]['tick_amount'])


daybit.markets() 함수로 tick_price를 불러옵니다.

이 함수는 market의 정보들을 불러옵니다. 그 중에서도 'tick_price' 값을 불러옵니다.

tick_price는 최소 주문 가격 단위입니다.

호가창을 보시면 0.000002 단위로 가격을 지정할 수 있는 것을 알 수 있습니다.(ETH/BTC 마켓 기준)

이것이 tick_price입니다.  quote 와 base를 바꿔서 입력하면 각 마켓별 코인의 tick_price 정보를 받아올 수 있습니다.



밑에 줄은 daybit.coins() 함수를 이용해서 tick_amount 값을 불러옵니다.

이 함수는 coin들의 정보를 불러옵니다. 그중에서도 해당 base 코인의 tick_amount 값을 불러옵니다.

tick_amount 값은 해당 코인의 최소 주문 수량입니다.

주문창에서 수량을 한칸 올려보면 최소 주문 수량이 나옵니다.

바로 이 값입니다.  ETH/BTC 는 0.05 단위 인것을 알 수 있습니다.


그리고 Decimal을 이용하고 있는데, 이것은 소수점까지 정확하게 표현하기 위해 string으로 된 숫자로 바꿔주는 것입니다.

Decimal을 많이 사용하게 될 것입니다.

앞으로 모든 숫자를 계산하거나 할 때는 무조건 Decimal로 변환하여 해야한다고 생각하면 되겠습니다.


        # amount * price should be greater than 10 USDT.
        price = ((await current_price(daybit, quote, base)) * Decimal(1.2)).quantize(tick_price)
        amount = (Decimal(10.5) / price).quantize(tick_amount)

current_price 함수는 현재 가격을 불러온다고 보고 넘어갑시다.

 자세한 함수 안의 내용은 다음에 설명하겠습니다.

여기에  Decimal(1.2) 값을 곱합니다.  이것은 현재 가격에 1.2를 곱한 것입니다.

매도 주문을 체결하는데 현재가격으로 해버리면 바로 주문 체결이 될 수 있으므로 (예제인데 따라하다가 주문 체결이 되어버리면 안되니까..)

예제에서는 주문 체결이 바로 되지 않도록 높은 가격에 매도를 하도록 되어있는 것입니다.


그리고 그 값에 quantize 함수를 씁니다.

이것은 소수점 몇째자리까지 숫자를 저장할지 정하는 것인데

tick_price 까지 잘라서 저장하게 됩니다. ex)  tick_price가 0.00002 일 때 : 0.3250235000001 ->  0.32502

따라서 price에 주문할 가격을 저장합니다.


amount에는 마찬가지 방식으로 주문할 수량을 저장합니다.

예제에서는 임의로 10.5를 price로 나눴는데요. 별 의미는 없는 것  같습니다.




        response = await daybit.create_order(
            sell=True,
            role='both',
            quote=quote,
            base=base,
            price=price,
            amount=amount,
            cond_type='none',
        )
        pprint(response)

이것이 create_order 함수로 주문을 하는 부분입니다.

그리고 return 값을 pprint로 출력합니다.

주문을 할 때 인자값으로 주문에 대한 설정을 할 수 있는데요

sell 이 True이면 매도 False이면 매수 주문입니다.

각 파라미터 값들은  API 문서에 나와있으니 참고하시면 됩니다.




        with suppress(OrderAlreadyClosed):
            await daybit.cancel_order(response['id'])

이 부분은 예제에서 주문을 넣었다가 바로 취소시키기 위해 넣은 부분입니다.

cancel_order 함수로 주문을 취소하는데 해당 주문의 id 값이 필요합니다.

그 값은 아까 create_order를 했을 때 받은 return값 중에 포함되어 있습니다. 

따라서 response['id'] 부분은 주문의 id 값을 의미합니다.

이 id 값으로 각 주문을 구분할 수 있습니다.



오늘은 주문 넣기 예제를 실행해보고 

그 사용법에 대해 간단하게 알아보았습니다.






읽어주셔서 감사합니다.

Daybit 초대 코드를 입력하지 않으신 분이 있다면 저의 초대코드를 입력해주시면 감사하겠습니다.

초대 코드 : ZkMZdral










반응형