old « bitbankのAPIでエラーコード「20001」が出るときの対処法 | メイン | 野毛山動物園のレッサーパンダ » new

bitbankのAPIを使ってrubyでBOT自動売買してみた

2018年04月08日

仮想通貨界隈では最近BOTを使った自動取引が流行ってみるみたい。

今年の初め辺りにbitbankで自動取引BOTを作ってたんだけど、APIが謎のエラーを吐いてどうしようも無かったから中断してた。
それが解決したので、3月中旬くらいからBOT作成を再開して、動かしてみてるところ。

■なんでbitbankなのか
界隈ではレバレッジを効かした取引が流行っているけど、これ以上損失を大きくしたくないし、そもそも自動売買初心者だから現物からやりたい。
bitbankは取引手数料が6月まで無料(2018/4/8現在)なので、どれだけ少額で売買しても手数料による損がない。
国内取引所のbitflayerとかzaifとかは手数料が取られたり、注文が通りにくかったりっていう噂が多いから、bitbankにした。

■使用言語
言語はrubyを使うよ。
界隈ではpythonがよく使われてるみたいだけど、python経験ないし、rubyが好きだからね。
APIはbitbank公式の「ruby_bitbankcc」を使うよ。

■APIインストール&使い方
インストールはこれでOK。

$ gem install ruby_bitbankcc

APIの使い方はRubyBitbankccのInstallationを読めば分かる。

基本形は以下。

bbcc = Bitbankcc.new("YOUR API KEY", "YOUR SECRET KEY")
bbcc.read_transactions('btc_jpy')

「read_transactions('btc_jpy')」の部分を呼び出したいAPIによって変えるだけでOK。

■売買戦略
自動売買の知識とかないから、思いつき戦略で行くよ。

・対象通貨はBTC/JPY。
・1回の注文は0.01BTC
・1秒ごとに価格をチェック。
・3分前と比べて、0.3%以上上昇/下落したら、現在の値段で売り/買い注文を入れる。(親注文)
 かつ、3分前の値段で買い/売り注文を準備する。(子注文)
・注文状況を監視して、親注文が約定したら、子注文を入れる。
・10分以内に親注文が約定しなかったら、親注文を取り消す。(子注文も破棄)
・3日以内に子注文が約定しなかったら、子注文を取り消す。

■実装方法
以下のスレッドを用意して、パラレルに動かす。

・価格取得スレッド
 1秒ごとの価格をリストに追加していくだけ。
 価格取得には「api.read_ticker()」を使う。

・注文スレッド
 1秒ごとに価格リストの現在の価格と3分前の価格(正確には60*3個前の価格)を比較して、価格差が0.3%以上なら、現在の資産を確認。
 資産確認には「api.read_balance()」を使う。

 残資産があって注文可能なら、親注文と子注文のインスタンスを生成。
 親注文に子注文を持たせて、親注文を親注文キューに追加。
 その後は一定時間(3分)待機する。(同じような注文を複数作らないようにするため)

・親注文実行スレッド
 0.1秒ごとに親注文キューを監視。(実際にはQueueのpopでスレッド自体が待機する)
 親注文が追加されていたら、親注文を実行して、子注文を子注文キューに追加する。
 注文実行には「api.create_order()」を使う。

・子注文実行スレッド
 0.1秒ごとに子注文キューを監視。(実際にはQueueのpopでスレッド自体が待機する)
 子注文が追加されていたら、親注文のステータスを確認。
 注文確認には「api.read_order()」を使う。

 親注文が約定していたら、子注文を実行。
 親注文が取り消し済みなら、子注文をキューから削除。
 親注文が約定・取り消しされてなければ、子注文をキューに戻す。
 親注文が一定時間(10分)約定しなければ、親注文を取り消す。

・取り消しスレッド
 1時間ごとにアクティブ注文を監視。
 アクティブ注文取得には「api.read_active_orders()」を使う。

 発注から一定時間(3日)経過している注文を取り消す。
 注文取り消しには「api.cancel_order()」を使う。

■ruby_bitbankccを改造
ruby_bitbankccはデフォルトだと設定するnonceが1秒単位なので、1秒より細かい単位API実行が出来ない。
なので、以下のように変更した。

ファイル:bitbankcc.rb

変更前:
nonce = Time.now.to_i.to_s
変更後:
nonce = Time.now.strftime("%Y%m%d%H%M%S%L")

同じ箇所が何ヶ所もあるので、全部同様に置換しておく。
これでミリ秒単位でnonceが設定されるから、より細かい単位でAPI実行が出来る。

API実行は1秒以上間隔を空けなければならないっていうような規約も特に無かった(見当たらなかった)ので、大丈夫だと思う。
というか、1秒間隔だと遅すぎて使い物にならない。

■運用実績
資産状況をちゃんと出力していないから、グラフとかは作れていない。
とりあえず、BTCがどのくらい変化したかだけ見てみると、こんな感じ。

BOT開始前(3/18):
 0.53856192 BTC
現在(4/8 14時):
 0.60934742198 BTC
 (0.42636192BTC + 136,122JPY。単価:743895 BTC/JPY)

BTCで見れば0.06BTCくらい増えた。

この期間ずっと今のアルゴリズムで動いてたわけでもなく、色々エラーで止まってたりした期間もあるから、実際の運用期間は分からない。
それでも少しはBTCが増えたので、悪くない感じ?

ただ、この間にBTC価格が90万円台から70万円台に下がってるから、単純にBTCの量で見ると増えて当然な気がしなくもない。
とは言っても、ちゃんと親注文+子注文が約定してるから、かなり少額だけど利益は出てるんじゃないかな。

■欠点とか改善点とか
・注文発動のトリガーが固定だけど、可変にした方が良いのかも知れない。
 0.3%固定だと、全然注文しない時間帯があったりする。
 逆に値動きが激しいときに0.3%で発動しちゃうと、もっと大きく幅取れたのになーってシーンがあったりする。

・このアルゴリズムはレンジ相場にしか向かないかも。
 上昇トレンドだと、安い価格での買い注文がドンドン溜まっていく。
 下降トレンドだと、高い価格での売り注文がドンドン溜まっていく。
 資産ロックを防ぐ為に一定期間での注文取り消しを実装したけど、親注文だけ約定して子注文を取り消すと、含み損になる。
 上昇/下降トレンド中でもある程度の値動きはあるから、そこで多少利益取れればまぁ良いのかなぁ。

■今後
とりあえずは今のままでもう少し様子を見て、何か良い案が浮かんだら改善していきたい。

■ソース
ソースはあまり綺麗じゃないのと、量が多いので載せるのはやめておくよ。
希望があれば載せるかも。

このエントリーをはてなブックマークに追加

old « bitbankのAPIでエラーコード「20001」が出るときの対処法 | メイン | 野毛山動物園のレッサーパンダ » new

トラックバックURL

このエントリーのトラックバックURL:
http://blog.hp-improve.com/mt/mt-tb.cgi/1621

コメントする