ZAIFのAPIの使い方[PHP]

APIを使ってbitFlyerからレートを取得したり、残高を確認したり、オーダーを出す方法まとめです。基本的に関数化しているので、コピペしてちょっといじれば動くと思います。

取引所にこだわらない場合は、コインチェックのAPIが一番癖がなくおすすめです。また、初心者向けに一番詳しく解説しています。

コインチェックのAPIの使い方

bitFlyerのAPIの使い方

 

コピペするだけでZAIFのAPIを使って、レートの取得、残高照会、取引が可能です。

公開:2017/7/10

 

APIにはパブリックAPIとプライベートAPIがあります。パブリックAPIは誰でもほぼ無条件で参照可能なデータ用のAPIで、主にAskレートやBidレートがこれにあたります。

プライベートAPIは各アカウント内で残高を参照したり、取引を行うためのAPIです。ハッシュ化などの操作が必要で、アクセスする前に少し処理が必要です。

Public API

APIによるZAIFのレート取得

<?php
FUNCTION GetTickZF()
{
 global $ZF;
 
 $Url = "https://api.zaif.jp/api/1/ticker/btc_jpy";
 $file = file_get_contents($Url);
 $file = mb_convert_encoding($file, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
 
 $ZF = json_decode($file,true);  
}
?>

 

レート取得はパブリックAPIなので、特定のURLにアクセスするだけで可能です。

ここまでならMT4/MT5のWebRequestでも取得可能なので、レートを引っ張ってきて比較するだけなら、本当に簡単に実装できます。

 

Private API

APIによるZAIFの残高照会

ZAIFの場合は、Githubにあるサンプルがちゃんと動くので、それを使うのもありかと思います。

また、ハッシュは
nonce=”タイムスタンプ”&method=”リクエストする情報タイプ”&その他情報…
でHMAC-SHA512で署名します。

ハッシュって何?という方は一度コインチェックのAPIの解説を見てみてください。

 

ちなみにドキュメントの説明

「signはPOSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)を URLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、Secret Keyを用いてHMAC-SHA512で署名します。」

が滅茶滅茶わかりにくいと思ったのは、私だけではないはず。
日本語のパラメータはないので、URLエンコードする必要はないと思います。

 

あとZAIFはタイムスタンプに小数点以下も使えるので、この際小数点以下のタイムスタンプにします。

これによってどんな違いが生まれるかというと、一秒間に2回以上のアクセスが可能になるわけです。
(整数の場合、一秒以内に2回以上アクセスすると、タイムスタンプが同数なので、エラーになります。)


<?php
$URL_z = "https://api.zaif.jp/tapi";
	$TimeStamp_z = microtime(true);
	$arrQuery_z = array("nonce" => $TimeStamp_z, 
						"method" => "get_info");
	$Body_z = http_build_query($arrQuery_z);
	
	
	$AccessKey_z = "アクセスキー";
	$AccessSecret_z = "シークレットキー"; 
	
	$Signature_z = hash_hmac("sha512", $Body_z, $AccessSecret_z);
	
	
	$curl_z = curl_init();
				
	$headers_z  = array(
				    "Sign: {$Signature_z}",
				    "Key: {$AccessKey_z}",
				    );
	curl_setopt($curl_z, CURLOPT_URL, $URL_z);
	curl_setopt($curl_z, CURLOPT_POST, true);
	curl_setopt($curl_z, CURLOPT_POSTFIELDS,$Body_z);
	curl_setopt($curl_z, CURLOPT_HTTPHEADER,$headers_z) ;
	
	 
	echo "<br>ZAIF PRIVATE API-------------<br>";
	$res_z =  curl_exec($curl_z);
	echo $res_z;
	echo "<br>-----------------<br>";
	 
	curl_close($curl_z);
?>

長ったらしいので関数化すると、

<?php
$AccessSecret_z = "";
FUNCTION EquityZF()
{
	global $AccessSecret_z;
	
	$URL_z = "https://api.zaif.jp/tapi";
	$TimeStamp_z = microtime(true);
	$arrQuery_z = array("nonce" => $TimeStamp_z, 
						"method" => "get_info");
	$Body_z = http_build_query($arrQuery_z);
	$Signature_z = hash_hmac("sha512", $Body_z, $AccessSecret_z);
	$res_z = CURL_ZF("POST",$Signature_z,$URL_z,$Body_z);
	return $res_z;
}
?>

こんな感じです。

CURLの関数を呼び出しているので、CURLの関数もどこかに張り付けておいてください。

 

CURLによるプライベートAPIのアクセスの関数化

プライベートAPIではCURLによるアクセスを何度もするので、ここだけまとめておくとコードの冗長化を防げます。

よく分からなくても、他のコピペ関数で呼び出しに使われるので、とりあえずはりつけておいてください。

