Tutorial/用 Python 整 USD/IDR 匯率提示

用 Python 整 USD/IDR 匯率提示

用 Python 標準庫整一個閾值提示監察器,只喺跨過閾值時提示,安全保存狀態,同時遵守資料新鮮度同 API 限制。

ERexchangerate.dev·Sep 8, 2026·閱讀約 8 分鐘

提示應該比較每個新嘅有效 USD/IDR 觀測同上一次觀測,而唔係比較兩次輪詢時間。第一次只建立基準,舊資料同錯誤唔會改變狀態。

Key points
判斷 IDR 時用 sources["IDR"]effective_at["IDR"]。全局 source 只係所有請求貨幣嘅保守摘要。
第一次有效觀測只保存基準。跨過閾值後提示一次並解除武裝,之後有效觀測回到閾值內先重新武裝。
先寫入同一目錄嘅臨時 JSON,設定0600,再用 os.replace 替換,避免中斷留低半個狀態檔。
請求用十秒 timeout,key 放喺 EXCHANGERATE_API_KEY。輪詢至少相隔60秒;429時保留狀態並遵守 Retry-After
下載完整腳本,喺版本控制之外設定閾值同狀態路徑。腳本只會喺本地 console 顯示提示。

建立單一貨幣觀測模型

判斷 IDR 時用 sources["IDR"]effective_at["IDR"]。全局 source 只係所有請求貨幣嘅保守摘要。

python · observation modelcopy
from decimal import Decimal

def idr_observation(payload: dict) -> dict:
    return {
        "rate": Decimal(str(payload["rates"]["IDR"])),
        "source": payload["sources"]["IDR"],
        "effective_at": payload["effective_at"]["IDR"],
        "market_session": payload["market_session"],
    }

定義跨越策略

第一次有效觀測只保存基準。跨過閾值後提示一次並解除武裝,之後有效觀測回到閾值內先重新武裝。

情況狀態變化提示
第一次有效觀測保存基準
低於閾值嘅新觀測armed=true
已武裝時跨過閾值armed=false一次
重複/舊觀測或錯誤保留狀態

安全保存狀態

先寫入同一目錄嘅臨時 JSON,設定0600,再用 os.replace 替換,避免中斷留低半個狀態檔。

python · atomic state writecopy
import json
import os
import tempfile
from pathlib import Path

def save_state(path: Path, state: dict) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    fd, temporary = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent, text=True)
    try:
        os.fchmod(fd, 0o600)
        with os.fdopen(fd, "w") as handle:
            json.dump(state, handle, sort_keys=True)
            handle.write("\n")
        os.replace(temporary, path)
    except Exception:
        try:
            os.unlink(temporary)
        except OSError:
            pass
        raise

限制網絡同配額

請求用十秒 timeout,key 放喺 EXCHANGERATE_API_KEY。輪詢至少相隔60秒;429時保留狀態並遵守 Retry-After。 預設五分鐘間隔喺30日大約8,640次;60秒間隔大約43,200次,可能超過共享月度配額。

錯誤唔可以製造假提示
請求用十秒 timeout,key 放喺 EXCHANGERATE_API_KEY。輪詢至少相隔60秒;429時保留狀態並遵守 Retry-After

執行完整監察器

下載完整腳本,喺版本控制之外設定閾值同狀態路徑。腳本只會喺本地 console 顯示提示。 預設最大資料年齡係一小時。如果接受每日參考或市場關閉資料,請設定 FX_ALERT_MAX_AGE_SECONDS。 python-exchange-rate-alerts.py

shell · run itcopy
chmod 700 python-exchange-rate-alerts.py
export EXCHANGERATE_API_KEY="your-key"
export FX_ALERT_THRESHOLD_PCT="1.0"
export FX_ALERT_POLL_SECONDS="300"
export FX_ALERT_STATE_PATH="$HOME/.local/state/fx-alert.json"
python3 python-exchange-rate-alerts.py

唔使等市場都可以測試策略

用網絡 mock 測試第一次、閾值內移動、跨越、重複時間、舊資料、重新武裝同第二次跨越。

ER
exchangerate.dev
為開發者提供嘅整合指南。

延伸閱讀

Tutorial用 Python 攞匯率閱讀 Reference點讀 source 同 market_session閱讀 Guide一次呼叫攞歷史匯率閱讀
更多比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
學習Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
即時匯率EUR/USDGBP/USDUSD/JPY