コンテンツにスキップ

通知システム

概要

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 クラスで設定:

WEBHOOK_URL = "https://hooks.slack.com/services/..."

通知フォーマット

🚨 AEGIS Alert

🔴 IBKR: TWS未起動
🔴 ThetaData: ポート25503未起動

---
Timestamp: 2025-11-30 10:30:00 JST

SMS通知 (Twilio)

目的

IBKR障害時の緊急通知に特化しています。

IBKRがダウンすると取引が完全に停止するため、最も優先度の高いアラートとしてSMSで通知します。

通知条件

条件 動作
IBKRステータスが disconnected SMS送信
IBKRステータスが connected に復旧 復旧SMS送信

通知間隔

時間帯 間隔
市場時間中 (9:30-16:00 ET) 30分
市場時間外 1時間

設定

Twilio認証情報は dashboard_web_v2.py 内の TwilioSMSNotifier クラスで設定:

ACCOUNT_SID = "AC..."
AUTH_TOKEN = "..."
FROM_NUMBER = "+1..."
TO_NUMBER = "+81..."

SMSフォーマット

障害時:

AEGIS緊急:
IBKRが停止中 (TWS未起動)です。
取引不可です。
2025-11-30 10:30

復旧時:

AEGIS: IBKR復旧しました


実装詳細

モニタースレッド

ダッシュボード起動時に 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が届かない

  1. Twilioモジュールの確認

    python -c "from twilio.rest import Client; print('OK')"
    

  2. 認証情報の確認

  3. Account SID、Auth Token、電話番号が正しいか確認

  4. 手動テスト送信

    from twilio.rest import Client
    client = Client(ACCOUNT_SID, AUTH_TOKEN)
    msg = client.messages.create(
        body="Test",
        from_=FROM_NUMBER,
        to=TO_NUMBER
    )
    print(msg.sid)
    

Slack通知が届かない

  1. Webhook URLの確認
  2. Slackアプリ設定でWebhook URLが有効か確認

  3. ネットワーク確認

    curl -X POST -H 'Content-type: application/json' \
      --data '{"text":"Test"}' \
      https://hooks.slack.com/services/...
    

通知が重複する

ダッシュボードが頻繁に再起動されると、状態がリセットされて通知が重複する可能性があります。

  • ダッシュボードのプロセスが安定して稼働しているか確認
  • launchd でデーモン化することを推奨

関連ファイル

ファイル 説明
scripts/dashboard_web_v2.py SlackNotifier, TwilioSMSNotifier クラス

今後の拡張予定

  • トレード約定時のSlack通知
  • 日次P&Lサマリーの自動送信
  • VIXスパイク時のアラート
  • ポジションリスク警告