비트코인 차트 그리기 테스트

작성자: [관리자] 하얀설표 01.31 작성됨





(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)

 

 

 





추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.