알림은 폴링 시각이 아니라 새로 유효해진 USD/IDR 관측을 이전 관측과 비교해야 합니다. 첫 관측은 기준만 만들고 오래된 데이터와 오류는 상태를 바꾸지 않습니다.
- IDR 판단에는
sources["IDR"]와effective_at["IDR"]를 사용하세요. 전체 source는 요청 통화의 보수적 요약입니다. - 첫 유효 관측은 기준입니다. 임계값을 넘으면 한 번 알리고 해제하며, 유효한 관측이 다시 임계값 아래로 내려가야 재설정합니다.
- 임시 JSON을 같은 디렉터리에 쓰고 0600으로 설정한 뒤
os.replace로 교체하세요. - 10초 timeout,
EXCHANGERATE_API_KEY, 최소60초 주기를 사용하세요.429에서는 상태를 유지하고Retry-After를 지킵니다. - 전체 스크립트를 내려받고 임계값과 상태 경로를 소스 관리 밖에서 설정하세요. 출력은 로컬 콘솔뿐입니다.
통화 관측 모델 만들기
IDR 판단에는 sources["IDR"]와 effective_at["IDR"]를 사용하세요. 전체 source는 요청 통화의 보수적 요약입니다.
from decimal import Decimaldef 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 상태에서 교차 | armed=false | 한 번 |
| 반복/오래된 관측 또는 오류 | 상태 유지 | 아니요 |
상태 안전하게 저장하기
임시 JSON을 같은 디렉터리에 쓰고 0600으로 설정한 뒤 os.replace로 교체하세요.
import jsonimport osimport tempfilefrom pathlib import Pathdef 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초 timeout, EXCHANGERATE_API_KEY, 최소60초 주기를 사용하세요.429에서는 상태를 유지하고 Retry-After를 지킵니다. 기본 5분 주기는 30일에 약 8,640회, 60초 주기는 약 43,200회라 공유 월간 한도를 넘을 수 있습니다.
10초 timeout, EXCHANGERATE_API_KEY, 최소60초 주기를 사용하세요.429에서는 상태를 유지하고 Retry-After를 지킵니다.
모니터 실행하기
전체 스크립트를 내려받고 임계값과 상태 경로를 소스 관리 밖에서 설정하세요. 출력은 로컬 콘솔뿐입니다. 기본 최대 데이터 연령은 1시간입니다. 일일 기준값이나 폐장 데이터를 허용하려면 FX_ALERT_MAX_AGE_SECONDS를 설정하세요. python-exchange-rate-alerts.py
chmod 700 python-exchange-rate-alerts.pyexport 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시장 없이 정책 테스트하기
기준, 교차, 반복 timestamp, 오래된 데이터, 재설정, 두 번째 교차를 네트워크 mock으로 테스트하세요.