こんにちは、ビットコインの自動売買を夢見ている龍権(@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」の注文ウィンドウでも、発注された買い注文が確認できます。
注文前
注文後
まとめ
ご覧いただいたようにPHPでAPIを呼び出すコードは簡単に実装できました。
あとは売買ルールを決めて実装すれば、常にその売買ルールどおりに動くプログラムが完成できるわけです。
もちろん使うAPIも大量になるでしょうし、値を保持しないといけないのでDBアクセスが増えたりと、大げさなプログラムになりそうです。
でも、基本的なAPI接続はできているので、後は骨に肉を付けていくだけです。
自動売買の準備として、「bitFlyer」で常に取引額を収集するプログラムを作りましたので、合わせてご覧くらさい。
関連記事:bitFlyerで常に取引額を収集するプログラムを作ってみた – 自動売買への道(3)