通知システム¶
概要¶
AEGISは、システム障害やトレードイベントを自動的に通知する機能を備えています。
- Slack通知: 全コンポーネントの状態変化を通知
- SMS通知 (Twilio): IBKR障害時の緊急通知
アーキテクチャ¶
┌─────────────────────────────────────────────────────────────┐
│ Dashboard (Flask) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ SlackNotifier │ │ TwilioSMSNotifier│ │
│ │ │ │ │ │
│ │ - 全コンポーネント│ │ - IBKR専用 │ │
│ │ - 市場時間30分 │ │ - 市場時間30分 │ │
│ │ - 時間外1時間 │ │ - 時間外1時間 │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Slack Webhook │ │ Twilio API │ │
│ │ #aegis-alerts │ │ SMS → 携帯電話 │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Slack通知¶
監視対象¶
| カテゴリ | コンポーネント | 通知条件 |
|---|---|---|
| Data Sources | IBKR | disconnected |
| Data Sources | ThetaData | disconnected |
| Data Sources | Polygon | disconnected |
| Data Sources | Unusual Whales | error |
| Data Sources | Barchart | error |
| Internal | Paper Trading Bot | stopped |
| Internal | Cloudflare Tunnel | stopped |
通知間隔¶
| 時間帯 | 間隔 |
|---|---|
| 市場時間中 (9:30-16:00 ET) | 30分 |
| 市場時間外 | 1時間 |
設定¶
Slack Webhook URLは dashboard_web_v2.py 内の SlackNotifier クラスで設定:
通知フォーマット¶
SMS通知 (Twilio)¶
目的¶
IBKR障害時の緊急通知に特化しています。
IBKRがダウンすると取引が完全に停止するため、最も優先度の高いアラートとしてSMSで通知します。
通知条件¶
| 条件 | 動作 |
|---|---|
IBKRステータスが disconnected |
SMS送信 |
IBKRステータスが connected に復旧 |
復旧SMS送信 |
通知間隔¶
| 時間帯 | 間隔 |
|---|---|
| 市場時間中 (9:30-16:00 ET) | 30分 |
| 市場時間外 | 1時間 |
設定¶
Twilio認証情報は dashboard_web_v2.py 内の TwilioSMSNotifier クラスで設定:
SMSフォーマット¶
障害時:
復旧時:
実装詳細¶
モニタースレッド¶
ダッシュボード起動時に start_notification_monitor() が呼ばれ、バックグラウンドスレッドで30秒間隔の監視が開始されます。
def start_notification_monitor():
def monitor_loop():
while True:
status_data = get_detailed_status()
# Slack通知(全コンポーネント)
_slack_notifier.check_and_notify(status_data)
# SMS緊急通知(IBKRのみ)
ibkr_status = status_data.get("status", {}).get("data_sources", {}).get("ibkr", {})
_sms_notifier.check_ibkr_and_alert(ibkr_status)
time.sleep(30)
thread = threading.Thread(target=monitor_loop, daemon=True)
thread.start()
状態管理¶
各Notifierはインスタンス変数で状態を管理:
| 変数 | 用途 |
|---|---|
_last_ibkr_alert |
最後にアラートを送信した時刻 |
_ibkr_was_down |
前回チェック時にダウンしていたか |
_last_ibkr_healthy |
最後にIBKRが正常だった時刻 |
トラブルシューティング¶
SMSが届かない¶
-
Twilioモジュールの確認
-
認証情報の確認
-
Account SID、Auth Token、電話番号が正しいか確認
-
手動テスト送信
Slack通知が届かない¶
- Webhook URLの確認
-
Slackアプリ設定でWebhook URLが有効か確認
-
ネットワーク確認
通知が重複する¶
ダッシュボードが頻繁に再起動されると、状態がリセットされて通知が重複する可能性があります。
- ダッシュボードのプロセスが安定して稼働しているか確認
launchdでデーモン化することを推奨
関連ファイル¶
| ファイル | 説明 |
|---|---|
scripts/dashboard_web_v2.py |
SlackNotifier, TwilioSMSNotifier クラス |
今後の拡張予定¶
- トレード約定時のSlack通知
- 日次P&Lサマリーの自動送信
- VIXスパイク時のアラート
- ポジションリスク警告