botによる仮想通貨の自動売買をやってみたいと思い、bitbankにアカウントを作り、5千円振り込んでみました。
最終的にはRailsで動かそうと思ったので、rubyを選びました。
いざやろうと思ったら、現時点公式のドキュメントがあまりにもシンプルであることが分かりました。Orz Orz Orz
こちらが公式APIの紹介です。
bitbank.cc API
そして、rubyのライブラリはこちらです。
https://github.com/bitbankinc/ruby_bitbankcc
rubyライブラリに関するドキュメントは「Installation」と「Usage」だけであり、使う例があって参考になりますが、各メソッドとパラメーターの説明がなかったので、ここで調査した結果をまとめたいと思います。
※現時点最終更新日は2017年12月5日で、10ヶ月未更新ということになります。大丈夫かな?!rubyはマイナーだった?!
※今回はお金と直接関係する部分ですので、改めて申し上げますと、ここで書いたものは私がnode.jsやJavaライブラリの参考や私自身が試した結果を基づいた情報ですので、実際操作による過失などには一切責任負いかねます。m(_ _)m
#!/usr/bin/env ruby -Ilib
require 'ruby_bitbankcc'
bbcc = Bitbankcc.new("YOUR API KEY", "YOUR SECRET KEY") #1
bbcc.read_transactions('btc_jpy') #2
bbcc.read_ticker('btc_jpy') #3
bbcc.read_order_books('btc_jpy') #4
bbcc.read_balance() #5
bbcc.read_active_orders('btc_jpy') #6
bbcc.create_order('btc_jpy', "0.001", 130000, 'buy', 'limit') #7
bbcc.cancel_order('btc_jpy', order_id) #8
bbcc.read_trade_history('btc_jpy') #9
bbcc.read_withdrawal_account('btc') #10
bbcc.request_withdrawal('btc', 'ACCOUNT UUID', '0.001', 'OTP TOKEN', 'SMS TOKEN') #11
JSON.parse(response.body) #12
-
Bitbankcc.new
オブジェクト作成、ログインみたいな感じですね。
-
read_transactions
そのまま実行すると
=> <RestClient::Response 200 "{\"success\":...">
という感じで出ます。
私最初にこれを見た時、なんぞやこれ!と思いましたね。
実は#12のJSON解析で返ってきたレスポンスが見れますので以下実行すれば結果の中身が見れます。
response = bbcc.read_transactions('btc_jpy')
JSON.parse(response.body)
こんな感じになると思います。
=> {"success"=>1, "data"=>{"transactions"=>[{"transaction_id"=>22250944, "side"=>"sell", "price"=>"724766", "amount"=>"0.0070", "executed_at"=>1539801871742}, {"transaction_id"=>22250943, "side"=>"buy", "price"=>"724913", "amount"=>"0.0081", "executed_at"=>1539801870475}, ...(略)...
結果の中に”executed_at”のところにタイムスタンプようなものが押され、[“data”][“transactions”]のサイズが60であることから、この文は過去1分間の売買履歴を読み込むことができると推測します。
-
read_ticker
上記と同じく下記ので中身見れます。以降説明省略します。
JSON.parse(bbcc.read_ticker('btc_jpy').body)
こんな感じの結果が返ってきます。
=> {"success"=>1, "data"=>{"sell"=>"725989", "buy"=>"725700", "high"=>"730900", "low"=>"720555", "last"=>"725914", "vol"=>"1421.6657", "timestamp"=>1539803448525}}
これは、、、ティッカーというのは、、、weblioのIT辞書によると、
ティッカーとは、特定範囲内に文字列を流して表示させる表示方式のことである。右から左(あるいは上から下へ)文字が次々に流れてゆくのを読ませる方式であるので、限られた狭い領域で多くの情報を表示することができる。
ティッカーの代表的な例としては、新幹線の車内や看板、証券取引所などにある電光掲示板がある。Webページにおいても、左右に文字の流れるティッカー表示が用いられる場合が珍しくない。
だそうです。
正直現時点この数字を見てもあまり意味が分かりません。^^;
-
read_order_books
現時点の取引量(?専門用語がありそうな、、)を取得できます。
JSON.parse(bbcc.read_order_books('btc_jpy').body)
実行すると、こんな感じで返ってきます。
=> {"success"=>1, "data"=>{"asks"=>[["726850", "0.0087"], ["726860", "0.0040"], ["726861", "0.0246"], ["726862", "0.2485"], ["726998", "0.0090"],
...(中略)...
"bids"=>[["726800", "0.1209"], ["726672", "0.0076"],...(略)...
いわゆる画面で見る以下のことだと思います。
-
read_balance
残高確認ですね。実行するとそのままJSON形式で返ってきます。
=> "{\"success\":1,\"data\":{\"assets\":[{\"asset\":\"jpy\",\"amount_precision\":4,\"onhand_amount\":\"5000.0000\",\"locked_amount\":\"0.0000\",\"free_amount\":\"5000.0000\",...(略)...
5000円入ってるのが分かりますね。^^;
-
read_active_orders
有効な注文を読み込む用です。
何もなければ、こんな感じで返ってきます。
=> "{\"success\":1,\"data\":{\"orders\":[]}}"
注文がある場合は後述します。
-
create_order
注文です。
正直これだけが大事のように思えます。
他のメソッドのほとんどがreadですので、これらは間違ってもほしい情報が返ってこないだけですが、注文(買い売り)を間違えるとお金が返ってこないことになるかもしれません。
ここパラメーターは以下に意味のようです。
順番 |
例 |
意味 |
1 |
btc_jpy |
公式は「チャンネル」という名前になってますが、取引通貨のペア
必要に応じて”btc_jpy”の部分を”xrp_jpy”, “ltc_btc”, “eth_btc”, “mona_jpy”などに変更
|
2 |
0.001 |
ビットコインの額面、他のチャンネルもあるので、正確に言うと、”btc_jpy”の前者の額面だと思われる |
3 |
130000 |
円の額面、上記の同じ理由で、”btc_jpy”の後者の額面だと思われる |
4 |
buy |
買うならbuy, 売るならsell |
5 |
limit |
注文種類
指値ならlimit、成行ならmarket |
なので、上記の意味合わせて、例の意味は130000円で0.001ビットコインを指値で買う注文になっています。
例えば今は5000円しかないんですが、上記例をそのまま実行するとこうなります。
bbcc.create_order('btc_jpy', "0.001", 130000, 'buy', 'limit')
=> "{\"success\":1,\"data\":{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"status\":\"UNFILLED\"}}"
そして、一つ前の有効な注文を確認するメソッドを利用すると、今の注文を確認することができます。
bbcc.read_active_orders('btc_jpy')
=> "{\"success\":1,\"data\":{\"orders\":[{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"status\":\"UNFILLED\"}]}}"
statusが「UNFILLED」になっているので、その注文をそのまま残せば、13万円の残高がある時点で購入されるんでしょうかね?!
-
cancel_order
注文のキャンセルです。
上記の注文キャンセルには
bbcc.cancel_order('btc_jpy', 435106822)
=> "{\"success\":1,\"data\":{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"canceled_at\":1539848335003,\"status\":\"CANCELED_UNFILLED\"}}"
もう一度注文を確認すると
bbcc.read_active_orders('btc_jpy')
=> "{\"success\":1,\"data\":{\"orders\":[]}}"
注文が入っていないことが分かります。
-
read_trade_history
取引履歴の読み込み用です。
例えば成行で0.0001で買う注文をするには
bbcc.create_order('btc_jpy', "0.0001", 0, 'buy', 'market')
=> "{\"success\":1,\"data\":{\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"start_amount\":\"0.00010000\",\"remaining_amount\":\"0.00010000\",\"executed_amount\":\"0.00000000\",\"average_price\":\"0.0000\",\"ordered_at\":1539849149642,\"status\":\"UNFILLED\"}}"
さらに、有効な注文を確認すると
bbcc.read_active_orders('btc_jpy')
=> "{\"success\":1,\"data\":{\"orders\":[]}}"
注文が処理されたことが分かります。
ここのstatusもが「UNFILLED」なんですね?!
じゃあ、上記の13万円の注文の予想は違うかもしれません。^^;
そして、その履歴を確認すると
bbcc.read_trade_history('btc_jpy')
=> "{\"success\":1,\"data\":{\"trades\":[{\"trade_id\":45463140,\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"726904.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539775614206}]}}"
-
read_withdrawal_account
取りやめのアカウントを読み込む用?
ここは不明です。
とりあえず実行してみるとこうなります。
bbcc.read_withdrawal_account('btc')
=> "{\"success\":1,\"data\":{\"accounts\":[]}}"
パラメーターに通貨の記号がありますので、取りやめになった取引なら分かるような気がしますが、なぜかアカウントですね。
-
request_withdrawal
前項と似た理由で、不明です。
bitbankの「アカウント」メニューに「アカウント連携」があり、bitbank Tradeとのアカウント連携などの情報がありますので、それ関連かもしれません。
-
JSON.parse(response.body)
前述の通り、JSON解析です。
公式の紹介では、これを最初のところに持っていくべきだと思います。
一通り以上です。
最後に先程買った0.0001ビットコインを売りたいと思います!
bbcc.create_order('btc_jpy', "0.0001", 0, 'sell', 'market')
=> "{\"success\":1,\"data\":{\"order_id\":497525118,\"pair\":\"btc_jpy\",\"side\":\"sell\",\"type\":\"market\",\"start_amount\":\"0.00010000\",\"remaining_amount\":\"0.00010000\",\"executed_amount\":\"0.00000000\",\"average_price\":\"0.0000\",\"ordered_at\":1539850841760,\"status\":\"UNFILLED\"}}"
そして、履歴を確認すると
bbcc.read_trade_history('btc_jpy')
=> "{\"success\":1,\"data\":{\"trades\":[{\"trade_id\":45678136,\"order_id\":497525118,\"pair\":\"btc_jpy\",\"side\":\"sell\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"724384.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539851053689},{\"trade_id\":45463140,\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"726904.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539850121143}]}}"
になります。
先程買った時の1ビットコインの単価は726904.0000で、売った時は724384.0000でしたので、-0.252円になりました。Orz