bitbankの(自動売買)ruby APIの使い方

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

  1. Bitbankcc.new

    オブジェクト作成、ログインみたいな感じですね。

  2. 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分間の売買履歴を読み込むことができると推測します。

  3. 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ページにおいても、左右に文字の流れるティッカー表示が用いられる場合が珍しくない。
    だそうです。

    正直現時点この数字を見てもあまり意味が分かりません。^^;

  4. 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"],...(略)...
    

    いわゆる画面で見る以下のことだと思います。

  5. 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円入ってるのが分かりますね。^^;

  6. read_active_orders

    有効な注文を読み込む用です。
    何もなければ、こんな感じで返ってきます。

    => "{\"success\":1,\"data\":{\"orders\":[]}}"
    

    注文がある場合は後述します。

  7. 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万円の残高がある時点で購入されるんでしょうかね?!

  8. 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\":[]}}"
    

    注文が入っていないことが分かります。

  9. 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}]}}"
    
  10. read_withdrawal_account

    取りやめのアカウントを読み込む用?
    ここは不明です。
    とりあえず実行してみるとこうなります。

    bbcc.read_withdrawal_account('btc')
    => "{\"success\":1,\"data\":{\"accounts\":[]}}"
    

    パラメーターに通貨の記号がありますので、取りやめになった取引なら分かるような気がしますが、なぜかアカウントですね。

  11. request_withdrawal

    前項と似た理由で、不明です。
    bitbankの「アカウント」メニューに「アカウント連携」があり、bitbank Tradeとのアカウント連携などの情報がありますので、それ関連かもしれません。

  12. 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

2件のコメント
  1. こんにちは。
    このAPIは決済はできるんですか?

    1. こんにちは。
      決済とおっしゃっているのは、売買のことでしょうか?
      売買なら、実際やってみたように、一通りできます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です