// 生成AI×Botで副業を仕組み化するリアルな記録
AI・Bot開発

PythonでXRP自動売買botを作る:指値注文で稼ぐ仕組み全解説

PythonでXRP自動売買botを作る:指値注文で稼ぐ仕組み全解説

前回の記事では、bitbankのマイナスメイカー手数料(-0.02%)を収益源にする戦略の考え方を紹介した。今回はもう一歩踏み込んで、わたしが実際に作ったbotの設計——注文フローの全体像、ミッドプライスの使い方、設定パラメータの意味——を解説していく。


1. botの全体像

まずは処理の流れを大きく把握しておこう。

[起動]
  ↓
板情報をリアルタイムで受信(PubNub)
  ↓
ミッドプライスを計算
  ↓
売り指値注文を板に置く
  ↓
約定を検知
  ↓
買い戻し指値注文を置く
  ↓
約定を検知 → ポジション決済
  ↓
最初に戻る(ループ)

このサイクルをbotが自動で繰り返す。人間がやることは基本的に「起動」と「停止」だけだ。

リアルタイムの板情報はPubNubというサービスを通じて受け取っている。bitbankがPubNub経由で板の変化や約定情報を配信しているので、それをbotが受け取って即座に反応できる仕組みになっている。


2. 注文価格の計算:ミッドプライスを基準にする

注文を置く価格は、**ミッドプライス(中間価格)**を基準に計算している。

ミッドプライス = (最良売り気配 + 最良買い気配)÷ 2

「最良売り気配」とは板の中で一番安い売り注文の価格、「最良買い気配」とは一番高い買い注文の価格のこと。その中間点がミッドプライスだ。

これを基準に、売り注文と買い戻し注文の価格を以下のように決める。

売り注文価格 = ミッドプライス × 1.001    (0.1%上)
買い戻し価格 = min(直前の約定価格, 現在のミッドプライス) × 0.999

買い戻しの計算式が少し独特なので補足しておく。

最初は「平均建値の少し下に買い戻しを置く」設計にしていたが、これだと相場が動いたときに買い戻しが遠すぎて約定しないケースが増えてしまった。そこで「直前の約定価格」と「現在のミッドプライス」の低い方を基準にすることで、相場の動きに柔軟に追随しつつ、できるだけ早く買い戻せるようになった。

約定が速くなれば1日のサイクル数が増え、メイカーリベートの積み上がりも早くなる。


3. .envの設定パラメータ

botの動作は .env というファイルで管理している。コードを直接書き換えなくても、このファイルの数値を変えるだけで動作を調整できるようにした。

現在の設定はこうなっている。

パラメータ 意味
ORDER_VALUE_JPY 500 1注文あたりの金額(円)
SPREAD_RATE 0.001 スプレッド率(0.1%)
POSITION_TIMEOUT_SEC 3600 買い戻し注文を板に残しておく最大時間(秒)

ORDER_VALUE_JPYは1回の注文サイズ。500円に設定しているのは、リスクを抑えながら動作を確認するためだ。慣れてきたら金額を上げることもできる。

SPREAD_RATEは売り価格と買い戻し価格の幅を決める。0.001(0.1%)に設定すると、ミッドプライスから上下0.1%ずつ離れた位置に注文が置かれる。スプレッドを広げると1回あたりの利益は増えるが、約定しにくくなる。狭めると約定頻度は上がるが1回あたりの利益は減る。このバランスが設計の肝だ。

POSITION_TIMEOUT_SECは、買い戻し注文を板に残しておく最大時間の設定。3600秒(1時間)経っても約定しない場合は注文をキャンセルして出し直す。相場が大きく動いて買い戻し価格がずれてしまったときに、古い注文をいつまでも残さないようにするための仕組みだ。


4. 約定検知の仕組み

売り注文が約定したことをどうやって検知するか——ここが地味に重要な部分だ。

PubNubを通じてリアルタイムに板情報と約定情報が届くので、自分の注文IDと照合して約定を検知している。約定を検知したら即座に次のアクション(買い戻し注文を置く)に移る。

ただしここで落とし穴があって、約定の通知が短時間に連続して届いたとき、処理が重なって重複注文が発生することがあった。これは「フラグ管理」で解決している。処理中はフラグを立てて他の処理をブロックし、完了したらフラグを下ろす、というシンプルな仕組みだ。

バグとの格闘については次回の記事でたっぷり話す予定なので、ここでは触れる程度にとどめておく。


5. ポジション管理

botが取引するのはショートポジション(売りから入る取引)だ。ポジションが建っている状態では、現在の建玉数量・平均建値をbotが常に把握している。

注意が必要なのが、botを再起動したときのポジション復元だ。

起動時にAPIを叩いてポジション情報を取得し、前回の状態を引き継ぐようにしている。これをきちんと実装しておかないと、再起動のたびにポジションをゼロと誤認識して、存在しないはずの注文を出し続けてしまう。実はこのバグで最初かなりハマった。


6. まとめ・次回予告

今回のポイントをまとめるとこうなる。

  • 板情報はPubNubでリアルタイム受信
  • 注文価格はミッドプライスを基準に計算
  • 買い戻し価格は「直前の約定価格 or ミッドプライスの低い方 × 0.999」
  • 動作パラメータは.envで管理(注文サイズ・スプレッド・タイムアウト)
  • ポジションは再起動時にAPIから復元する

次回は、このbotを作る過程で遭遇した5つの重大バグとその修正を紹介する。「動いているのに結果がおかしい」という状況がいかに怖いか、デバッグの記録を正直に書いていく。


使用技術:Python / python-bitbankcc / PubNub / python-dotenv