ゼロから作る自動売買bot開発 ~ 第5回:APIで色々やってみる(1) ~
2018.10.27
furusake-s
こんにちは、BCHNews編集長のfurusake-sです。
連載記事 ゼロから作る自動売買bot開発 ~ 第5回:APIで色々やってみる(1) ~ をお届けします。
連載過去記事一覧
ゼロから作る自動売買bot開発 ~ 第0回:開発を始める前に ~
ゼロから作る自動売買bot開発 ~ 第1回:bot開発は取引所選びから ~
ゼロから作る自動売買bot開発 ~ 第2回:API Documentを読んでPublic APIを呼んでみる ~
ゼロから作る自動売買bot開発 ~ 第3回:API Documentを読んでPrivate APIを呼んでみる ~
ゼロから作る自動売買bot開発 ~ 第4回:API Documentを読んでRealtime APIを呼んでみる ~
雑談
なんとタヌキの人がTwitterアカウントに鍵をかけてしまいました。どうしたのでしょうか?とにかく、タヌキの人からのフィードバックをこの連載で使用することができなくなりましたので、冒頭のタヌキの人との絡みはこれで終了とさせて頂きます。これまでありがとうございました。次回作に期待しています。
これから何をしていくのか?
これまで、bitFlyerのPublic API、Private API、Realtime APIと紹介してきましたが、自動売買bot(以下bot)を開発・運用するためにはこれらのAPI群を横断的に利用する必要があります。
今回からAPIを横断的に使って色々とやっていきたいと思います。なお、Private APIを使って実際に注文を発注するためには、取引所にJPYないしBTCなどを入金しなければなりません。方法は取引所の入金ページなどで確認をお願いします。
今回のために100万JPYをbitFlyerに入金しました。これで色々とやっていきたいと思います。『億り人』になるためには100倍にする必要がありますね。所得税も考慮するとその2倍、200倍にする必要があります。頑張っていきましょう。もう死語ですか?億り人って。・・そうですか、残念です。
この100万JPYは増えていくのでしょうか、それとも減っていくのでしょうか・・・
API一覧
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制限
- Private API は 1 分間に約 200 回を上限とします。
- IP アドレスごとに 1 分間に約 500 回を上限とします。
- 注文数量が 0.1 以下の注文を大量に発注するユーザーは、一時的に、発注できる注文数が 1 分間に約 10 回までに制限されることがあります。
- システムに負荷をかける目的での発注を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。
bitFlyer公式ページのAPI Documentを参照しながら開発してもらいたいですが、索引としてAPI一覧と、API制限をまとめておきます。
サンプルコードを更新する
今回のために、GitHubのリポジトリを更新しました。
前回 git clone した bchn-bot-develop配下で
git pull
してみてください。
git checkout bot-develop-04
していた人は、
git checkout master
してから
git pull
してみてください。
以下のフォルダ及びファイルが追加されています。
tagは bot-develop-05 としました。
公開リポジトリ:https://github.com/furusake-s/bchn-bot-develop
サンプルコードの説明
今回は、Public APIの『GET /v1/getboard』とRealtime APIの『lightning_board_<product_code>』を使ってリアルタイム更新する板(以下board)を作ってみました。
API群を一覧するとわかるとおり、lightning bitFlyerのトレード画面のようにリアルタイムで板を配信してくれるAPIは単体では存在しません。リアルタイムで送られてくるのは今回使用した『lightning_board_<product_code>』ですが、これは差分データであり、このAPIのレスポンスだけでトレード画面の板を再現することは出来ません。そこで、ベースとなるboardをPublic APIの『GET /v1/getboard』のレスポンスから取得して、その後は『lightning_board_<product_code>』のレスポンスを使ってboardを更新しようというアイデアです。
今回の設定変数
APIのデータをbotに利用するとき、全てのレスポンスをそのまま利用するかというと必ずしもそうではありません。開発を進めていくうちに設定可能な変数をいくつか定義することになります。今回の設定変数は以下になりました。
- product_code
- decimal_alignment
- board_num
- interval
APIのクエリパラメータとして使われている通貨ペアは複数存在するため、これを指定するための変数を用意しました。(BTC_JPY, FX_BTC_JPYなど『GET /v1/getmarkets』で取得できる値)
この値はboardの数量の有効小数点桁数を指定する値として用意しました。『GET /v1/getboard』や『lightning_board_<product_code>』では{price:’730000′,size:0.12345678}のような、boardの値段と数量が組み合わされたオブジェクトが返されてきます。bitFlyerでは、有効な小数点の桁数は8桁ですが、必ずしも他の取引所が有効な小数点の桁を8桁に設定しているわけではありません。例えば、最近テックビューロ社からフィスコ社へ事業譲渡された取引所の『Zaif』のBTC_JPYは有効な小数点の桁数が4桁に設定されています。なので、これを設定変数として保持し、boardを作成する処理の中で数量の小数点部分を指定した桁数で丸めてしまおうというわけです。
この値はboardを利用する際に必要な本数を指定するために用意しました。『GET /v1/getboard』のレスポンスを確認すればわかると思いますが、asksとbidsそれぞれ200本以上の値が返ってきます。これを全て利用するわけではないため、必要とされる本数のみ取得するための変数を用意しました。
この値はサンプルコードのログ出力間隔を指定するために用意しました。NodeJSの『setInterval関数』の引数として利用しています。ミリ秒単位で指定する値ですので、1秒間隔でログ出力したい場合1000(ミリ秒)を指定します。
サンプルコード解説
コードの処理内容を時系列に解説します。
- Public APIとRealtime APIのライブラリを読み込む
- 設定変数を定義
- 『GET /v1/getboard』でboardのベースを取得
- (繰り返し)『lightning_board_<product_code>』でboardの差分を取得
- (繰り返し)差分データ(追加、更新、削除)が来るたびにboardを更新する
- (繰り返し)boardをソートする(asksを昇順、bidsを降順に並べ替えてbest_askやbest_bidが配列の先頭に来るようにする
- (繰り返し)ソートされたboardを定期的にログ出力する(mid_priceを検算したものをdiffとして出力している)
以上のような流れのプログラムになります。
priceは数値として返ってくるのですが、sizeが0の差分データ(削除)を処理するためpriceを文字列に変換してオブジェクトのkeyとして利用しています。その後、ソートして2次元配列に詰め直しています。そのための処理が冗長に見えますので、プログラムが得意な方は改善の余地が見つかることと思います。
・ログ出力例
{ mid_price: 733638,
asks:
[ [ 733646,
733651,
733652,
733656,
733657,
733662,
733664,
733667,
733668,
733669 ],
[ 0.122, 0.1, 0.3108, 0.07, 0.05, 0.03, 0.02, 0.28, 0.03, 0.05 ] ],
bids:
[ [ 733631,
733623,
733622,
733618,
733615,
733614,
733613,
733609,
733607,
733603 ],
[ 0.0988, 0.1, 0.0833, 0.092, 0.1, 0.0833, 0.26, 0.2, 0.108, 0.2 ] ] }
diff: 733638.5 mid_price: 733638
このサンプルプログラムは実用に耐えるでしょうか・・・?
さて、しばらくこのプログラムを動かしながらlightning bitFlyerのトレード画面の板と見比べてみましょう。今回のboardは実用に耐えるでしょうか・・・?なにか問題点はないか?探してみて下さい。このboardがトレード画面のそれと乖離してしまうとbotの動作に影響が出てしまいますので、細心の注意を払う価値はあります。
もし、サンプルプログラムが実行できない、自力で解決できないけど、助けを借りてでも実行させたい。
という方がいましたら、Twitterで 白井ななと( @7bunnies_bot )へ問い合わせをお願いします。
お時間は頂くことになると思いますが、可能な限り対応させて頂きます。
次回予告
今回はPublic APIとRealtime APIを使ってリアルタイムで更新される板(board)を作ってみました。
次回の詳細は未定ですが、このサンプルプログラムをベースにlib/board.jsを作った後、サンプルコード側で読み込んで、いくつかのPrivate APIを呼んでみたいと思っています。お楽しみに。
さいごに
記事を読み切って頂いたついでにもう少し下にスクロールして頂けますでしょうか?
『記事をシェア』という文字の下にSNS投稿用のボタンが4つほど配置されているのがわかりますでしょうか・・・。
どれでも構いませんので、ポチッ。ポチッ。っとクリックして頂けると弊社エンジニアが喜びます。
実装したけど使われない機能ってとても悲しいですからね。。お願いします。。m(__)m
最新情報はこちら
BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。
この記事のカテゴリ
この記事のタグ
furusake-s
BCHNews編集長
セブンバニーズ株式会社 代表取締役
1982年生まれ、大阪府出身、B型
趣味はロードバイク、三国志大戦、イカを釣ること