Bot

開発記録#180(2025/4/17)「Bybit最小構成BotにSlack通知機能を追加した開発ログ【pybotters v1.8.1対応】」

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

🧭 概要

この記事では、以前に構築した「最小構成のBybit自動取引Bot(Market Making Bot)」に、
Slack通知機能を追加した過程を記録しています。

Botが実際に注文を出したタイミングで、Slackに即時通知されることで、
ローカルでBotを実行しながらスマホでも結果を確認できる便利な構成が整いました。


🛠 変更前のBot構成(振り返り)

  • Python + pybotters v1.8.1(v2ではなく安定版を使用)
  • 板情報(Bid / Ask)をWebSocketから取得
  • Spreadがしきい値 s_entry を超えたときのみ、BUY / SELL の指値注文を出す
  • 最小構成なので、ログ出力はコンソールのみ、通知や監視機能は未実装

🔧 Step1:Slack通知用のWebhookを用意

Slackの「Incoming Webhook」アプリをワークスペースに追加し、
専用チャンネル用のWebhook URLを生成。

⚠️ Webhook URLは機密情報なので、config.jsonファイルに外部化しました。コード内には直接書きません。


📦 Step2:設定ファイル(config.json)を導入

{
  "bybit": {
    "apiKey": "YOUR_API_KEY",
    "secret": "YOUR_SECRET_KEY"
  },
  "slack_webhook_url": "https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"  ←※伏せてます
}

これにより、APIキーとSlack URLを一括管理できるようになりました。


✨ Step3:Slack通知関数を追加

async def notify_slack(webhook_url: str, message: str):
    async with aiohttp.ClientSession() as session:
        await session.post(webhook_url, json={"text": message})

Bot本体からこの関数を呼び出すことで、Slackに通知を飛ばします。


✅ 実際に送信されるSlackメッセージ

📈 MMBot Orders Executed!
> Pair: `BTCUSDT`
> Spread: `0.0016`
> 🟢 Buy @ `84750` | 🔴 Sell @ `84780`
> Lot: `0.01`

視覚的にも分かりやすく、スマホでも即確認できるフォーマットに。


📜 完成コードの構成(要点だけ)

  • get_orderbook():板情報を取得して返す
  • place_limit_order():注文を出す
  • notify_slack():Slack通知を送信
  • run_bot():スプレッドを計算し、条件成立時に注文と通知を行う
  • cli():コマンドライン引数を処理

🔁 実行結果の例(spreadが条件未満)

⏳ waiting for best bid/ask...
✅ spread = 0.00000, bid = 84089.9, ask = 84090.0
❌ Spread not wide enough. No orders placed.

Botは正常に動作し、spreadが狭かったため注文も通知も行わず終了。
このように、条件が合致しない限りは発注しないという設計により、無駄な取引を避けられます。


🔍 Slack通知導入の効果

観点メリット
🔔 通知性外出中でも取引の発生が確認できる
📱 即時性実行完了と同時に通知が届く
🔒 安全性Webhook URLはローカルのconfigに外部化し管理

🧭 次のステップ候補

  • ✅ 約定イベントの検知(実際に通ったかの確認)
  • ✅ spreadが条件を満たすまで自動ループで監視
  • ✅ 成約履歴・PnLのローカルログ保存
  • ✅ Slack通知を成功/失敗で分岐する実装

✍️ まとめ

今回の開発では、最小構成だった自作Botに「Slack通知機能」というアウトプットの可視化を加えたことで、
Botの行動ログをリアルタイムで受け取れるようになりました。

Botは黙って動くので、通知があると心理的にも運用しやすくなります
今後もSlack通知を中心に、監視・分析機能を強化していく予定です。

👇ラジオで話したこと

🎙️ こんにちは、仮想通貨bot開発ラジオ、よだかです。
今回は「開発記録#180」ということで、最小構成のBybit BotにSlack通知機能を追加したログをお届けします。


🧭 今回のテーマは「Botが喋るようになった」

Botって、基本的に黙って動くんですよね。
裏で静かに処理して、淡々と注文を出す。
でも今回は、その**「黙ってるBotに声を持たせる」**というテーマで、Slack通知機能を組み込みました。

結果として、Botが注文を出した瞬間にSlackに通知が飛ぶようになったので、
外出中でもスマホからリアルタイムで状況が確認できるようになりました。


🛠 開発の振り返りと導入手順

まず前提として、このBotは pybotters v1.8.1 を使った超最小構成のMarket Making Bot
板情報(Bid/Ask)をWebSocketで取得して、スプレッドが一定以上になったときだけ注文を出すという、
非常にシンプルなロジックです。

ただ、これまではコンソールにしかログを出していなかったので、実行中にBotが何をしたのかは、
ターミナルを開いていないと分からなかったんですよね。


🔧 Step1:Slack通知のためのWebhookを準備

まずは、Slackの「Incoming Webhook」機能を使って、専用チャンネルのURLを取得。
これは機密情報になるので、Botのコードには直接書かずに、config.json という外部ファイルに管理するようにしました。


📦 Step2:設定ファイルにまとめて管理

{
  "bybit": {
    "apiKey": "YOUR_API_KEY",
    "secret": "YOUR_SECRET_KEY"
  },
  "slack_webhook_url": "https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"
}

これによって、APIキーと通知URLを一元管理できるようになり、セキュリティ的にも安心です。


✨ Step3:Slack通知の関数を追加

Slackへの通知は aiohttp を使って、非同期でサクッと送れるようにしました。

async def notify_slack(webhook_url: str, message: str):
    async with aiohttp.ClientSession() as session:
        await session.post(webhook_url, json={"text": message})

発注時にこの関数を呼ぶことで、Slackに「買ったよ!」「売ったよ!」と通知が飛ぶ構成です。


