はじめに

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"を選択してください。

zaif_dev.png

新しい APIKey を発行するにはメールでの認証が必要になります。 "Get Verification Code"をクリックし、登録しているメールアドレスに認証コードを送りましょう。

api_key_0.png

届いたメールに記載されている6桁の番号を入力し、認証を解除すると、 API Key が発行可能となります。

varification.png

Name を入力して、 Perms の項で必要な権限をチェックし、"Create"ボタンクリックで API Key が発行されます。 今回はとりあえず、 Withdraw(送金,出金)以外をチェックしてます。

create_api_2.png

こんな感じで、 API Key が発行されたら、 OK です。

※先日 Zaif で API Key を利用した不正出金があったそうです。不正利用を防ぐために、このキーは絶対に他人に教えないでください。

created_api.png

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 を実行すると動作します。 実行する際は全て自己責任でお願いいたします。

やっていること
  1. API 設定諸々
  2. zaif の価格を loop で監視
  3. 設定した価格以下の場合、売り注文をリクエスト
# 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 アドレスホワイトリスト(執筆時点ではまだありませんが、実装予定とのこと)は必ず設定しましょう。