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