본문 바로가기

코인/코인 개발

코인 거래량 급등 텔레그램(Telegram) 알림 봇 파이썬(Python)으로 만들기 (2)

이전 포스팅에서 python-telegram-bot을 사용해 알림을 보내는 기능에 대해 소개했었습니다.

2021.07.08 - [코인/코인 개발] - 코인 거래량 급등 텔레그램(Telegram) 알림 봇 파이썬(Python)으로 만들기

 

코인 거래량 급등 텔레그램(Telegram) 알림 봇 파이썬(Python)으로 만들기

지난 블로그에서 업비트 코인 거래량 급등 알리미를 파이썬으로 작성했었는데, 2021.07.07 - [암호화폐] - 업비트 API를 이용한 코인 거래량 급등 알리미 프로그램 업비트 API를 이용한 코인 거래량

blog.coinali.me

 

해당 코드에서 설명이 부족해 사용하기 어렵다는 질문을 받아, 좀 더 쉽게 사용할 수 있도록 개선하고 코드 또한 첨부하였습니다.

 

먼저, 해당 코드는 두 개의 프로그램으로 구성되어 있습니다. 하나는 telegram_alert.py이고 다른 하나는 upbit_volume_checker.py입니다. 각각 텔레그램 봇 채널에 메시지를 전송하는 코드와 업비트 거래량을 감지하는 코드입니다.

 

먼저 다음은 telegram_alert.py 입니다.

class UpbitVolumeAlertTelegramBot:
    """
    TelegramBot

    업비트 거래량 알림을 위한 간단한 텔레그램 봇 예제입니다.

    :arg
        api_token: 텔레그램 API Token. 텔레그럼 문서를 확인해주세요.
        persistence_filename: 텔레그램 채팅 보관을 위한 파일명. 입력값이 없으면 upbit_alert_bot이 기본값으로 사용됩니다.
    """

    def __init__(self, api_token, persistence_filename='upbit_alert_bot'):
        self.persistence = PicklePersistence(filename=persistence_filename)
        self.updater = Updater(api_token, persistence=self.persistence, use_context=True)

        self.dispatcher = self.updater.dispatcher
        # start 명령어 처리
        self.dispatcher.add_handler(CommandHandler("start", self._cmd_start, pass_job_queue=True))

    def _cmd_start(self, update: Update, context: CallbackContext) -> None:
        chat_id = update.message.chat_id
        context.bot.send_message(chat_id=chat_id, text='업비트 거래량 알리미입니다. 단기간 급등하는 거래량이 발생하면 알림이 발생합니다.')

    def send_message(self, message, market=None):
        if market:
            code = market['code']
            name = market['name']
            upbit_url = 'https://upbit.com/exchange?code=CRIX.UPBIT.{}'.format(code)
            # '.' 문자가 Markdown에서 예약되어 있어 \\가 필요.
            message = message.replace('.', '\\.')
            text = f'[{name}]({upbit_url}) {message}'
            parse_mode = 'MarkdownV2'
        else:
            text = message
            parse_mode = None

        removed_user_ids = []
        for chat_id in self.persistence.user_data.keys():
            try:
                self.updater.bot.send_message(chat_id, text, parse_mode=parse_mode)
            except Unauthorized:  # 사용자가 'Stop Bot'한 경우 오류가 발생함. 이 경우 강제로 사용자를 제거함.
                removed_user_ids.append(chat_id)

        [self.persistence.user_data.pop(id) for id in removed_user_ids]

    def start_polling(self):
        self.send_message('업비트 거래량 알리미가 시작하였습니다.')
        self.updater.start_polling()

    def idle(self):
        self.updater.idle()

 

텔레그램 Token을 제공받는 방법은 이전 포스팅을 참고해주시기 바랍니다.

 

 

해당 코드에서는 'start' 명령어만을 구현했는데, 사용자가 텔레그램 채널에서 /start 명령어를 사용하면 호출되고 이때 persistence에 chat_id가 저장됩니다. 이 chat_id는 추후 send_message에서 알림 메시지 전송 시에 사용됩니다.

 

다음은 upbit_volume_checker.py입니다.

# 업비트 API Access Key
UPBIT_ACCESS_KEY = ''
# 업비트 API Secret Key
UPBIT_SECRET_KEY = ''
upbit = Upbit(UPBIT_ACCESS_KEY, UPBIT_SECRET_KEY)

# Telegram Bot Token
TELEGRAM_TOKEN = ''
bot = UpbitVolumeAlertTelegramBot(TELEGRAM_TOKEN)

# 기준 차트 단위. 3 = 3분봉
CANDLE_MIN_UNIT = 3
# 불러올 최대 거래량 갯수
MAX_COUNT = 200
# 제거할 (최소/최대) 이상 거래량 갯수
OUTLIER_COUNT = 5
# 거래량 급등 판단 기준인 표준 편차 차이
STDEV_RATE = 2.0

# KRW 마켓만 확인
res = [x for x in upbit.markets() if 'KRW' in x.market()]

while True:
    for x in res:
        candles = upbit.candles(x.market())
        min_candles = candles.minute(unit=CANDLE_MIN_UNIT, count=MAX_COUNT)

        # 최근 거래량
        current_volume = min_candles[0].candle_acc_trade_volume()

        # 최근 거래량 및 이상 거래량을 제거.
        volumes = [y.candle_acc_trade_volume() for y in min_candles[1:]]
        volumes = sorted(volumes)
        volumes = volumes[OUTLIER_COUNT:len(volumes) - OUTLIER_COUNT]

        # 최근 거래량을 제외한 거래량의 표준 편차를 계산
        prev_stdev_vol = stdev(volumes)
        volumes.append(current_volume)
        # 최근 거래량을 포함한 거래량의 표준 편차를 계산
        cur_stdev_vol = stdev(volumes)

        print('Market: {}, Cur: {}, Prev Std dev: {}, Cur Std dev: {}'.format(x.market(), current_volume,
                                                                              prev_stdev_vol,
                                                                              cur_stdev_vol))
        # 두 편차의 차이가 지정한 값을 넝어서면 급등으로 판단, 알림 발생.
        if (STDEV_RATE * prev_stdev_vol) < cur_stdev_vol:
            bot.send_message('거래량이 급등하였습니다.', {
                'code': x.market().replace('KRW-', ''),
                'name': x.korean_name()
            })

 

업비트 API Key를 발급받는 방법은 이전 포스팅을 참고해주시기 바랍니다. 코드 구성은 이전에 설명한 것과 동일한데, 다른 부분은 알림 전송 시 앞서 작성한 telegram_alert.py의 텔레그램 봇을 사용합니다. 자세한 코드 설명은 역시 이전 포스팅을 참고해주시기 바랍니다.

 

코드는 다음 총 3개의 의존 라이브러리를 사용하고 있습니다.

 

  • python-telegram-bot
  • pyJWT
  • requests

 

requirements.txt도 첨부 파일에 포함되어 있으니, 다음 명령어로 해당 의존 라이브러리를 설치할 수 있습니다.

pip -r requirements.txt

 

궁금한 점은 댓글로 문의 주세요.

 

upbit_volume_alert_telegram_bot.zip
0.01MB