ゼロから作る自動売買bot開発 ~ 第4回:API Documentを読んでRealtime APIを呼んでみる ~

2018.10.17

furusake-s

こんにちは、BCHNews編集長のfurusake-sです。
連載記事 ゼロから作る自動売買bot開発 ~ 第4回:API Documentを読んでRealtime APIを呼んでみる ~ をお届けします。

前回:ゼロから作る自動売買bot開発 ~ 第3回:API Documentを読んでPrivate APIを呼んでみる ~

Private APIは呼べましたでしょうか?
bitFlyerに口座を開設済みの方であれば試せる内容だとは思うのですが、新規に口座を開設しないといけない方や、開発環境構築の段階でつまづいた方はそもそもサンプルコードを試せていないかもしれません。
本連載では実際にサンプルコードを動かして学び、市場で自動売買bot(以下bot)を動かすのが一つの目標ですので、読み物としても楽しんでもらえたらとは思っておりますが、出来ればサンプルコードから自分のbotを作って動かしてもらえるとbot開発の面白さが伝わると思うのでオススメしたい感じです。

タヌキの人もサンプルコードを試してもらえていると信じています。

ついに稼ぎの心配をされてしまいました、、トレーダーが別のことすると稼ぎの心配をするのが暗号通貨界隈ガチ勢の常識ですので、これもやむを得ません。ここは一日も早く、本連載で作ったbotのパフォーマンスをお見せすることで『ワロス』を提供するしかないと決意を新たにした次第です。
(追伸:インタビューいつにしますか?)

ハッシュタグは #寝ているだけで朝起きたらお金が増えている ですので、心配は無用ですよね。
今後ともBCHNewsをよろしくお願いします。

引き続きAPIを呼んでいきましょう

今回のRealtime APIで、bitFlyerのAPI Documentを読むシリーズは完結します。
Realtime APIは時価と約定に関するデータをリアルタイム配信してくれるAPIです。
これまでのPublic APIとPrivate APIはいわゆるRESTを採用していましたが、Realtime APIはWebsocketを採用しています。
そのため、これまで使っていたリクエスト、queryパラメータ、bodyパラメータ、レスポンスという単語は使わずに、新たにエンドポイント、イベント、メソッド、Channel Name、レスポンスという単語を使います。
API Documentでは この辺り です。

HTTP Public API

  • GET /v1/getmarkets
  • GET /v1/getboard
  • GET /v1/getticker
  • GET /v1/getexecutions
  • GET /v1/getboardstate
  • GET /v1/gethealth

HTTP Private API

  • GET /v1/me/getpermissions
  • GET /v1/me/getbalance
  • GET /v1/me/getcollateral
  • GET /v1/me/getcollateralaccounts
  • GET /v1/me/getaddresses
  • GET /v1/me/getcoinins
  • GET /v1/me/getcoinouts
  • GET /v1/me/getbankaccounts
  • GET /v1/me/getdeposits
  • POST /v1/me/withdraw
  • GET /v1/me/getwithdrawals
  • POST /v1/me/sendchildorder
  • POST /v1/me/cancelchildorder
  • POST /v1/me/sendparentorder
  • POST /v1/me/cancelparentorder
  • POST /v1/me/cancelallchildorders
  • GET /v1/me/getchildorders
  • GET /v1/me/getparentorders
  • GET /v1/me/getparentorder
  • GET /v1/me/getexecutions
  • GET /v1/me/getpositions
  • GET /v1/me/getcollateralhistory
  • GET /v1/me/gettradingcommission

Realtime API

  • lightning_board_snapshot_<product_code>
  • lightning_board_<product_code>
  • lightning_ticker_<product_code>
  • lightning_executions_<product_code>

今回はここを解説します。
API Documentに Realtime API Playground が用意されているので、APIの構成とレスポンスが確認できます。

サンプルコードを更新する

今回のために、GitHubのリポジトリを更新しました。
前回 git clone した bchn-bot-develop配下で

git pull

してみてください。
git checkout bot-develop-03 していた人は、git checkout master してから git pull してみてください。
以下のフォルダ及びファイルが追加されています。

lib/bitFlyer/realtime-socketio-client.js
lib/bitFlyer/realtime-rpc-websockets.js
sample/bot-develop-04.js

tagは bot-develop-04 としました。

公開リポジトリはこちら

今回からnpmで管理されているpackageを使います。
API Documentに記載ある通り、Realtime APIの接続方法は3つ用意されています。(PubNubは廃止予定なので実質2つ)

bot-develop-04.jsを呼ぶために必要な作業があります

bchn-bot-develop直下に移動したあと

cat package.json

すると以下のように出てくると思います。

