bitFlyerのAPIを使ったソースコードを実行してみた-自動売買への道(2)

bitflyer-api11

こんにちは、ビットコインの自動売買を夢見ている龍権(@ryuken_biz)です。

前回は、「bitFlyer」のサイト上でAPIを試したことを記事にしました。
関連記事:bitFlyerのAPIを使ってみた – 自動売買への道(1)

今回はAPIを使ってソースコードを書いて、実行できることを書いていきます。

開発言語は何にした?

ソースコードを書く時に必ずぶち当たる問題が、言語を何にするかという問題です。
プログラミングできる言語は山ほどありまして、基本どの言語をつかっても同じことは実行できます。
現状僕が覚えている言語はJavaとPHPくらいしかありませんが、他の言語の中でシンプルに書ける言語があれば、書き方を覚えながら書いてもいいと思っていました。

bitFlyerの「API Playground」ページには、「Node.js、Ruby、Perl、C#」の四種類のサンプルが載っています。
そのうちのどれかを使えばサンプル通り実装できるので、かなり楽になるかと思いました。

しかし、僕は実装したプログラムを「レンタルサーバー Xserver」上で24時間365日実行したいと考えました。
自分のノートPCに環境を作って実行することもできますが、ノートPCを起動しっぱなしにしないといけないので、現実的に不可能だと思ったからです。
レンタルサーバでは自由に環境を作れないので、PHPのソースコードしか動きません。
すると、開発言語はPHPに自然に絞られたわけです。

サンプルが載ってないのでAPI呼び出し部分の開発は少し大変ですが、逆に他のロジックは慣れているPHPで実装できそうです。
ということで、PHPでソースを書いていくことにしました。

API呼び出しを実装してみた

PHPで、PublicなAPI(Privateでない方)とPrivateAPIを1つずつ実装してみました。
PublicAPIは取引所の状態を取得する「gethealth」、privateAPIは新規注文を出す「sendchildorder」です。

publicAPIサンプル

publicAPIの呼び出しは、非常にシンプルです。
URLを指定して呼び出すだけです。

<?php

// 取引所の状態取得
$base_url = 'https://api.bitflyer.jp';
$version = '/v1/';
$gethealth_url = 'gethealth';
$url = $base_url . $version . $gethealth_url;

// API呼び出し
$response = file_get_contents($url);
$result = json_decode($response, true);
print_r($result);

実行結果はこちらです。

Array
(
    [status] => BUSY
)

取引所は忙しいようですね。

privateAPIサンプル

privateで新規注文を出してみましょう。
出してみるといっても本当の注文になってしまうので、約定されない程度で注文を出してみます。
LIMIT 300,000で0.1BTCの買い注文を入れてみます。
この記事を書いている当日のBTC相場は410,000ほどですので、注文が約定されることはないでしょう。

ソース上の「API Key」と「API Secret」には「bitFlyerのAPIページ」で実際に取得したものをセットしてくださいね。

<?php
$key = 'API Key'; $secret = 'API Secret';

// 買い注文
$base_url = 'https://api.bitflyer.jp';
$version = '/v1/';
$order_buy = 'me/sendchildorder';
$url = $base_url . $version . $order_buy;

// 注文内容
$body = json_encode(array( 'product_code' => 'FX_BTC_JPY',
        'child_order_type' => 'LIMIT',
        'side' => 'BUY',
        'price' => 300000,
        'size' => 0.1,
));

$timestamp = time() . substr(microtime(), 2, 3);
$method = 'POST';
$text = $timestamp . $method . $version . $order_buy . $body;
$sign = hash_hmac('sha256', $text, $secret);

$header = array(
        'ACCESS-KEY:' . $key,
        'ACCESS-TIMESTAMP:' . $timestamp,
        'ACCESS-SIGN:' . $sign,
        'Content-Type:application/json',
        'Content-Length:'. strlen($body),
);
$context = stream_context_create(array(
        'http' => array(
                'method' => $method,
                'header' => implode(PHP_EOL, $header),
                'content' => $body,
        )
));

// API呼び出し
$response = file_get_contents($url, false, $context);
$result = json_decode($response, true);
print_r($result);

実行すると本当の買い注文がされて、注文受付IDが返ってきます。
注文受付IDは注文をキャンセルする際に使用しますので、実際に自動売買の際はどこかに保存しておく必要がありそうです。

Array
(
    [child_order_acceptance_id] => JRF20170923-070129-170182
)

「bitFlyer Lightning」の注文ウィンドウでも、発注された買い注文が確認できます。
注文前
bitflyer-api12

注文後
bitflyer-api13

まとめ

ご覧いただいたようにPHPでAPIを呼び出すコードは簡単に実装できました。
あとは売買ルールを決めて実装すれば、常にその売買ルールどおりに動くプログラムが完成できるわけです。
もちろん使うAPIも大量になるでしょうし、値を保持しないといけないのでDBアクセスが増えたりと、大げさなプログラムになりそうです。
でも、基本的なAPI接続はできているので、後は骨に肉を付けていくだけです。

自動売買の準備として、「bitFlyer」で常に取引額を収集するプログラムを作りましたので、合わせてご覧くらさい。
関連記事:bitFlyerで常に取引額を収集するプログラムを作ってみた – 自動売買への道(3)