(01.31) 수정됨.
빗썸 api를 통해 비트코인 시세 정보를 받고, 차트로 만드는 작업 테스트
코드
from datetime import datetime, date as Date, timedelta
from typing import Literal
import requests
class Candle:
@property
def key_date_utc(self):
return 'candle_date_time_utc'
@property
def key_date_kst(self):
return 'candle_date_time_kst'
@property
def key_open(self):
return 'opening_price'
@property
def key_high(self):
return 'high_price'
@property
def key_low(self):
return 'low_price'
@property
def key_close(self):
return 'trade_price'
@property
def key_timestamp(self):
return 'timestamp'
@property
def key_volume(self):
return 'candle_acc_trade_volume'
@property
def key_value(self):
return 'candle_acc_trade_price'
@property
def key_unit(self):
return 'unit'
@property
def key_previous_price(self):
return 'prev_closing_price'
@property
def key_change_price(self):
return 'change_price'
@property
def key_rate(self):
return 'change_rate'
@property
def key_converted_price(self):
return 'converted_trade_price'
def _request(self, url, params):
with requests.get(url, params=params) as r:
list_data: list[dict[str, str|int]] = r.json()
for i in enumerate(list_data, 1): print(f' {i}')
return list_data
def get_minute(self, market: str, unit: Literal[1, 3, 5, 10, 15, 30, 60, 240]=1, *, count: Literal['min 1, max 200']=200, time_end: datetime=None):
url = f'https://api.bithumb.com/v1/candles/minutes/{unit}'
params = {
'market': market,
'count': count,
}
if time_end: params['to'] = (time_end.replace(second=0, microsecond=0) + timedelta(minutes=1)).strftime('%Y-%m-%dT%H:%M:%S')
# print(f'{params=}')
return self._request(url, params)
def get_day(self, market: str, unit: Literal['KRW', 'BTC', 'ETH']='KRW', *, count: Literal['min 1, max 200']=200, time_end: Date|datetime=None):
url = 'https://api.bithumb.com/v1/candles/days'
params = {
'market': market,
'count': count,
}
if time_end:
time_end = time_end + timedelta(days=1)
if isinstance(time_end, datetime): time_end = time_end.date()
params['to'] = time_end.strftime('%Y-%m-%dT%H:%M:%S')
# print(f'{params=}')
# 원화 마켓이 아닌 경우 가격 단위 변환요청
if not market.startswith('KRW'): params['convertingPriceUnit'] = unit
return self._request(url, params)
if __name__ == '__main__':
a = Candle()
a.get_minute('KRW-BTC', 240, count=10, time_end=datetime(2025, 1, 30, 16, 38, 0))
# a.get_day('KRW-BTC', count=10, time_end=datetime(2025, 1, 24, 0, 0, 0))
import seolpyo_mplchart as mc
import pandas as pd
market = 'KRW-BTC'
# d = a.get_minute(market, unit=10)
# dt = datetime.strptime(d[-1][a.key_date_kst], '%Y-%m-%dT%H:%M:%S') - timedelta(seconds=1)
# d += a.get_minute(market, time_end=dt)
# dt = datetime.strptime(d[-1][a.key_date_kst], '%Y-%m-%dT%H:%M:%S') - timedelta(seconds=1)
# d += a.get_minute(market, time_end=dt)
d = a.get_day(market)
dt = datetime.strptime(d[-1][a.key_date_kst], '%Y-%m-%dT%H:%M:%S') - timedelta(days=1)
d += a.get_day(market, time_end=dt)
dt = datetime.strptime(d[-1][a.key_date_kst], '%Y-%m-%dT%H:%M:%S') - timedelta(days=1)
d += a.get_day(market, time_end=dt)
df = pd.DataFrame(d)
c = mc.SliderChart()
c.watermark = market
c.date = a.key_date_kst
c.Open = a.key_open
c.high = a.key_high
c.low = a.key_low
c.close = a.key_close
c.volume = a.key_value
c.format_candleinfo = mc.format_candleinfo_ko.replace('거래량', '거래대금')
c.format_volumeinfo = mc.format_volumeinfo_ko.replace('거래량', '거래대금')
c.unit_volume = '원'
c.digit_volume = 4
c.set_data(df)
mc.show(True)