ゼロから作る自動売買bot開発 ~ 第6回:APIで色々やってみる(2) ~
2018.11.03
furusake-s
こんにちは、BCHNews編集長のfurusake-sです。
連載記事 ゼロから作る自動売買bot開発 ~ 第6回:APIで色々やってみる(2) ~ をお届けします。
連載過去記事一覧
ゼロから作る自動売買bot開発 ~ 第0回:開発を始める前に ~
ゼロから作る自動売買bot開発 ~ 第1回:bot開発は取引所選びから ~
ゼロから作る自動売買bot開発 ~ 第2回:API Documentを読んでPublic APIを呼んでみる ~
ゼロから作る自動売買bot開発 ~ 第3回:API Documentを読んでPrivate APIを呼んでみる ~
ゼロから作る自動売買bot開発 ~ 第4回:API Documentを読んでRealtime APIを呼んでみる ~
ゼロから作る自動売買bot開発 ~ 第5回:APIで色々やってみる(1) ~
雑談
タヌキの人とのカチカチ山対談『第2回:暗号通貨界隈ガチ勢に会いにいく(1)』ですが、好評頂いているようで光栄です。さすがは暗号通貨界隈の重鎮、ワロスガチ勢のタヌキです。心より感謝申し上げます。続きも鋭意執筆中ですので今しばらくお待ち下さい。soon。
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-05
していた人は、
git checkout master
してから
git pull
してみてください。
以下のフォルダ及びファイルが追加されています。
tagは bot-develop-06 としました。
公開リポジトリ:https://github.com/furusake-s/bchn-bot-develop
サンプルコードの説明
前回はbitFlyerのPublic APIとRealtime APIを使って、リアルタイムに更新する板(board)を作ってみました。
今回はまず、前回のサンプルコードを再利用しやすいよう手直ししてみました。
decimal.jsをインストールするために、bchn-bot-develop直下で npm update をコマンドして下さい。
lib/bitFlyer/board.jsの解説
- 設定変数の外部化
- callbackされる値に累計注文数量の追加
- 小数点計算で発生する誤差をなくすため、decimal.jsを導入しました
- callbackされる値にdiffの追加
- callbackされる値にunixtimeの追加
board.jsを外部から呼び出し、初期化するときにproduct_code, decimal_alignment, board_numをqueryパラメータとして与える方式に変更しました。
これまで、asksとbidsにそれぞれ、priceとsizeの配列が格納されていましたが、sort時にsizeの累計注文数量を計算し、asks[2]とbids[2]に格納しました。板のsizeは状況によって薄くなる(注文数量が少なくなる)ことがあるため、累計注文数量のほうをみて約定可能なpriceとsizeを計算することが出来るようにしました。
板(board)の累計注文数量をasks[2], bids[2]にそれぞれ格納したのですが、検証時に小数点誤差が出ていたのでこのライブラリを導入しました。
sort時にbest_ask, best_bid間のdiffを計算して、レスポンスのboard.diffで取得できるようにしました。こちらの値が不正であればシステムを停止、再起動させることが出来ます。
diff計算と同様の箇所にタイムスタンプとしてunixtimeを取得して格納しています。前回更新時からの経過時間でシステム異常を検知する等に利用したいと思います。
実際にbot開発で使いやすいような形式に変更したつもりです。後は各自で改変して頂ければと思います。
サンプルコードを触ってみる
今回は、更新したboard.jsを使って、レスポンスのデータを幾つかの方法で解析してみたいと思います。
debug(board)を呼んでみる
サンプルコードのdebug(board);をコメントアウトしてみましょう。以下のようなレスポンスが来れば成功です。
{ mid_price: 729854,
unixtime: 1541221611867,
diff: 3,
asks:
[ [ 729856, 729858, 729861, 729862, 729871 ],
[ 0.052, 0.1, 0.3098, 0.3177, 0.0654 ],
[ 0.052, 0.152, 0.4618, 0.7795, 0.8449 ] ],
bids:
[ [ 729853, 729844, 729834, 729824, 729823 ],
[ 0.1893, 0.01, 0.1342, 0.01, 0.02 ],
[ 0.1893, 0.1993, 0.3335, 0.3435, 0.3635 ] ] }
与えたqueryパラメータは以下のとおりです。
var query = {
product_code : "FX_BTC_JPY",
decimal_alignment : 4,
board_num : 5
};
表示しやすいよう、query.board_num = 5 に設定してあります。
今回のboard.jsのレスポンスが確認できます。
maxDiff(board)を呼んでみる
サンプルコードのmaxDiff(board);をコメントアウトしてみましょう。以下のようなレスポンスが来れば成功です。
max_diff: { date: 'Sat Nov 03 2018 06:51:24 GMT+0000 (UTC)', diff: 36 }
max_diff: { date: 'Sat Nov 03 2018 06:51:27 GMT+0000 (UTC)', diff: 58 }
max_diff: { date: 'Sat Nov 03 2018 06:51:28 GMT+0000 (UTC)', diff: 63 }
今回のboard.jsにはask-bidの差分をdiffとして取得出来ますが、この値の最大値を変数に保持し、更新されたタイミングでログ出力するプログラムです。ボラティリティが大きいときほどdiffの値が大きくなる傾向があります。
triggerDiff(board)を呼んでみる
サンプルコードのtriggerDiff(board);をコメントアウトしてみましょう。以下のようなレスポンスが来れば成功です。
trigger_diff: 40 board: { mid_price: 730182,
unixtime: 1541228069548,
diff: 85,
asks: [ [ 730186 ], [ 1.2076 ], [ 1.2076 ] ],
bids:
[ [ 730101, 729600, 729000 ],
[ 0.21, 28.6904, 32.7932 ],
[ 0.21, 28.9004, 61.6936 ] ] }
設定変数として trigger_diff = 40; を設定してあります。
diffが40を超えた時のboardをログ出力します。
xBtcPrice(board)を呼んでみる
サンプルコードのxBtcPrice(board);をコメントアウトしてみましょう。以下のようなレスポンスが来れば成功です。
x_btc: 10 board: { mid_price: 730116,
diff: 84,
ask: { price: 730151, size: 10.1732 },
bid: { price: 730067, size: 10.2039 } }
設定変数として x_btc = 10; を設定してあります。
累計注文数量が10を超えたときのpriceと累計数量(size)をask/bidそれぞれログ出力します。
query.board_num : 5, だと、累計注文数量が10を超えないかもしれません。その時は query.board_num : 50, くらいに変更して下さい。
tickerLog(board)を呼んでみる
サンプルコードのtickerLog(board);をコメントアウトしてみましょう。以下のようなレスポンスが来れば成功です。
2018-11-03T07:09:00.992Z 730077 730103 730124 730077
2018-11-03T07:09:10.055Z 730103 730101 730118 730099
2018-11-03T07:09:20.050Z 730101 730093 730105 730093
2018-11-03T07:09:30.074Z 730093 730097 730106 730086
設定変数として tick_interval = 10 * 1000; を設定してあります。
この値でtickの更新間隔を指定します。出力されるログの内訳は(時間、始値、終値、高値、安値)の5つです。
この5つの値を使っていわゆるローソク足を作ることが出来ます。本来は約定情報で作るべきtickですが、今回は仮の値としてmid_priceを使って作りました。
どうでしょうか?
今回は、board.jsのレスポンスを加工してbot開発に使いそうな解析を行ってみました。
botのアルゴリズムを考える場合、時価の情報が基礎となることが多いです。マニュアル(自分でPCに向かって売買をするの意、botの対義として)でトレードする場合も、板の情報をもとに判断することが多いと思います。自身が持っている10BTCをJPYにしたい場合、10BTC以上の板があれば値段を見て、売ってもいいなと思ったらその板に自分の売り注文を出すと思います。そういった一連の思考の流れをbotのアルゴリズムに落とし込むのです。
もし、サンプルプログラムが実行できない、自力で解決できないけど、助けを借りてでも実行させたい。
という方がいましたら、Twitterで 白井ななと( @7bunnies_bot )へ問い合わせをお願いします。
お時間は頂くことになると思いますが、可能な限り対応させて頂きます。
次回予告
次回は実際に子注文を板に出してみて、Private APIを使った注文管理をやっていこうかと思っています。お楽しみに。
さいごに
記事を読み切って頂いたついでにもう少し下にスクロールして頂けますでしょうか?
『記事をシェア』という文字の下にSNS投稿用のボタンが4つほど配置されているのがわかりますでしょうか・・・。
どれでも構いませんので、ポチッ。ポチッ。っとクリックして頂けると弊社エンジニアが喜びます。
実装したけど使われない機能ってとても悲しいですからね。。お願いします。。m(__)m
最新情報はこちら
BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。
この記事のカテゴリ
この記事のタグ
furusake-s
BCHNews編集長
セブンバニーズ株式会社 代表取締役
1982年生まれ、大阪府出身、B型
趣味はロードバイク、三国志大戦、イカを釣ること