<?php
FUNCTION CURL_ZF($postorget,$Signature_z,$URL_z,$Body_z)
{
	global $AccessKey_z;
	
	$curl_z = curl_init();
	if( $postorget == "POST" )
	{
		curl_setopt($curl_z, CURLOPT_POST, true);
		curl_setopt($curl_z, CURLOPT_POSTFIELDS,$Body_z);
	}
	else if( $postorget == "GET" )
	{
		
	}
	curl_setopt($curl_z,CURLOPT_RETURNTRANSFER,true);		
	$headers_z  = array(
				    "Sign: {$Signature_z}",
				    "Key: {$AccessKey_z}",
				    );
	curl_setopt($curl_z, CURLOPT_URL, $URL_z);
	curl_setopt($curl_z, CURLOPT_HTTPHEADER,$headers_z) ;
	$res_z =  curl_exec($curl_z);
	curl_close($curl_z);
	return($res_z);
}?>

 

 

APIによる取引注文

WEB APIを使って取引注文を出します。

取引の場合、残高参照よりも送らなければならない情報が増加します。

ZAIFの場合は、パラメータに取引に必要なデータを追加します。


パラメーター	必須	詳細	型
currency_pair	Yes	(例) btc_jpy	str(例 btc_jpy)
action	Yes	注文の種類	bid もしくは ask
price	Yes	指値注文価格	numerical
amount	Yes	数量(例: 0.3)	numerical
limit	No	リミット注文価格	numerical

メソッド名は「trade」です。

最小注文サイズは0.0001BTCなので、比較的細かく注文できます。
(現時点ではビットコインの価値からして小ロットで回せますが、今後バカ高くなったらお試しで回すのも大変ですね。)

 

当たり前ですが、あらかじめビットコインと円をある程度入れておいてください。
残念ながら現時点では、paypalのようにデバッグ用のサンドボックスはないので、実資産でデバッグするしかありません。

 

今回、トレードの処理は記述が長くなるので、関数化しました。

TradeZF(“buy”か”sell”,取引ロット);で使えるZAIFのトレード関数です。

<?php
FUNCTION TradeZF($ordertype,$orderlot)
{
	global $AccessSecret_z;
	global $zf_ordertype;

	if($ordertype == "buy" )
	{
		$action = "bid";
		$rateForMarketOrder = $orderrate+5000;
	}
	else if($ordertype == "sell" )
	{
		$action = "ask";
		$rateForMarketOrder = $orderrate-5000;
	}
	
	if( $zf_ordertype == "spot" )
	{
		$method = "trade";
		$URL_z = "https://api.zaif.jp/tapi";
	}
	else if( $zf_ordertype == "leverage" )
	{
		$method = "create_position";
		$URL_z = "https://api.zaif.jp/tlapi";
	}
	$zf_leverage = 5;
	
	
	
	$TimeStamp_z = microtime(true);
	$arrQuery_z = array("nonce" => $TimeStamp_z, 
						"method" => $method,
						"currency_pair" => "btc_jpy",
						"action" => $action,
						"price" => $rateForMarketOrder,
						"amount" => $orderlot,
						"leverage" => $zf_leverage,
						"type" => "margin");
	$Body_z = http_build_query($arrQuery_z);
	$Signature_z = hash_hmac("sha512", $Body_z, $AccessSecret_z);
	
	$res_z = CURL_ZF("POST",$Signature_z,$URL_z,$Body_z);
	if( strstr($res_z,"inventory is out of order") ) $res_z = $res_z."約定拒否されました。";
	if( strstr($res_z,"504 Gateway Time-out") ) $res_z = $res_z."取引所がサーバーダウンしています";
	if( strstr($res_z,"502 Bad Gateway") ) $res_z = $res_z."取引所がサーバーダウンしています";
	$res_z = "ZAIF:".$res_z;
	
	return $res_z;
}?>

特に注意点はないです。実際にトレードするのでフェイルセイフだけは忘れないようにしてください。

 

ポジションデータの取得

信用取引の場合はポジション(建玉)のデータを取得する必要があります。

$res_zにレスポンスが格納されるので、整形して使ってやってください。

<?php
FUNCTION GetPositionDataZF()
{
	global $AccessSecret_z;
	
	$method = "active_positions";
	
	$URL_z = "https://api.zaif.jp/tlapi";
	$TimeStamp_z = microtime(true);
	$arrQuery_z = array("nonce" => $TimeStamp_z, 
						"method" => $method,
						"currency_pair" => "btc_jpy",
						"type" => "margin");
	$Body_z = http_build_query($arrQuery_z);
	$Signature_z = hash_hmac("sha512", $Body_z, $AccessSecret_z);
	$res_z = CURL_ZF("POST",$Signature_z,$URL_z,$Body_z);
	
	return $res_z;
}?>

 

 

ZAIFのAPIの仕様には残念な点が多い

