はじめに
Zaif が公開している API を利用し、 Ruby で取引を行うまでの流れを簡単に説明していきたいと思います。 最下部の方に、逆指値で売注文を入れるプログラムを載せてます。
Zaif Exchange API でできること
Zaif が公開している API でできることは主に下記の2点です。
- Zaif における仮想通貨の取引価格情報の取得(公開情報 API)
公開情報 API については登録なしでも利用することができ、 HTTP の GET メソッドで取得する方法と、 Websocket でレスポンスを取得する方法の2通りあります。 - 現物、先物、レバレッジ取引の注文(現物、先物、レバレッジ取引 API)
こちらについては Zaif への登録と APIKey の発行が必要になります。
公開情報 API について
公開情報 API は下記6種類あります。
- currencies
有効な通貨情報 - currency_pairs
有効な通貨ペア情報 - last_price
現在の終値情報 - ticker
直近24時間の高値等の情報 - trades
取引履歴情報 - depth
板情報
例:終値の取得
下記の{通貨ペア}部分に、取得したい通貨ペアを入れ、 GET メソッドでリクエストを送信することで終値を取得できます。
https://api.zaif.jp/api/1/last_price/{通貨ペア}
{通貨ペア}の部分に入れることができる値は 下記の API で調べることができます。
https://api.zaif.jp/api/1/currency_pairs/all
BTC の終値を取得してみる
まずは試しにビットコインの終値を取得してみましょう。下記の URL に、 GET メソッドでリクエストを送信します( Web ブラウザで下記 URL にアクセスで確認できます)。
https://api.zaif.jp/api/1/last_price/btc_jpy
すると、結果が json で返ってきます。 下記の場合、 BTC の直近の終値が1,747,265円という意味です。
{"last_price": 1747265.0}
ちなみに websocket 版だと、直近の取引が ask (買い)か bid (売り)かの情報もついてきます。
公開情報 API って
websocket でデータをもらうこともできるので、興味のある人はそちらも使ってみてください。
現物取引 API
現物取引 API を利用することで、プログラムから実際の取引を行うことができるようになります。 今回は Ruby の Gem を使って取引をしてみます(公開情報の取得等も簡単に書けます)。
準備編
API Key の発行と、現物取引 API を Ruby から利用するための準備をしていきます。
API Key の発行
Zaif にログインし、右上の方にある"アカウント"をクリックし、各種サービスのところにある"開発者向け API"を選択してください。
新しい APIKey を発行するにはメールでの認証が必要になります。 "Get Verification Code"をクリックし、登録しているメールアドレスに認証コードを送りましょう。
届いたメールに記載されている6桁の番号を入力し、認証を解除すると、 API Key が発行可能となります。
Name を入力して、 Perms の項で必要な権限をチェックし、"Create"ボタンクリックで API Key が発行されます。 今回はとりあえず、 Withdraw(送金,出金)以外をチェックしてます。
こんな感じで、 API Key が発行されたら、 OK です。
※先日 Zaif で API Key を利用した不正出金があったそうです。不正利用を防ぐために、このキーは絶対に他人に教えないでください。
Zaif Gem のインストール
Ruby で現物取引 API を簡単に扱うために、 gem をインストールします。
gem install zaif
または Gemfile に下記を追加し、適当に bundle install してください。
gem 'zaif'
プログラムで実際に注文してみる
冒頭で述べた通り、 Ruby で売注文を入れるコード書いてみました。(筆者の環境 ruby 2.3.2) 指定した価格を下回った際に、数量1で売注文を入れます(逆指値注文っぽいものです)。 下記3点設定すれば動くと思います。
- 環境変数 ZAIF_KEY に API Key で発行した key を設定
- 環境変数 ZAIF_SECRET に API Key で発行した secret を設定
- コード中「指値価格を設定」部分を数値に置き換える。
クラスメソッドの bot_trade を実行すると動作します。 実行する際は全て自己責任でお願いいたします。
やっていること
- API 設定諸々
- zaif の価格を loop で監視
- 設定した価格以下の場合、売り注文をリクエスト
# bot_trade_test.rb # bundle exec rails runner ::BotTradeTest.bot_trade require 'zaif' require 'json' class BotTradeTest # API キー設定 ZAIF_KEY = ENV['ZAIF_KEY'] ZAIF_SECRET = ENV['ZAIF_SECRET'] @api = Zaif::API.new(api_key: ZAIF_KEY, api_secret: ZAIF_SECRET) # 指値価格設定 @limit_price = 指値価格を設定 # 指値注文有効フラグ @limit_order_flag = true # zaif_jpy 監視 def self.bot_trade # 価格を監視し、指値以下なら注文 loop do zaif_last_price = @api.get_last_price('zaif', 'jpy') puts 'zaif/JPY: ' + sprintf("%.4f", zaif_last_price) if zaif_last_price <= @limit_price puts "指値(#{@limit_price})以下になりました。" # 注文処理 order_zaif(zaif_last_price, 1) if @limit_order_flag end end end def self.order_zaif(price, amount) @limit_order_flag = false responce = @api.ask('zaif', price, amount) puts JSON.pretty_generate(res) end end
実行結果
zaif の終値を監視し、指値で指定した価格を下回っている場合、実際に注文を入れることができました。
注文が成功するとレスポンスが返ってきます。
received
がすでに約定した数で、remains
がまだ板に残っている数量です。
ついでに残高も教えてくれます。funds
の部分です。隠していますが。
zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7085 zaif/JPY: 1.7006 指値(1.703)以下になりました。 { "received": 0.0, "remains": 1.0, "order_id": 0, "funds": { "jpy": 0, "btc": 0, "xem": 0, "mona": 0, "ERC20.CMS": 0, "ETH": 0, "JPYZ": 0, "MOSAIC.CMS": 0, "PEPECASH": 0, "ZAIF": 0 } }
さわってみた感想
- 現物取引 API は例外発生が多いです。例外処理をきちんと書きましょう。
- 逆指値注文ぽいことをしてみましたが、ほぼほぼ注文入りませんので、現状、損切り等の用途では使い物にならなそうです。
- API の出金制限と IP アドレスホワイトリスト(執筆時点ではまだありませんが、実装予定とのこと)は必ず設定しましょう。