今天是第八天!前幾天我們做了好多組件,今天我們的目標就是在這些零散的程式碼組合起來,做出一隻真正的「自動看盤提醒小幫手」!
還記得我們在第三天用 yfinance 抓股價、第五天用 pandas 算 5日/20日 均線與 if-else 判斷交叉、第七天用 urllib 發送 Telegram 手機訊息。接下來,我們還是老樣子一步一步慢慢來。
步驟一:我們先釐清邏輯
組合後的程式運作流程非常直覺,只要 4 個步驟:
接下來,知道邏輯後,我們就可以來做程式碼了!
步驟二:完整實作程式碼 (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() 函式:
「無訊號不發送」的過濾機制:
步驟三:執行程式
在終端機輸入:
python main.py
最後會長下面這樣就成功了!
小結一下:一定要記得寫自己的ID和TOKEN!不然跑不出來。
今天我們成功完成了文字訊號的自動發送!
但「文字」看起來還是不夠直觀,如果能把 Day 04 畫好的 K 線圖(kline.png)也直接發送到 Telegram 手機,那該有多好?