7rikazhexde’s tech log

技術的な興味関心、備忘録、アウトプットなどを書いています。

【Bitcoin積立】bitbankの公式APIを使用して指定価格で指値注文するGoogle Apps Script(GAS)について

背景

はじめに暗号資産に対する個人の見解を述べます。
私は2017年末に暗号資産を購入して取引をしていたのですが、今年はFTXの件があり多くの通貨を清算(円転して出金) しました。

今後の状況を考えると、個人的には規制強化や経済状況の観点から来年は2020年末〜2021年のような相場にはならないと考えています。
一方でプロダクトの開発は常に行われている状況で新しい通貨やユースケースも出てきています。新しいものには興味が沸きますし、利益が出ると嬉しいものです。

ただ、ここ数年見ていて思うことは、通貨の特徴に対して技術の違いはあっても、ユースケースやサービスでの差別化要素が余りなく、持続的価値の向上が難しい印象を受けています。 また、市場の状況を考慮すると通貨を持ち続けること自体が難しい状況にあると感じています。

個人的には全ての通貨に当てはまるわけではありませんが、短期的な価格上昇に良いイメージはなく、価値や将来性を考えれば、BTCとETHのポジションは今後も変わらないと思います。(他の通貨は買ったとしても一定期間後に売ることで利益は見込めると思いますが、情報を追うことや価格を意識して取引を行うことは疲れるため余程の理由がない限り買い続けることはないと思います。)

次に実際の取引についてですが、ポートフォリオとしてこれまで私はETHを保有していたのですが、清算したということと、今後、ETHはステーキングの引き出しやSECの動向が気になるため、最悪ケースを考慮して買わないというスタンスでいます。(もちろんL2ソリューションへの期待値は高いため、今後の状況次第で変わることはあると思います。)

一方でBTCについては開発面、堅牢性、資産性など、長期的に見ても期待値は高いためBTCは買いたいと思っています。また、基本的に買いはしても売りはしないというスタンスです。

次にどこで買うかということですが、国内取引所で購入します。これは暗号資産に対する法律の観点やFTX JPの件、税金計算の点で海外取引所やDEXを使う理由はないからです。

前置きが長くなりましたが、以上の理由から今後もBTCを購入していきたいという思いに至りました。

購入方法についてはいくつか方法がありますが、実際に要件を検討し、bitbankの公式APIを使用して指値注文するスクリプト(GAS)を作成したので本記事で紹介することにしました。

要件

国内取引所で購入するにあたり以下の要件を設定しました。

  • Bitcoinを指定価格で注文する

  • 注文は毎日行うが手間はかけたくない(アプリから注文はしない)

  • 手数料はかけたくない(0円以下であること)

  • 少額で購入できる(500円以上)

作成したもの

bitbankの公式APIを使用して指値注文するスクリプト(GAS)を作成しました。

bitbankで注文する理由は以下の通りです。

ソースコードGitHubにもコミットしています。

github.com

詳細はREADME.mdに記載しているため本記事ではポイントとなる仕様とソースコードについて紹介します。

注意事項

  • 本コードでは必ずしも期待されたデータを取得することは保証しません。

  • 本コードを実行したこと、参考にしたことによって被るあらゆる損害について責任を負いかねますので自己責任でご利用ください。

  • 本コードでは指値注文を行いますが、指定する価格は最小注文数量に依存します。指定する注文価格が計算により最小注文数量を下回る場合、注文量が指定する注文価格以下となることがありますのでご注意ください。

  • 本コードはbitbankのAPI仕様に基づき実装しています。API仕様は変更される可能性がありますので、最新の情報を確認してご利用ください。

  • 本コードは通貨ペアとしてbtc_jpyが対象です。他の通貨ペアについては未確認のためご注意ください。

仕様とソースコードについて

処理の流れ

  1. 現在の買い注文の最高値を取得する

  2. 指定価格と注文価格に対する注文枚数を計算する

  3. 価格と注文枚数指定で指値注文する

  4. 受信した注文結果のレスポンスデータをGmailで送信する (成功時、失敗時)

ファイル構成

gasBitbankSpotOrder % tree
.
├── LICENSE
├── README.md
└── ScriptsFolder
    └── SpotOrder
        ├── config.gs //指値注文で使用する情報を定義(ユーザー情報,注文価格)
        ├── doPost.gs //POSTリクエスト受信処理
        ├── error.gs //エラー処理
        ├── sendMail.gs //メール送信処理
        └── spotOrder.gs //指値注文処理

1. 現在の買い注文の最高値を取得について

Public APIを利用してTicker情報から現在の買い注文の最高値(buy)を取得します。

2. 指定価格と注文価格に対する注文枚数の計算

取得した現在の買い注文の最高値からconfig.gsで定義するORDER_NUMADJUST_PRICEのパラメータとPrivate API利用して指定価格分の価格と注文量を設定します。

3. 指定価格と注文枚数指定で指値注文

bitbank APIの認証手順に従い認証情報を作成します。署名作成用の文字列として「noncepayload」 を連結してconcatenated_stringを作成し、文字列を HMAC-SHA256 形式API_SECRETを使用して署名(signatureを作成し、注文情報を含むpayloadをoptionsに設定して指値注文します。

4. 受信した注文結果のレスポンスデータをGmailで送信(成功、失敗)

受信したレスポンスデータについてログの出力とメール送信をします。

成功ケース

レスポンスデータをJSON文字列に変換してメール本文に設定してメール送信関数をコールします。

成功ケースのメール送信処理

失敗ケース

注文不可の場合はレスポンスデータとしてエラーコードが送信されます。本コードではerror.gsでエラーコードに対するエラーメッセージを連想配列で定義し、レスポンスデータからエラーコードを取得し、対応するエラーメッセージをメールの本文に設定してメール送信関数をコールします。エラーコードが存在しない場合は不明なエラーとして設定します。

失敗ケースのメール送信処理
エラー処理

POSTリクエストを受信して指値注文する処理について

スクリプトでは関数の定期実行で指値注文を行いますが、スマートフォンから注文したいこともありました。
そこでGASのデプロイ設定で作成したURLに対してPOSTリクエストを送信することで注文用の関数を実行する方法で対応しました。 その他、URL公開時のセキュリティ対応として識別情報による照合を行いました。
まず、前提としてスクリプトをデプロイする場合、受信側(GAS)はURLを公開する必要があります。セキュリティを考慮するならばアクセス元に制限をかけ、パスワード認証を要求すれば良いですが、利便性が損なわれます。
そこで本スクリプトでは送信側と受信側で識別情報を設定することで、URLアクセスされた場合でも注文が実行されないようにしました。

送信側

sendDataの形式でデータをGAS(URL)に対してPOSTリクエストします。

受信側

config.gsで識別情報を定義し、doPost関数で送信元が送信した識別情報と一致した場合のみ指値注文の関数を実行します。

識別情報定義関数
POSTリクエスト受信関数

まとめ

bitbankの公式APIを使用して指定価格で指値注文するGoogle Apps Script(GAS)について紹介しました。
暗号資産はボラティリティが大きくリスクも高いですが、開発のスピードが早く、新しい技術を活用するプロジェクトも多くとても面白い分野だと思っています。BTC,ETHは特に中心的存在だと思っていますし、これからもプロダクト、ユースケースが増えていくことを期待しています。 今後は実際のプロダクトやサービスにも触れて、技術の理解も深めていきたいと思っています。

参考記事

以下の記事を参考にさせていただきました。

qiita.com