본문 바로가기

Python 파이썬 공부하기

파이썬 초보의 Daybit API 이용하기 - 6. ETH 사고 파는 예제

728x90
반응형

 내일 Daybit에  ZPER 가 상장한다고 합니다

거래량 순으로 ZPER를 나눠주는 이벤트도 한다고 하니

봇을 만들어 돌리면 좋겠네요

 

 저번 시간에 자신의 자산 내역을 가져오는 것을 해보았는데요

그것을 이용하여 오늘은 ETH 사고 파는 간단한 예제를 보겠습니다.


모든 예제는 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():
async with Daybit(params={PARAM_API_KEY: "Your active key",
PARAM_API_SECRET: "Your secret key"}) as daybit:
quote = 'BTC'
base = 'ETH'


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

# 현재 가격
price = (await current_price(daybit, quote, base)).quantize(tick_price)
sellPrice = (price + tick_price*10).quantize(tick_price) #매도 주문을 넣을 가격
buyPrice = (price - tick_price*10).quantize(tick_price) #매수 주문을 넣을 가격


myAsset = await daybit.my_assets()
btcAsset = myAsset['BTC']
ethAsset = myAsset['ETH']



#BTC 가 ETH 보다 더 많을 때
#ETH 매수 주문
if Decimal(btcAsset['available']) > (Decimal(ethAsset['available']) * price):
buy_amount = (Decimal(btcAsset['available']) /buyPrice).quantize(tick_amount)
print(tick_amount)
print(buyPrice)
print(buy_amount)

response = await daybit.create_order(
sell=False,
role='both',
quote=quote,
base=base,
price=buyPrice,
amount=buy_amount,
cond_type='none',
)


#BTC 가 ETH 보다 적을 때
#ETH 매도 주문
elif Decimal(btcAsset['available']) < (Decimal(ethAsset['available']) * price):
sell_amount = (Decimal(ethAsset['available'])).quantize(tick_amount)

response = await daybit.create_order(
sell=True,
role='both',
quote=quote,
base=base,
price=sellPrice,
amount=sell_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())


 이 예제는 자신의 BTC 수량과 ETH 수량을 비교하여 

BTC 수량이 더 많으면 ETH을 매수,

ETH 수량이 더 많으면 ETH을 매도하는 간단한 예제 입니다.


 하나하나 살펴보겠습니다.


# 현재 가격
price = (await current_price(daybit, quote, base)).quantize(tick_price)
sellPrice = (price + tick_price*10).quantize(tick_price) #매도 주문을 넣을 가격
buyPrice = (price - tick_price*10).quantize(tick_price) #매수 주문을 넣을 가격

 현재 가격을 가져오는 것은 다음 시간에 설명하겠습니다.

일단 current_price는 해당 코인의 현재 가격을 가져온다고 보시면 됩니다.

예제는 BTC 마켓의  ETH 가격을 불러옵니다. (ETH 1개를 얼마의 BTC로 살 수 있냐 입니다. ex) 0.031164 사토시

예제이므로 주문이 체결되지 않도록 판매가격은 현재 가격보다 높은 가격에, 매수가격은 낮은 가격으로 해놓았습니다.


  


myAsset = await daybit.my_assets()
btcAsset = myAsset['BTC']
ethAsset = myAsset['ETH']

자산 내역을 가져옵니다.

그 중에서도 BTC 와 ETH 자산 내역을 가져와 저장합니다.




#BTC 가 ETH 보다 더 많을 때
#ETH 매수 주문
if Decimal(btcAsset['available']) > (Decimal(ethAsset['available']) * price):
buy_amount = (Decimal(btcAsset['available']) /buyPrice).quantize(tick_amount)

response = await daybit.create_order(
sell=False,
role='both',
quote=quote,
base=base,
price=buyPrice,
amount=buy_amount,
cond_type='none',
)

자산 내역을 비교합니다.

비교할 때는 단순히 BTC의 available 값과 ETH의 available 값을 비교하면 안됩니다.

BTC의 available 값은 BTC 수량이고 ETH의 available 값은 말그대로 ETH의 수량입니다.


우리가 원하는 것은 내가 가지고 있는 ETH의 가치를 BTC로 환산하였을 때

BTC와 ETH의 가치를 비교하여 BTC가 많으면 매수

ETH이 많으면 매도 하는 것입니다.




 따라서 BTC의 수량과 ETH의 수량에 가격을 곱한 값(ETH을 BTC가치로 환산)을 비교합니다.

위는 BTC의 수량이 더 많을 경우 매수주문을 넣는 경우입니다.

price는 위에서 정한 buyPrice를 넣어 줍니다.

그리고 다음과 같이 주문할 수량을 넣어주었습니다.


buy_amount = (Decimal(btcAsset['available']) /buyPrice).quantize(tick_amount)

위는 매수 주문할 수량을 계산하는 것입니다.

 매수 주문 수량은 ETH을 얼마나 매수할지이므로 ETH의 수량이 됩니다.

최대로 사고 싶을 때 위와 같이 하면 됩니다.

현재 나의 BTC 수량을 매수할 가격으로 나누면  살수 있는 ETH 수량이 나오겠죠?

그것이 바로 위의 식입니다.




#BTC 가 ETH 보다 적을 때
#ETH 매도 주문
elif Decimal(btcAsset['available']) < (Decimal(ethAsset['available']) * price):
sell_amount = (Decimal(ethAsset['available'])).quantize(tick_amount)

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

) 

반대로 ETH의 가치가 더 높을 때 매도하는 주문입니다.

매도 수량은 말그대로 ETH 수량이기 때문에 

풀매도 할 경우 ETH 자산의 available 값을 입력하면 됩니다.




 간단하게 사고 파는 방법을 알아 보았습니다.

위 구문들을 While문에 넣고 돌리면 불안정하지만 

풀매도 하고 풀매수를 반복하는 프로그램이 될 수 있겠네요


 다만 거래 최소 가격인 10달러가 안되거나 최대 수량을 초과한 주문을 넣을 경우

에러를 발생하며 프로그램이 정지가 됩니다. 여기에 대해서는 다음 시간에 알아봅시다.


읽어주셔서 감사합니다.

혹시 제 글이 도움이 되셨다면,

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

초대 코드 : ZkMZdral












반응형