iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
Software Development

30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播系列 第 8 篇

Day 08:功能大合體 — 將黃金交叉看盤訊號自動推送到 Telegram 手機!

  • 分享至 

  • xImage
  •  

今天是第八天!前幾天我們做了好多組件,今天我們的目標就是在這些零散的程式碼組合起來,做出一隻真正的「自動看盤提醒小幫手」!
還記得我們在第三天用 yfinance 抓股價、第五天用 pandas 算 5日/20日 均線與 if-else 判斷交叉、第七天用 urllib 發送 Telegram 手機訊息。接下來,我們還是老樣子一步一步慢慢來。

步驟一:我們先釐清邏輯
組合後的程式運作流程非常直覺,只要 4 個步驟:

  1. 抓資料:向 Yahoo Finance 抓取台積電最近 3 個月的股價。
  2. 算指標:計算 5 日均線(SMA5)與 20 日均線(SMA20)。
  3. 判斷訊號:比較「昨天」與「今天」的均線位置,看看有沒有發生突破。
  4. 發送推播:如果有觸發訊號,就把整理好的警報文字透過 Telegram API 傳送到手機;如果沒有訊號,就在電腦終端機紀錄即可(避免垃圾訊息洗版)。

接下來,知道邏輯後,我們就可以來做程式碼了!
步驟二:完整實作程式碼 (main.py)
還是要先確認終端機前面有沒有(venv),再來打開專案中的 main.py,照著下面程式碼就可以了!(記得填入你的 TOKEN 與 CHAT_ID):

import yfinance as yf
import urllib.request
import urllib.parse

# 1. 設定區:請填入你的 Telegram 通訊資料
TOKEN = "你的_BOT_TOKEN".strip()
CHAT_ID = "你的_CHAT_ID".strip()

# 發送 Telegram 訊息的自訂函式
def send_telegram(message):
    url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
    data = urllib.parse.urlencode({
        "chat_id": CHAT_ID,
        "text": message
    }).encode('utf-8')
    
    try:
        req = urllib.request.Request(url, data=data)
        with urllib.request.urlopen(req) as response:
            print(" Telegram 訊息發送成功!")
    except Exception as e:
        print(f" Telegram 發送失敗:{e}")

# 2. 數據抓取與技術指標計算
print(" 機器人開始分析數據中...")

# 抓取台積電最近 3 個月的歷史數據
df = yf.Ticker("2330.TW").history(period="3mo")

# 計算 5 日與 20 日均線
df['SMA5'] = df['Close'].rolling(window=5).mean()
df['SMA20'] = df['Close'].rolling(window=20).mean()

# 取得「昨天」與「今天」的資料
yesterday = df.iloc[-2]
today = df.iloc[-1]

date_str = today.name.strftime('%Y-%m-%d')
close_price = today['Close']
sma5_price = today['SMA5']
sma20_price = today['SMA20']

# 3. 訊號判斷與自動發送通知
# 條件一:觸發黃金交叉
if yesterday['SMA5'] < yesterday['SMA20'] and today['SMA5'] > today['SMA20']:
    msg = (
        f"【台股買進警報】台積電 (2330)\n"
        f" 日期:{date_str}\n"
        f" 今日收盤價:{close_price:.1f} 元\n"
        f" 5日線 ({sma5_price:.1f}) 向上突破 20日線 ({sma20_price:.1f})\n"
        f" 觸發「黃金交叉」訊號,建議關注買進機會!"
    )
    send_telegram(msg)

# 條件二:觸發死亡交叉
elif yesterday['SMA5'] > yesterday['SMA20'] and today['SMA5'] < today['SMA20']:
    msg = (
        f"【台股賣出警報】台積電 (2330)\n"
        f" 日期:{date_str}\n"
        f" 今日收盤價:{close_price:.1f} 元\n"
        f" 5日線 ({sma5_price:.1f}) 跌破 20日線 ({sma20_price:.1f})\n"
        f" 觸發「死亡交叉」訊號,注意下跌風險!"
    )
    send_telegram(msg)

# 條件三:今日無突破訊號
else:
    print(f"🤖 [{date_str}] 台積電今日無突破訊號(SMA5: {sma5_price:.1f} / SMA20: {sma20_price:.1f}),不發送 Telegram 訊息。")

解釋一下程式碼吧!
封裝 send_telegram() 函式:

  • 把 Day 07 發送訊息的邏輯打包成一個可重複使用的函式 send_telegram(message)。這樣當觸發黃金交叉或死亡交叉時,只需要一行 send_telegram(msg) 就能把組裝好的文字傳出去,讓主程式邏輯乾淨又好看!

「無訊號不發送」的過濾機制:

  • 在 else 區塊中,我們選擇只在電腦終端機印出紀錄,而不呼叫 send_telegram()。這樣可以避免機器人每天發送無意義的訊息打擾我們。

步驟三:執行程式
在終端機輸入:

python main.py

最後會長下面這樣就成功了!
https://ithelp.ithome.com.tw/upload/images/20260922/20184215Z5ZMZFXf7K.png
小結一下:
一定要記得寫自己的ID和TOKEN!不然跑不出來。
今天我們成功完成了文字訊號的自動發送!
但「文字」看起來還是不夠直觀,如果能把 Day 04 畫好的 K 線圖(kline.png)也直接發送到 Telegram 手機,那該有多好?


上一篇
Day 07:連線測試 — 寫出第一條發送到手機的 Telegram 訊息!
下一篇
Day 09:視覺化升級 — 讓 Telegram 機器人直接傳送 K 線圖到手機!
系列文
30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播 共 11 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言