코인

[자동매매봇 만들기][5편] 텔레그램 봇 연동 – 매매 시그널 알림 보내기

stupidsoft 2025. 5. 17. 20:42
반응형

 

자동매매를 개발할 때, 실제로 주문을 실행하기 전에
전략이 제대로 작동하는지 확인할 방법이 필요하다.
가장 간단하면서도 효과적인 방법은 텔레그램으로 시그널 알림을 받는 것이다.

이번 글에서는 매매 시그널을 감지했을 때 텔레그램 메시지로 알림을 보내는 기능을 구현해본다.


1. 텔레그램 봇 만들기

단계 요약:

  1. 텔레그램에서 @BotFather 검색
  2. /start → /newbot 입력
  3. 봇 이름과 사용자명 입력
  4. API 토큰 발급됨 → 복사해둔다 (예: 123456789:ABC...XYZ)

2. 챗 ID 알아내기

자신에게 메시지를 보내기 위해 채팅 ID가 필요하다.

방법:

  1. 봇에게 /start 라고 먼저 말을 걸어야 한다
  2. 아래 주소로 접속 (봇 토큰 입력)
https://api.telegram.org/bot<토큰값>/getUpdates

예:

https://api.telegram.org/bot123456789:ABC...XYZ/getUpdates
  1. 아래와 같은 응답에서 chat → id 값을 찾는다.
"chat": {
  "id": 987654321,
  ...
}

이 987654321이 챗 ID다.

 

브라우저에서 실행해도 쉽게 chat id 를 얻을 수 있다.

 


3. 텔레그램 메시지 보내기 함수 만들기

import requests

TELEGRAM_TOKEN = '텔레그램_봇_토큰'
TELEGRAM_CHAT_ID = '챗_ID'

def send_telegram_message(text):
    url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
    data = {
        'chat_id': TELEGRAM_CHAT_ID,
        'text': text
    }
    response = requests.post(url, data=data)
    return response

4. 매매 시그널 코드에 연동

앞서 만들었던 시그널 분석 코드에서 print() 대신 메시지를 보낸다.

✅ 전체 예시: signal_with_alert.py

import ccxt
import pandas as pd
import requests

# 텔레그램 설정
TELEGRAM_TOKEN = '여기에_봇_토큰_입력'
TELEGRAM_CHAT_ID = '여기에_챗_ID_입력'

def send_telegram_message(text):
    url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
    data = {
        'chat_id': TELEGRAM_CHAT_ID,
        'text': text
    }
    requests.post(url, data=data)

# 바이낸스 객체
binance = ccxt.binance({'enableRateLimit': True})

# 캔들 데이터 가져오기
symbol = 'BTC/USDT'
df = pd.DataFrame(binance.fetch_ohlcv(symbol, '5m', limit=100),
                  columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

# 지표 계산
df['ma20'] = df['close'].rolling(window=20).mean()

def calculate_rsi(series, period=14):
    delta = series.diff()
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)
    avg_gain = gain.rolling(window=period).mean()
    avg_loss = loss.rolling(window=period).mean()
    rs = avg_gain / avg_loss
    return 100 - (100 / (1 + rs))

df['rsi14'] = calculate_rsi(df['close'], 14)

std = df['close'].rolling(window=20).std()
df['bb_middle'] = df['ma20']
df['bb_upper'] = df['bb_middle'] + 2 * std
df['bb_lower'] = df['bb_middle'] - 2 * std

# 마지막 데이터 기준 시그널 판별
last = df.iloc[-1]
price = last['close']
rsi = last['rsi14']
lower = last['bb_lower']
upper = last['bb_upper']

if price < lower and rsi < 30:
    send_telegram_message(f"📈 매수 시그널\n가격: {price:.2f}\nRSI: {rsi:.2f}")
elif price > upper and rsi > 70:
    send_telegram_message(f"📉 매도 시그널\n가격: {price:.2f}\nRSI: {rsi:.2f}")
else:
    print("시그널 없음")

5. 실행 결과

이제 위 코드를 실행하면 조건에 맞을 경우 텔레그램으로 알림 메시지가 전송된다.
시그널 발생 여부와 함께 가격, RSI 값도 함께 확인할 수 있다.


 

반응형