{
  "name": "bchn-bot-develop",
  "version": "1.0.0",
  "description": "ゼロから作る自動売買bot開発で取り上げているプログラム",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/furusake-s/bchn-bot-develop.git"
  },
  "author": "Shinya Furusake",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/furusake-s/bchn-bot-develop/issues"
  },
  "homepage": "https://github.com/furusake-s/bchn-bot-develop#readme",
  "dependencies": {
    "rpc-websockets": "^4.3.3",
    "socket.io-client": "^2.1.1"
  }
}

この中を見て

"dependencies": {
  "rpc-websockets": "^4.3.3",
  "socket.io-client": "^2.1.1"
}

となっていることを確認したあと

npm install

してみてください。
関連したpackageが node_modules/ 配下にインストールされます。
これで sample/bot-develop-04.js を呼ぶ準備が整いました。
この辺の仕組みをご存じない方はnpmについて調べてみて下さい。

Channel Nameの一覧と解説

今回のサンプルコードを呼ぶ準備が整ったところで、Realtime APIのDocumentを先に解説しておきましょう。
これまでAPI一覧と呼んでいたものです。今回は数が少ないので列挙します。
<product_code>の部分はBTC_JPYやETH_JPYなど、 GET /v1/getmarkets で取得できるレスポンスのproduct_code部分です。Documentではaliasは使用できないとあります。ご注意下さい。

  • lightning_board_snapshot_<product_code>
  • 一定間隔で板の状態をスナップショットしてその値を返す。

    板情報のスナップショットを配信します。データ量が大きくなる場合、板情報更新のたびに配信されることは保証されません。更新のたびに情報を取得する場合、差分情報を利用してください。
    サンプルレスポンスは 板情報 の項を参照してください。
    ※ asks, bids の配列の順序については保証していません。

  • lightning_board_<product_code>
  • リアルタイムに板の状態の差分を配信する(変化した場所だけ教えてくれる。)

    板の注文に更新があった場合、その差分情報を配信します。 以下のレスポンスは、33,350 円の bid 注文が更新され、その合計数量が 1 BTC になっていることを示します。

    {
      mid_price: 35625,
      bids: [
        {
          price: 33350,
          size: 1
        }
      ],
      asks: []
    }
    

    注文が約定・キャンセル等で板から消えた場合、size が 0 のものが配信されます。
    ※2018 年 10 月現在、板寄せ時の成行注文が約定した場合、差分情報において “price” 部分が “price: 0” として配信される仕様となっております。

  • lightning_ticker_<product_code>
  • リアルタイムにGET /v1/gettickerのレスポンスを返す。

    更新が発生するたびに配信されます。Ticker の項を参照してください。

  • lightning_executions_<product_code>
  • 約定が発生するたびに配信されます。

    [
      {
        "id": 39361,
        "side": "SELL",
        "price": 35100,
        "size": 0.01,
        "exec_date": "2015-07-07T10:44:33.547",
        "buy_child_order_acceptance_id": "JRF20150707-014356-184990",
        "sell_child_order_acceptance_id": "JRF20150707-104433-186048"
      }
    ]
    

    ※板寄せ時に約定した場合は “side” のデータが配信されませんのでご留意ください。

ひととおり試したとして・・・

Realtime APIへの接続方法は2つありますが、どちらを採用すべきでしょうか?

JSON-RPC 2.0 over WebSocket のサンプルコードには再接続処理が含まれておりません。 継続して受信するためには適切な再接続処理を実装していただく必要があります。

と、 Realtime API Playground のページにこのように記載がありますので、通常ではSocket.IO 2.0 (WebSocket)のほうで良いのではと思います。
JSON-RPC 2.0 over WebSocketのレスポンスは{channel: “”, message: {} or []}の形で返ってきます。
再接続処理が書けて、なおかつ複数のchannelを同時に扱いたい場合はJSON-RPC 2.0 over WebSocketを検討すると良いでしょう。

