読者です 読者をやめる 読者になる 読者になる

そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

ビットコイン取引所BTCボックスのAPIを叩くgem作った

ここのところエンジニアっぽいエントリなかったなー&たまにRuby使っとかないと忘れちゃうなーということで。

github.com

最終的には自動取引とかやってみたいけど、ひとまず第一段階としてAPIを一通り叩けるもの作ってみた。

導入

色々Rubyの作法わかってないとかテスト書いてないとか英語が不自由とかの事情があってRubygemsに登録するのは心苦しかったのでとりあえずGithubにだけ。

specific_installを使ってインストールする。

$ gem install specific_install
$ gem specific_install -l "https://github.com/blue1st/btcbox.git"

API

やりたいことに応じて必要なAPIキーをあらかじめ取得しておく。

ログイン後に「財産センター」内の「APIキーの取得」ページから取得できる。

https://www.btcbox.co.jp/api/secret/keys/

API 概要 APIキー
Ticker 売り気配・買い気配・24時間での出来高など 不要
Depth 注文量 不要
Orders オーダーブック 不要
Blance アカウントの情報 読み出しのみ
Wallet 口座のアドレス 読み出しのみ
Trade List 注文一覧 読み出しのみ
Trade View 注文の詳細 読み出しのみ
Trade Cancel 注文のキャンセル 読み書き
Trade Add 注文の追加 読み書き

使い方

オブジェクト生成時に必要に応じてAPIキーをつっこんでおく。

第一引数でコインの種類を指定(デフォルトはBitCoin)、あとはAPIに応じて指定する感じ。

require 'btcbox'

btc = Btcbox::Client.new(PUBLIC_KEY,  SECRET_KEY)

btc.ticker(["btc"|"ltc"|"doge"])

btc.depth(["btc"|"ltc"|"doge"])

btc.orders(["btc"|"ltc"|"doge"])

btc.balance()

btc.wallet(["btc"|"ltc"|"doge"])

btc.trade_list(["btc"|"ltc"|"doge"], [since], ["open"|"all"] )
#第二引数としてunixtimeを入れると、その時点以降の一覧となる
#第三引数は"open"を指定すると未完了の注文のみ、"all"だと完了したものやキャンセルしたものを含めた一覧が返る

btc.trade_view(["btc"|"ltc"|"doge"], id)
#第二引数にtrade_listなどで取得したidを指定する

btc.trade_cancel(["btc"|"ltc"|"doge"], id)
#第二引数にtrade_listなどで取得したidを指定する

btc.trade_add(["btc"|"ltc"|"doge"], amount, price, ["buy"|"sell"])
#第二引数に個数、第三引数価格、第四引数に売買のいずれかを指定する

みたいな感じ。

戻り値の子細は公式のドキュメントを見るとよい。

https://www.btcbox.co.jp/help/api.html


ワンライナーではこんな感じ。

$ ruby -rbtcbox -e'b=Btcbox::Client.new();cnt=0;b.orders.each{|o|cnt+=1;puts "#{cnt},#{Time.at(o["date"].to_i)},#{o["price"]},#{o["amount"]}"}'
1,2015-12-13 14:49:33 +0900,52973,0.808
2,2015-12-13 14:50:43 +0900,52926,0.4235
3,2015-12-13 14:51:39 +0900,52952,2.7395
…
97,2015-12-13 15:54:25 +0900,52813,0.52
98,2015-12-13 15:54:57 +0900,52832,0.254
99,2015-12-13 15:55:53 +0900,52815,0.2655
100,2015-12-13 15:56:23 +0900,52802,0.34

今回はAPIごとにわざわざ関数を用意するベタな実装をしちゃったけど、Rubyだともう少し効率的な作りにできそう。

↓また読んでる途中なんだよね・・・

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

あと引数の取り方なんかももっと工夫の余地がありそうな気がする。

何はともあれ目的は達したので今回はここまで。