Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> 仮想通貨、ブロックチェーン関連 -> 【アービトラージ】仮想通貨5社間で価格差を計算するプログラム【PHP】

【アービトラージ】仮想通貨5社間で価格差を計算するプログラム【PHP】

BitFlyer、BitBank、Quoine、BTCBox、CoinCheckの5社間で、
BTC/JPYの価格差を計算するプログラムをPHPで作ってみました。

ただのノリで作っただけなので、細かい事は気にしないでくださいw

なんとなくcoincheckのみ、composerからライブラリをインストールしているので、事前に、composer initした上で、composer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述し、composer installしておく必要があります。

<?php
// coincheck用ライブラリのインクルード。
// あらかじめcomposer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述のうえ、
// composer installしておく。
require "vendor/autoload.php";
use Coincheck\Coincheck;
$coincheck= new Coincheck('ACCESS_KEY', 'API_SECRET');

// 変数の初期化
$min_ask = -1;
$max_bid = -1;
$ask_name = $bid_name = "";

$vars = array(
    "BitFlyer" => get_bitflyer_ticker(),
    "BitBank" => get_bitbank_ticker(),
    "Quoine" => get_quoine_ticker(),
    "BTCBox" => get_btcbox_ticker(),
    "CoinCheck" => get_coincheck_ticker(),
);

$cnt = 0;
foreach($vars as $name => $data){
    calc_min_max($name, $data);
    if($cnt == 0){
        $first_time = $data["time"];
    }
    echo "[{$name}] ask:{$data["ask"]} bid:{$data["bid"]} spread:{$data["spread"]} time:{$data["time"]}\n";
    $cnt++;
}

$last_time = $data["time"];
$spread = $max_bid - $min_ask;
echo "Best Ask : {$min_ask}($ask_name), Best Bid : {$max_bid}($bid_name), Spread: ($spread)\n";
echo "Benefit: ".(int)$spread."\n";
echo "Time Difference: ".((int)$last_time - (int)$first_time)." Sec \n";
if($spread > 1000 && (int)$last_time - (int)$first_time <= 1){
    echo "Status: True\n";
}else{
    echo "Status: False\n";
}

////////////////////////
// BitFlyerのTickerを読み込む関数
////////////////////////
function get_bitflyer_ticker(){
    $data = json_decode(file_get_contents("https://api.bitflyer.com/v1/getticker"));
    if(!empty($data) && !empty($data->best_bid) && !empty($data->best_ask)){
        $bid = $data->best_bid;
        $ask = $data->best_ask;
        $spread = $bid - $ask;
        return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
    }else{
        return null;
    }
}

////////////////////////
// BitBankのTickerを読み込む関数
////////////////////////
function get_bitbank_ticker(){
    $data = json_decode(file_get_contents("https://public.bitbank.cc/btc_jpy/ticker"));
    if(@$data->success){
        $ask = $data->data->sell;
        $bid = $data->data->buy;
        $spread = $bid - $ask;
        return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
    }else{
        return false;
    }
}

////////////////////////
// QuoineのTickerを読み込む関数
////////////////////////
function get_quoine_ticker(){
    $data = json_decode(file_get_contents("https://api.liquid.com/products/5"));
    if(!empty($data) && $data->currency_pair_code == "BTCJPY"){
        $ask = $data->market_ask;
        $bid = $data->market_bid;
        $spread = $bid - $ask;
        return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
    }else{
        return false;
    }
}

////////////////////////
// BTCBoxのTickerを読み込む関数
////////////////////////
function get_btcbox_ticker(){
    $data = json_decode(file_get_contents("https://www.btcbox.co.jp/api/v1/ticker/"));
    if(!empty($data) && !empty($data->sell) && !empty($data->buy)){
        $ask = $data->sell;
        $bid = $data->buy;
        $spread = $bid - $ask;
        return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
    }else{
        return false;
    }
}
    
////////////////////////
// CoincheckのTickerを読み込む関数
////////////////////////
function get_coincheck_ticker(){
    global $coincheck;
    $data = $coincheck->ticker->all();
    if(!empty($data) && !empty($data["ask"]) && !empty($data["bid"])){
        $data["spread"] = $data["bid"] - $data["ask"];
        $data["time"] = date("Gis");
        return $data;
    }else{
        return null;
    }
}

////////////////////////
// AskとBidの最小値・最大値を算出する関数
////////////////////////
function calc_min_max($label, $data){
    global $min_ask, $max_bid, $ask_name, $bid_name;
    if($data){
        if($min_ask == -1 || $data["ask"] < $min_ask){
            $min_ask = $data["ask"];
            $ask_name = $label;
        }
        if($max_bid == -1 || $data["bid"] > $max_bid){
            $max_bid = $data["bid"];
            $bid_name = $label;
        }
    }
}
?>


実行結果は、下記のような感じ。

[BitFlyer] ask:723734 bid:723689 spread:-45 time:74004
[BitBank] ask:724401 bid:724388 spread:-13 time:74004
[Quoine] ask:723239.81 bid:722994.81 spread:-245 time:74004
[BTCBox] ask:725147 bid:725047 spread:-100 time:74005
[CoinCheck] ask:724317 bid:724251 spread:-66 time:74005
Best Ask : 723239.81(Quoine), Best Bid : 725047(BTCBox), Spread: (1807.1899999999)
Benefit: 1807
Time Difference: 1 Sec
Status: True


Time Differenceは、各社のAPIを読み込んで、最初から最後までかかった時間を秒単位で計算しています。
この値が高い場合はFalseとします。
(あまりにもAPI取得に時間がかかりすぎると、価格自体が信用できないため)

Benefitは、最小の購入価格と最大の売却価格の差、つまり、利益です。
利益が1000円以上の場合は、Trueとしています。

この続きのプログラムが書きたい方は、自己責任でお願いします。

この記事の最終更新日:2018/10/16
最初に記事を書いた日:2018/10/16

この記事をシェアする

このエントリーをはてなブックマークに追加

Meteoric Streamについて

管理人

Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> 仮想通貨、ブロックチェーン関連 -> 【アービトラージ】仮想通貨5社間で価格差を計算するプログラム【PHP】