
ビットコインを取引所で購入し、トレードしてみたり、買い物してみたりした後、次に興味を持つことはシステムトレードでしょう。今回はbitFlyerのAPIを使ってシステムトレードを行う方法を紹介します。
見出し
はじめに
私のブログに遊びに来ている人にとってはご存知だと思いますが、このブログにはビットコインによる寄付の欄がサイドバーに設置してあります。ビットコインを持っていなかった人でも好奇心のある人なら、すぐにビットコインを購入したことでしょう。
ビットコインを購入してトレードしてみたり買い物で使ってみたりすると、次にシステムトレードに興味を持つのが普通です。ほとんどの取引所はトレードをシステムから行うためのAPIを公開していますので、それを利用することでオリジナルのトレードのシステムを簡単に構築できます。
今回はbitFlyerのAPIを使ってビットコインの売買をする簡単なスクリプトをNodeJSで実装する方法を紹介します。
bitFlyerのAPIを使ったシステムトレード
前提条件
以下を事前に準備してください。
- bitFlyerのアカウント(本人確認済)を持っていること
- bitFlyerに入金済であること
- NodeJSがインストールされていること
もし今回初めてアカウントを作った場合は、先に取引所で売買をすることをおすすめします。そうしないと、パラメーターの意味が全く理解できないはずです。
APIキーの取得
まずはAPIキーをbitFlyer Lightningのサイトから発行しましょう。bitFlyerは通常ユーザ用のページとデベロッパー用のページを分けており、APIはデベロッパー用のbitFlyer Lightningのページから発行できます。アカウントは同じです。
ログインしたら左のバツ印から、「API」を選択します。
次に「新しいAPIキーを追加」を選択します。
ラベル名は何でも良いのですが今回は「my-trade」とします。
権限設定ですが、APIキーは漏洩した場合に被害に合う可能性があるので、使うAPIのみに絞るのが懸命です。今回は「トレード」と「資産」を選択し、「OK」をクリックします。
これでAPIキーが追加されました。
この「API Key」と「API Secret」をプログラムで利用します。
プロジェクトの準備
それではプロジェクトのファイルとパッケージを準備しましょう。
$ mkdir my-trade
$ cd my-trade
$ yarn init -y
$ yarn add axios crypto
$ touch utils.js
$ touch order.js
$ touch cancel.js
API認証用の関数の実装
APIにはパブリックなAPIとプライベートなAPIがあります。APIキーが必要なのはプライベートなAPIです。bitFlyerのAPI認証の仕組みはここに書いてあります。
「utils.js」のソースコードは以下です。
const crypto = require('crypto');
function generateAccessHeaders(key, secret, method, path, body) {
const timestamp = Date.now().toString();
const bodyStr = body ? JSON.stringify(body) : '';
const text = timestamp + method + path + bodyStr;
const sign = crypto.createHmac('sha256', secret).update(text).digest('hex');
return {
'ACCESS-KEY': key,
'ACCESS-TIMESTAMP': timestamp,
'ACCESS-SIGN': sign
};
}
module.exports = { generateAccessHeaders };
だいたい最初に実装する時につまずくのがAPI認証だと思いますが、気をつける点はsignを作成する材料のボディには、GETのプライベートAPIの場合は空を設定し、POSTのプライベートAPIの場合はドキュメントの通りのJSON形式を設定するところです。
ビットコインを売買するスクリプトの実装
メインの売買スクリプトを作りましょう。今回はパラメーターを引数で渡すのではなく、シンプルにソースコード内に記載する形にします。
「order.js」のソースコードは以下です。
const orderKind = 'buy'; // 'buy' or 'sell'
const orderType = 'limit'; // 'limit' or 'market
const price = 816525;
const amount = 0.001;
const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';
const axios = require('axios');
const BASE_URL = 'https://api.bitflyer.jp';
const RESOURCE_PATH = '/v1/me/sendchildorder';
const { generateAccessHeaders } = require('./utils');
let side;
if (orderKind === 'buy') {
side = 'BUY';
} else {
side = 'SELL';
}
let childOrderType;
if (orderType === 'market') {
childOrderType = 'MARKET';
} else {
childOrderType = 'LIMIT';
}
const PATH = RESOURCE_PATH;
const URL = `${BASE_URL}${PATH}`;
const method = 'POST';
const body = {
product_code: 'BTC_JPY',
child_order_type: childOrderType,
side,
price,
size: amount,
minute_to_expire: 43200,
time_in_force: 'GTC'
};
const headers = generateAccessHeaders(API_KEY, API_SECRET, method, PATH, body);
axios
.post(`${URL}`, body, { headers })
.then((response) => {
console.log(response.status);
console.log(response.data);
})
.catch((error) => {
console.error(error.response.status);
console.error(error.response.data);
});
パラメーターの設定は以下です。
- orderKind -> 買う場合は「buy」、売る場合は「sell」
- orderType -> 指値注文は「limit」、成行注文は「market」
- price -> ビットコインの取引金額
- amount -> ビットコインの取引量
ビットコインの売買をキャンセルするスクリプトの実装
取引所での売買はちょうどよい金額と量を設定すればすんなり終わりますが、誤って売買のオーダーをしてしまった場合や長い間約定しなかった場合に、キャンセルできると便利です。
「cancel.js」のソースコードは以下です。
const orderId = 'JRF2018XXXX-XXXXXX-XXXXXX';
const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';
const axios = require('axios');
const BASE_URL = 'https://api.bitflyer.jp';
const RESOURCE_PATH = '/v1/me/cancelchildorder';
const { generateAccessHeaders } = require('./utils');
const PATH = RESOURCE_PATH;
const URL = `${BASE_URL}${PATH}`;
const method = 'POST';
const body = {
product_code: 'BTC_JPY',
child_order_acceptance_id: orderId
};
const headers = generateAccessHeaders(API_KEY, API_SECRET, method, PATH, body);
axios
.post(`${URL}`, body, { headers })
.then((response) => {
console.log(response.status);
console.log(response.data);
})
.catch((error) => {
console.error(error.response.status);
console.error(error.response.data);
});
パラメーターの設定は以下です。
- orderId -> 注文実行時の返却値に含まれる「child_order_acceptance_id」を指定する
動作確認する
それではスクリプトを実行してみましょう。実行が成功すると「child_order_acceptance_id」が返却されます。
$ node ./order.js
200
{ child_order_acceptance_id: 'JRF2018XXXX-XXXXXX-XXXXXX' }
注文をキャンセルしたい場合はスクリプト内に「child_order_acceptance_id」の値を設定して実行します。
$ node ./cancel.js
200
エラーがでなければ成功です。
最後に
いかがでしたか?ここまでくれば後はトレードのロジックを組むだけです。システムトレードを楽しみましょう。では。


コメントを残す