본문 바로가기

Python 파이썬 공부하기

파이썬 초보의 Daybit API 이용하기 - 7. 현재 가격 불러오기

728x90
반응형


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

https://docs.daybit.com/kr




지금까지 코인의 현재 가격을 불러오는 것은 API 문서에 있는 예제를 이용했었습니다.

그 예제는 다음과 같습니다.


예제

 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)

print(price)

 여기서 current_price 함수가 현재 가격을 불러오는 역할을 했습니다.

가격 변화가 별로 없을 때는 정확한데, 가격 변화가 심할 때나, 어떤 상황에서

호가 창에 표시되는 가격과 조금 다른 것을 확인했었습니다. (지금은 가격변화가 없어서 그런지 같네요)



사실 우리가 알고 싶은 현재 가격은 이렇게 호가창에 뜨는 현재 가격입니다.

그 가격을 기준을 삼아 거래를 해야하기 때문입니다.


그래서 방법이 없을까 찾다가 더 정확한 현재 가격을 불러오는 방법을 찾았습니다. 



예제

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

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 last_price_info(daybit, quote, base):


intvl = sorted((await daybit.price_history_intvls()).keys())[0] #60초 간격 60, 180, 300, 600, 900, 1800, 3600, 7200, 14400, 21600, 86400

lastBTC_ETH_Info = await (daybit.price_histories / quote / base / intvl)(
from_time=int(time.time() * 1000 - intvl * 10 * 1000),
to_time=int(time.time() * 1000))

pprint(lastBTC_ETH_Info)
priceInfoKey = list(lastBTC_ETH_Info.keys())[-1]

return Decimal(lastBTC_ETH_Info[priceInfoKey]['close'])


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)
price = (await last_price_info(daybit, quote, base)).quantize(tick_price)
print(price)

asyncio.get_event_loop().run_until_complete(daybit_create_order())

 


 위에서 last_price_info 함수가 현재 가격을 가져오는 새로운 함수입니다.



이 함수에 대해 하나하나 알아보겠습니다.

 


intvl = sorted((await daybit.price_history_intvls()).keys())[0] #60초 간격 60, 180, 300, 600, 900, 1800, 3600, 7200, 14400, 21600, 86400


이것은 바로 밑의 price_histories() 함수에 넣을 인자 중 하나인 intvl을 얻기 위한 함수입니다.

price_histories() 함수는 쉽게 말해서 차트의 그래프 정보를 가져온다고 보시면 됩니다.  이 그래프는 1분봉에서 부터 1시간 봉 등 다양한 시간단위가 있는데요

위는 이 시간 단위를 결졍해 줍니다.

가장 마지막에 0을 인덱스로 넣어주었는데  그러면 60초 단위봉을 불러옵니다.

인덱스를 달리하면 다른 시간 단위를 불러올 수 있습니다.  그 순서는 오른쪽 주석에 적힌 순서입니다.

예를 들어 인덱스가 2이면 300초를 불러오므로 3분단위를 불러오겠군요



 


lastBTC_ETH_Info = await (daybit.price_histories / quote / base / intvl)(
from_time=int(time.time() * 1000 - intvl * 10 * 1000),
to_time=int(time.time() * 1000))

 위는 아까 말했듯이 그래프 정보를 불러오는 부분입니다.

불러온 lastBTC_ETH_Info를  출력하면 다음과 같습니다.


각 60초마다 가격정보를 불러옵니다. 

'high'는 고점, 'low' 저점 , 'open'은 시작 시간의 가격,  'close'는 끝날 때의 가격이 됩니다.


여기서 가장 마지막 봉의(인덱스의) 끝날 때의 가격이 현재 가격과 일치하게 됩니다.

따라서 우리는 lastBTC_ETH_Info 딕셔너리의 가장 마지막 Key의 'close' 정보를 얻어내면

현재 가격을 알 수 있습니다.



 


priceInfoKey = list(lastBTC_ETH_Info.keys())[-1]

return Decimal(lastBTC_ETH_Info[priceInfoKey]['close'])

딕셔너리의 가장 마지막 Key를 얻기 위해 키들을 얻어내는 keys() 함수를 사용하였고

이를 list 함수를 써서 list로 만들어 주었습니다. 

그리고 마지막 인덱스의 키를 얻어야 하므로 뒤에서 첫번째를 의미하는 -1 인덱스로

원하는 key를 얻었습니다.


 마지막으로 lastBTC_ETH_Info에 얻어온 key값을 넣고  ['close'] 정보를 리턴합니다.

이것이 현재 가격이 됩니다.


 지금은 현재 가격만 알아왔지만 price_histories() 함수를 잘 이용하면 

현재 가격 뿐만 아니라 그래프를 따라 원하는 데이터를 얻어낼 수 있는 등 유용하게 쓰일 수 있을 것 같습니다.  



읽어주셔서 감사합니다.

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

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

초대 코드 : ZkMZdral

















반응형