今までZAIFはAPIでの信用取引ができませんでしたが、今月の上旬からできるようになったそうです。

そこでちょっと触ってい見たのですが、ちょっといろいろおかしいところ満載です。

現物と信用と呼び出しエンドポイントが違う

APIをたたく際のURLが現物と信用で違います。
(まぁ、まだ許せる)

Ask=売り、Bid=買い とかどこのトーシロ?

この件についてZAIFに問い合わせてみました。

すると
「間違ってないです。ZAIFではBid=買いで Ask=売りです。(キリ)」という旨の返信が返ってきました。

これ~、どうなんでしょうね。

確かにBidとAskはトレーダー側に立つかプロバイダ側に立つかで見方が変わる相対的なものですが、
トレーダーとしてオーダーを出すのであれば、やっぱりAsk=買い、Bid=売りだと思うのですよ。

 

特にFXに慣れている人にとってはかなり違和感があります。

というか、PUBLIC APIでレート取得するときは、「Askの価格>Bidの価格」にちゃんとなってるじゃないですか。

そこら辺つじつまが合っていないような気がします。

後になってからサイレント修正して、しらばっくれそうな気配がします。

がしかし、後から修正されても困るので、もうこのまま突き進んでください。

 

ポジション取得メソッドのjsonが配列ではなくオブジェクト

jsonの中には普通[と{を混在させるのですが、ZAIFはすべて{です。
オブジェクト形式でデコードしたものをとらなくてはいけません。

また、ポジションが複数ある場合、その番号をjsonのキーにしているので、
めっちゃ扱いづらいです。

配列の順番(0,1,2…)で取れるようにするでしょ、普通。

 

信用取引APIに決済メソッドがない

コインチェックには決済メソッドがあります。(MT4と同じ仕様)
ビットフライヤーは反対売買で相殺して処理します。(MT5と同じ仕様)
ZAIFは決済メソッドもなければ、反対売買でも決済できません。(ファーー)

決済はリミットとストップによってのみ行う仕様です。

もうここまでくると擁護できませんね。

酷過ぎる。

不便という次元ではないですよ。

 

顧客への貸付残高が少ない場合、そもそも信用取引ができない

顧客へ貸し付けている残高が少ない場合、そもそも信用の買いができなかったりします。(ZAIFに余剰仮想通貨がある場合で、かつ、それを貸し付けに割り当てている場合だけ信用取引ができる。)

これって、もうサービスとして成立してないじゃないですか。

取引所の都合を考えれば貸付以上の信用取引をさせたくないのはわかりますが、
だったら初めから信用取引なんてしない方がマシです。

 

追記:これはその後ちょっとは改善したみたいです。しかし、サーバーダウン、アクセス拒否が頻発しているので全体的な解決にはなっていないです。

ちょっとZAIFの信用取引には問題ありすぎます。(まぁ、一応実装はするんですけどね)
完全に守りの姿勢って感じですね。

こんなんで大丈夫なんでしょうか。

 

コメント

  1. 星野慶次 より:

    はじめまして。
    突然ですが、私もFXを長年やっていて、Bid/Askで混乱しましたので、コメントさせて頂きます。

    仮想通貨の取引所では、Maker(板に指値をする人)とTaker(板のプライスで成行き売買する人)がいて、FXでは顧客はみんなTakerという感じです。
    Askで売られているものを顧客が買う。
    Bidで買うというところで顧客が売る。

    しかし、仮想通貨のMakerは、
    Askで売りますよ。どうか買ってください。
    Bidで買いますよ。どうか売ってください。
    というような、まるでFX業者側に立った取引になるためBid/Askが逆に感じます。

    現在Zaifでは、成行き注文ができないようになっていますが、Bid/Askで指定するのではなく、Buy/Sellで指定するようにしてほしいものです。

関連記事

bitFlyerのAPIの使い方と注意事項

APIを使ってbitFlyerからレートを取得したり、残高を確認したり、オーダーを出す方法まとめです

記事を読む

[API]ビットコインスキャルピングの自動売買システムの作り方(Poloniex)

「アービトラージあるからいいじゃん」ってずっと思ってたのですが、(今でも思ってる)スキャルピングに関

記事を読む

保護中: BTC,BCH,ETH,LTC現物,信用アービトラージ取引結果まとめ(コインチェック,ザイフ,ビットフライヤー,バイナンス,ポロニエックス)

これまでに開発したAPIによるアービトラージシステムで実際に取引してみた結果です。 現物アービトラ

記事を読む

仮想通貨の自動売買API開発 使用言語と方向性

公開:2017/6/21 今ならAPIの仕様の改良により、 CoinCheck、ZAIF、bit

記事を読む

APIビットコインアービトラージシステム

ここまで業者間アービトラージシステムのプログラミングの考察?をしてきましたが、 中には「中身がどう

記事を読む

 

上に戻る