📈 実際に届くSlack通知はこんな感じ

📈 MMBot Orders Executed!
> Pair: `BTCUSDT`
> Spread: `0.0016`
> 🟢 Buy @ `84750` | 🔴 Sell @ `84780`
> Lot: `0.01`

見た目もシンプルで、スマホでも一目で分かるフォーマットにしました。


🔁 条件が合わないときは発注しない

Botはspread(価格差)が狭いときは注文を出しません。
そのときのログはこんな感じ。

⏳ waiting for best bid/ask...
✅ spread = 0.00000, bid = 84089.9, ask = 84090.0
❌ Spread not wide enough. No orders placed.

このように、「発注しない」という判断も、ちゃんと可視化されています。


🔍 Slack通知を導入して得られたメリット

観点メリット内容
🔔 通知性外出中でもBotの挙動が確認できる
📱 即時性注文直後に通知が飛ぶので、タイムラグなし
🔒 安全性Webhook URLは外部ファイルで安全に管理

通知があるだけで、Botの運用に安心感が出るんですよね


🧭 今後のアップデート予定

  • ✅ 注文が「約定した」かどうかまで確認できるようにしたい
  • ✅ 条件を満たすまでBotを自動でループさせる機能も追加したい
  • ✅ 成約履歴や損益(PnL)をログに保存する機能も検討中
  • ✅ Slack通知も、成功/失敗を切り分けて出したい

✍️ まとめ

今回の開発で、Botに「Slack通知」という“声”が加わったことで、運用の安心感がグッと増しました
Botは黙っていてもちゃんと働いていますが、その動きを可視化することで、人間側の判断力やレスポンス力も上がるんですよね。

これからもBotの「通知力」と「観察力」を高めながら、使える・守れる・育てられるBot開発を進めていこうと思います。


🎙️ おまけコーナー:

「asyncioって何?」──Botを“同時進行で動かす”仕組み

Yodaka

asyncio は一見とっつきにくいけど、「Bot開発でどう役立つのか?」という現場目線で語ると、めちゃくちゃ面白いです。


こんにちは、よだかです。
今回のおまけコーナーでは、**Pythonの非同期処理ライブラリ「asyncio(アシンキオ)」**について、Bot開発者向けにざっくり解説してみます。


🧠 まず結論:「複数のことを同時に進めたいなら、asyncioは必須」

たとえば…

  • 板情報をずっと受け取りながら
  • チャンスが来たら即注文を出して
  • エラーが起きたらSlackにも通知して
  • ログもちゃんと記録しておきたい

──みたいな、**“複数のことを並行して動かしたい”**場面って、Botではよくありますよね。

普通に while True: とかでループを書いてると、一つの処理が終わるまで次の処理が待たされる(=同期処理)んです。

でも、asyncio を使うと…

✅ WebSocketで板を見ながら
✅ チャンスが来た瞬間に注文を出し
✅ 通知も非同期でSlackに飛ばす

──といったマルチタスク的な動きが、軽い処理でスッと書けるようになります。


🛠️ キーワード解説(やさしめ)

用語意味・イメージ
async def「非同期で動く関数を定義するよ〜」という印(=”準備モード”)
await「この処理が終わるまでちょっと待ってね!」という指示
asyncio.run()非同期処理をまとめて実行するためのスタートボタン

🧪 実際にどう使うの?

たとえばSlack通知の関数はこうでしたね:

async def notify_slack(url, message):
    async with aiohttp.ClientSession() as session:
        await session.post(url, json={"text": message})

ここでは async def で非同期関数を定義して、
中で await を使って「Slackにメッセージを送信する」処理を、ブロックせずに実行してるんです。

つまり、Slackへの通信中もBotは止まらずに動き続けられるということ!


🧩 ラジオ的まとめ

asyncioは「一つの脳で、複数のことを“ちょこちょこ切り替えながら進める”ための仕組み」なんですよね。
実際に複数のスレッドを立てるわけじゃないので軽くて早い。
Botの世界では、リアルタイムの反応速度と効率の両方が求められるから、asyncioはまさに相棒みたいな存在です。


💬 最後に:もし余裕があれば…

  • time.sleep()await asyncio.sleep() に置き換えると、Bot全体が止まらなくなる
  • 複数の処理を同時に走らせたいなら asyncio.gather() を使うと一発で並列実行できる
Yodaka

このあたりも含めて、次回のおまけコーナーで深掘りしてみても良いかもですね。

おまけ2.ChatGPTへの質問:asyncio(アシンキオ)って読み方合ってる?

結論から言うと──


✅ 読み方として正しいのは:

**「アシンキオ」でも通じるけど、英語的な発音は「アシンキオゥ(uh-SINK-ee-oh)」**に近いです。


🔤 英語の発音的に見ると:

  • asyncio = "async" + "io"
  • async は「エイシンク」
  • io は「アイ・オー」もしくは「イオー」

で、それを全部つなげて「エイシンキオゥ」っぽくなるんですが……


🎙️ ラジオや日本語圏の会話では:

「アシンキオ」 でOK!ほぼみんなそう言ってます。

PyCon(Pythonのカンファレンス)でも、日本の登壇者は「アシンキオ」と読んでることが多いですね。


🧩 まとめ:

読み方用途
アシンキオ日本語での一般的な呼び方(安心)
アシンキオゥ英語っぽい発音
エイシンクアイオー厳密に分解した読み方(やや不自然)

なので、ラジオでは:

「Pythonの非同期処理をやるときに使う“アシンキオ”ってやつですね」

でバッチリ伝わります!✌

もっと英語ネタや呼び方の裏話も欲しければ、そっちも掘れますよ~!

-Bot