Realtime APIのレスポンスについてコメントしておきます。

  • lightning_board_snapshot_<product_code>について
  • 一定間隔で板のスナップショットが送られてきます。最良気配から10本、多くても20本、全てを利用するbotも存在するかもしれませんが、順序が保証されていない点に注意が必要です。受け取ったレスポンスを自分でソートする必要があるということです。

    ※ asks, bids の配列の順序については保証していません。

  • lightning_board_<product_code>について
  • こちらで配信されてくるレスポンスは差分情報ですので、上記の lightning_board_snapshot_<product_code> あるいは Get /v1/getboard の結果を保持しておいて、それをupdateしていくようなプログラムが通常は必要となります。

    注文が約定・キャンセル等で板から消えた場合、size が 0 のものが配信されます。
    ※2018 年 10 月現在、板寄せ時の成行注文が約定した場合、差分情報において “price” 部分が “price: 0” として配信される仕様となっております。

    この通り、板が消える場合の処理は仕様に従う必要があります。
    この処理が適切に行われないと、実際には存在しない板を材料にbotが売買の判断をしてしまうことになるため注意が必要です。
    手元のデータのbest_ask(最良売気配)とbest_bid(最良買気配)が逆転したりした場合には手元のデータを捨てて新たに Get /v1/getboard すると良いでしょう。
    その他、負の値を受け入れないなど(通常はありえませんが、配信されてきた場合に対処する必要はある)、配信されてくるレスポンスのvalidateに工夫が必要な箇所です。

  • lightning_ticker_<product_code>について
  • best_askとbest_bidだけで自動売買するbotはあまりないかもしれませんが、

    {
      "product_code": "BTC_JPY",
      "timestamp": "2015-07-08T02:50:59.97",
      "tick_id": 3579,
      "best_bid": 30000,
      "best_ask": 36640,
      "best_bid_size": 0.1,
      "best_ask_size": 5,
      "total_bid_depth": 15.13,
      "total_ask_depth": 20,
      "ltp": 31690,
      "volume": 16819.26,
      "volume_by_product": 6819.26
    }
    

    このとおり、前述の2つからは手に入らない値もあるため、そういった値が必要な場合、あるいはモニタリングツールを開発する場合に必要となるでしょう。

  • lightning_executions_<product_code>について
  • このようなレスポンスが配信されてきます。

    [
      {
        "id": 39361,
        "side": "SELL",
        "price": 35100,
        "size": 0.01,
        "exec_date": "2015-07-07T10:44:33.547",
        "buy_child_order_acceptance_id": "JRF20150707-014356-184990",
        "sell_child_order_acceptance_id": "JRF20150707-104433-186048"
      }
    ]
    

    自身の order_acceptance_id を管理しているならば、このレスポンスから、自身の有効注文が約定したことをいち早く知ることが出来るでしょう。
    約定した事実をリアルタイムで知る必要がないbotの場合は GET /v1/me/getexecutions や GET /v1/me/getchildorders などで自身の注文管理をすると良いでしょう。

    API制限

    HTTP API は、以下のとおり呼出回数を制限いたします。

    Private API は 1 分間に約 200 回を上限とします。
    IP アドレスごとに 1 分間に約 500 回を上限とします。

    注文数量が 0.1 以下の注文を大量に発注するユーザーは、一時的に、発注できる注文数が 1 分間に約 10 回までに制限されることがあります。
    システムに負荷をかける目的での発注を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。

    このとおり、PublicおよびPrivate APIには使用制限があるため、使い果たしてしまいそうなbotの場合はRealtime APIを利用することで対策が可能です。

今回のサンプルプログラムは中断しない限りレスポンスが配信され続けるタイプのプログラムです。
unsubscribeする処理はサンプルプログラムには含まれていないので、GUI画面などを作る際にはunsubscribeする機能も付け加えると良いと思います。
今回で、bitFlyerのAPIを全て紹介することが出来ました。

  • Public API
  • Private API
  • Realtime API

もし、サンプルプログラムが実行できない、自力で解決できないけど、助けを借りてでも実行させたい。
という方がいましたら、Twitterで 白井ななと( @7bunnies_bot )へ問い合わせをお願いします。
お時間は頂くことになると思いますが、可能な限り対応させて頂きます。

次回予告

復習を兼ねて、三種類のAPIを横断的に使ってみようと思っています。
ここまでは前置き、教科書的な感じでしたが次回以降は考察もまじえて不定形な連載にしていこうと思っております。
BitMEXのAPI解説はbitFlyerの連載が落ち着いた頃にやりたいと思います。

余談ですが、サンプルコードのレスポンスにあるBTCのpriceが33,350だったりして、昔はずいぶんと安かったな〜って思い出しました。
自分は2015年1月~4月あたりからBTCを買い集め始めたので、タイミングが良かったのだと思います。
いわゆるAfterGOX世代ですね。

さいごに

記事を読み切って頂いたついでにもう少し下にスクロールして頂けますでしょうか?
『記事をシェア』という文字の下にSNS投稿用のボタンが4つほど配置されているのがわかりますでしょうか・・・。
どれでも構いませんので、ポチッ。ポチッ。っとクリックして頂けると弊社エンジニアが喜びます。
実装したけど使われない機能ってとても悲しいですからね。。お願いします。。m(__)m

最新情報はこちら

BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。

furusake-s

BCHNews編集長
セブンバニーズ株式会社 代表取締役
1982年生まれ、大阪府出身、B型
趣味はロードバイク、三国志大戦、イカを釣ること

関連記事

ゼロから作る自動売買bot開発 ~ 第0回:開発を始める前に ~

2018.09.28

by furusake-s

ゼロから作る自動売買bot開発 ~ 第1回:bot開発は取引所選びから ~

2018.10.01

by furusake-s

ゼロから作る自動売買bot開発 ~ 第2回:API Documentを読んでPublic APIを呼んでみる ~

2018.10.03

by furusake-s

ゼロから作る自動売買bot開発 ~ 第3回:API Documentを読んでPrivate APIを呼んでみる ~

2018.10.10

by furusake-s