前にビットコイン(仮想通貨)のシステムトレードを coincheck API を使って行っていました。
システム構築手順はこちらに書きました。
成績はこちらに書きました。
ビットコインのチャートは価格がよく動くうえに値幅が大きいのでデイトレにハマっており、着実に利益が積み重なっていたものの、最近では価格が高騰したことで暴落のリスクが高まっていることや、アルトコインのほうに大きな資金が流れていることを感じ始めていました。
どうせならビットコインではなくアルトコインに回したほうが資金効率が良さそうだという結論に至り、リップル(XRP)に切り替えてシステムトレードを行うことにしました。
Coincheck API だと現在はビットコインの取引しか対応していないので、アルトコインの売買もできる bitbank のAPIを使うことにしました。
ここでは、bitbank API、Ruby on Rails、Heroku を使って、ビットコイン(仮想通貨)の自動売買を行うシステムトレードプログラムを構築する手順をまとめていきます。
プログラミングの知識不要で自動売買ができるアプリもあります
目次
bitbank(ビットバンク)に登録
まずは仮想通貨の取引所である bitbank(ビットバンク)に登録します。
公式サイトビットバンク
bitbank(ビットバンク)でAPIキーを作成
ログインして、メニューから「API」をクリックし、APIページが表示されたら「APIキーの発行」をクリック。
するとAPIキーの発行ウィンドウが現れます。
ラベルは自分のわかりやすい好きな名前をつけます。APIを何に使うか後からわかるようにしておくと良いでしょう。
権限はAPIを使ってなんの動作を行えるようにするか設定します。今回作るシステムは注文と注文履歴の確認ができるようにしたいので、「参照」と「取引」を選択しておきました。
あとは二段階認証のキーを入力し、SMS確認コードを取得して送られてきたコードを入力し、「確認する」ボタンをクリックします。
確認ウィンドウが表示されたら「発行する」ボタンをクリックします。
これでAPIキーの発行が完了です。
「閉じる」ボタンをクリックして戻ります。
一覧に発行したAPIキーのラベルが表示されているので、「確認」ボタンをクリックします。
APIキーを発行したときと同様にして、二段階認証とSMS確認コードを記入し、「確認する」ボタンをクリック。
これでAPIキーとシークレットキーが確認できます。
シークレットキーは「表示」ボタンを押すと表示されます。
キーは外部に公開してはいけないので、取り扱い注意です。
それぞれのキーはあとで使うので、とりあえずここでの作業は終わりです。
Rails のアプリケーションを新規作成
ターミナルを開いて Heroku にログイン。
Heroku アカウントを持っていない方は作成する必要があります。
$ heroku login
Rails をインストール。
$ gem install rails --no-ri --no-rdoc
Rails アプリケーションを作成。
$ rails new myapp --database=postgresql
アプリケーションのディレクトリに移動。
$ cd myapp
Gem をインストール。
$ bundle install
ひとまず空のアプリケーションを Heroku へデプロイ
git でアプリケーションを管理させる。
$ git init
$ git add .
$ git commit -m "init"
Heroku 上でアプリケーションを新しく作成。
$ heroku create
Heroku へデプロイ。
$ git push heroku master
いちおうマイグレーションも実行しておく。
$ heroku run rake db:migrate
ひとまずこれで Heroku に空のアプリケーションがデプロイできました。
bitbank(ビットバンク)のAPIを使ってビットコインの売買注文を入れてみる
いよいよプログラムでビットコインの売買を行っていきます。
公式で便利なライブラリが用意されているので、それをありがたく使わせていただきます。
Gemfile
に以下の行を追加。
gem 'ruby_bitbankcc'
追加した gem をインストール。
bundle install
orders タスクを追加。
rails g task orders
すると lib/tasks/orders.rake
というファイルが作成されるので、ここに注文の処理を書いていこうと思います。
買い注文を入れるプログラム
50,000円で0.01BTCの買い注文を入れるソースコードを以下のように書いてみました。
最初に作成したアクセスキーやシークレットアクセスキーをこのコード内で使います。
namespace :orders do
desc "50,000円で0.01BTCの買い注文を入れる"
task :buy => :environment do
bbcc = Bitbankcc.new("アクセスキー", "シークレットアクセスキー")
response = bbcc.create_order('btc_jpy', "0.01", 50000, 'buy', 'limit')
result = JSON.parse(response)
if result['success'] == 1
puts "完了!"
end
end
end
実行するとこうなります。
$ rake orders:buy
完了!
「完了!」と表示されれば、買い注文ができたことになります。
売り注文を入れるプログラム
今度は60,000円で0.01BTCの売り注文を入れるソースコードを以下のように書いてみました。
さきほどの買い注文と要領はほとんど同じ。
namespace :orders do
desc "60,000円で0.01BTCの売り注文を入れる"
task :sell => :environment do
bbcc = Bitbankcc.new("アクセスキー", "シークレットアクセスキー")
response = bbcc.create_order('btc_jpy', "0.01", 60000, 'sell', 'limit')
result = JSON.parse(response)
if result['success'] == 1
puts "完了!"
end
end
end
実行するとこうなります。
$ rake orders:sell
完了!
「完了!」と表示されれば、売り注文ができたことになります。
注文を確認するプログラム
今度は現在入っている注文を確認するソースコードを以下のように書いてみました。
namespace :orders do
desc "現在 入っている注文を確認する"
task :check => :environment do
bbcc = Bitbankcc.new("アクセスキー", "シークレットアクセスキー")
response = bbcc.read_active_orders('btc_jpy')
result = JSON.parse(response)
result["data"]["orders"].each do |order|
puts "#{order['order_id']} - #{order['price']} / #{order['side']}"
end
end
end
実行するとこうなります。
$ rake orders:check
1000001 - 50000.0000 / buy
1000000 - 60000.0000 / sell
オーダーIDと、注文価格、買い注文か売り注文かが確認できます。
サンプルで作った自動売買システム
以下はサンプルで作った自動売買プログラム。
50,000円で買い注文、60,000円で売り注文を交互に入れるプログラムです。
1時間に1回などの頻度で定期的に実行する想定です。
namespace :orders do
desc "実行処理の説明"
task :update => :environment do
bbcc = Bitbankcc.new("アクセスキー", "シークレットアクセスキー")
# 注文一覧を確認して、前の注文が残っている場合は何もせずに終了
response = bbcc.read_active_orders('btc_jpy')
result = JSON.parse(response)
if result["data"]["orders"].count > 0
exit
end
# 連続で注文するとエラーになることがあるのを回避
sleep 1
response = bbcc.read_ticker('btc_jpy')
ticker = JSON.parse(response.body)
raise 'エラー' unless ticker['success'] == 1
last_rate = ticker['data']['last'].to_f
# 連続で注文するとエラーになることがあるのを回避
sleep 1
if last_rate > 60000
# 現在のレートが60000円を超えたら、50000円で買い注文を入れる
response = bbcc.create_order('btc_jpy', "0.01", 50000, 'buy', 'limit')
result = JSON.parse(response)
raise 'エラー' unless result['success'] == 1
elsif last_rate < 50000
# 現在のレートが50000円を下回ったら60000円で売り注文を入れる
response = cc.create_orders(rate: 60000, amount: "0.01", order_type: "sell")
body = JSON.parse(response.body)
raise 'エラー' unless body['success']
end
end
end
とりあえずAPIを組み合わせてみた例なので、実用で使う場合はもっと複雑になると思います。
作成したプログラムを Heroku 上で動かす
作成したプログラムを Heroku にデプロイします。
git push heroku master
次に、ウェブブラウザで Heroku のサイトにログインして、「Heroku Scheduler」アドオンを追加します。
このアドオンを使って、Heroku に反映した自動売買タスクを定期的に実行させることができます。
「Heroku Scheduler」アドオンの設定ページに移動したら、タスクの実行コマンドを入力し、実行間隔を10分ごとに設定して保存します。
Heroku のコマンドで実行されているログを確認できます。
heroku logs -t
まとめ
これで自動売買を行うしくみをひととおり構築することができました。
あとは自分なりの注文条件ルールをプログラムで書いてアレンジしていくだけです。
ここで作成したプログラムは買いと売り注文ひとつずつしか対応していないシンプルなものですが、データベースで注文を管理することでより細かな注文に対応したシステムが構築できると思います。
あとはせっかく Ruby on Rails を使っているので、損益計算も画面で確認できるようにするなど夢が広がりますね!
実際にこのしくみで資産を運用しています
実際にリップル(XRP)で運用し始めたので、また機会があれば成績なども公開できればと思います。
Coincheck API を使ってコーディングした例もあります。
ビットコインで自動売買してみた結果はこちらに書きました。