Tutorial/PythonでUSD/IDRの為替アラートを作る

PythonでUSD/IDRの為替アラートを作る

標準ライブラリだけで、閾値を一度だけ通知し、安全に状態を保存し、鮮度とAPI制限を守るPythonモニターを作る。

ERexchangerate.dev·Sep 8, 2026·8分で読める

アラートはHTTPの呼び出し時刻ではなく、新しく有効になったUSD/IDR観測値を前回の観測値と比較する。初回は基準値だけを保存し、古いデータやエラーでは状態を変えない。

Key points
IDRの判定には sources["IDR"]effective_at["IDR"] を使う。全体のsourceは要求した通貨の保守的な要約である。
最初の有効な観測は基準値だけ。閾値を越えたら一度だけ通知して解除し、後の観測が閾値未満に戻ったとき再武装する。
同じディレクトリの一時ファイルにJSONを書き、0600にしてから os.replace で置き換える。
10秒のタイムアウトを使い、キーは EXCHANGERATE_API_KEY に置く。最小60秒間隔にし、429では状態を保って Retry-After を守る。
完全なスクリプトをダウンロードし、閾値と状態パスをソース管理外で設定する。通知はローカルコンソールだけに出す。

通貨ごとの観測をモデル化する

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=false1回
重複・古い観測またはエラー状態を維持なし

状態を安全に保存する

同じディレクトリの一時ファイルに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

ネットワークとクォータを制限する

10秒のタイムアウトを使い、キーは EXCHANGERATE_API_KEY に置く。最小60秒間隔にし、429では状態を保って Retry-After を守る。 5分間隔の既定値は30日で約8,640回、60秒間隔は約43,200回で、共有クォータを超える可能性がある。

エラーで誤ったアラートを作らない
10秒のタイムアウトを使い、キーは EXCHANGERATE_API_KEY に置く。最小60秒間隔にし、429では状態を保って Retry-After を守る。

完全なモニターを実行する

完全なスクリプトをダウンロードし、閾値と状態パスをソース管理外で設定する。通知はローカルコンソールだけに出す。 既定の最大経過時間は1時間。日次参照や市場休場を使う場合は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

市場を待たずにポリシーをテストする

初回、閾値未満、クロス、同じeffective_at、古い観測、再武装、二回目のクロスをネットワークモックでテストする。

ER
exchangerate.dev
FXデータを扱う開発者向けの統合ガイド。

関連記事

TutorialPythonで為替レートを取得する方法読む Referencesourceと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参照レートの解説
ライブレートEUR/USDGBP/USDUSD/JPY