コインチェックのAPIの使い方[PHP]
目次/もくじ
公開:2017/6/21
PHPプログラマと言っても、いろいろな分野の人がいるわけで、WEB系だからと言ってWEB APIがいじれるという訳ではないような気がしています。
PUBLIC API(パブリックAPI)
現在レートを取得
実際のプログラミングの話をします。
1 2 3 4 5 |
$strUrl = "https://coincheck.com/api/ticker"; $file = file_get_contents($strUrl); $file = mb_convert_encoding($file, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); echo $file; |
これはコインチェックのパブリックAPIにPHPでアクセスするためのコードです。こいつは現在のティック(現在レート)を吐き出します。欲しいデータに合わせてURLの最後の方を変更してください。どう変更するかはコインチェックのAPIのドキュメントに書かれています。
PUBLIC APIは非常に単純で、要するに
”ただアクセスすれば値を返すよ”
という状態です。おっぴろげです。
そのため、API KEY(認証に必要なパスワードのようなもの)も必要ありません。
ただし、値はJSON形式で返ってくるので、PHPで処理するには連想配列に格納します。
1 2 3 4 |
$asdf = json_decode($file,true); echo "bid="; echo $asdf["bid"]; |
これで先ほどのデータでは、BidやらAskやらいろいろとデータが入っていましたが、
これでBidだけを取り出せます。
これを再帰的に繰り返せば、現在レートを表示するプログラムやWEBサイトが出来上がるわけですが、各取引所にはAPIのアクセス上限があります。
1秒間に何回もアクセスするようなことをすると、取引所サーバーがDos攻撃と判断してアクセスできなくなってしまうので注意が必要です。アクセス上限は年々厳しくなっているので、厳しくなることを想定して開発することをおすすめします。
例えば、現在の取引所のレートを表示するWEBサイトなんかを作ろうとした場合、上記のPUBLIC APIを入れてしまうと、サイト閲覧者が来るたびに取引所サーバーにアクセスしてしまうので、閲覧者が一定数を超えた段階で表示されなくなるでしょう。
(単位時間当たりに取引所サーバーにアクセスする回数を制限し、自前のサーバーのデータベースにレート情報を入れてそこから表示するというのが落としどころだと思います。)
PRIVATE API(プライベートAPI)
PrivateAPI(自分のアカウントにログインしないとできないこと)を触ります。
まず、コインチェックにログインして、API KEYとシークレットキーを取得します。
(取得の仕方は「コインチェック APIキー 取得」とかで検索してみてください。)
PRIVATE APIを使うには、まず自分の情報をハッシュ化する必要があります。
ハッシュというのは、一方通行の暗号みたいなもので(厳密にはちょっと違う)、
パスワードやログイン情報を盗み見されてもハッカーに分かりにくくなります。
暗号と違うところは、暗号は暗号化されたものを復元することができるのに対し、ハッシュは復元できません。そのため、両サイドが同じハッシュの結果になるかどうかで認証が正しいかチェックします。(専門ではないので間違ってたらごめんなさい。)
コインチェックでは、
大きな数字+アクセスするURL+アクセスする内容
を一つの文字列にして、シークレットキーと一緒に合体させてハッシュ化する仕様です。
最初の”大きな数字”は、アクセスする度に大きくなっている必要がある数字です。
難しく考えずにUNIXタイムスタンプを使いましょう。
(UNIXタイムスタンプとは、1970/1/1からの経過秒です。)
ハッシュ化
ハッシュ化は、PHPには関数があり、hash_hmac()関数を使います。
ハッシュにもいろいろ種類がありますが、コインチェックではハッシュ方式も”sha256″で指定しているので、これをそのまま使います。
このハッシュをアクセスする際にヘッダー(HTTPで送信するときの件名みたいなもの)に組み込みます。
組み込むことで、特定のユーザーアカウントに部分的にログインした状態と同じになり、アカウントの情報を引き出すことができます。
残高取得とHTTPリクエスト
ハッシュをヘッダーに含めHTTPリクエストします。
HTTPリクエストというのは、通常のWEBアクセスの通信プロトコルのことです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php $strUrl = "https://coincheck.com/api/accounts/balance"; $intNonce = time(); $arrQuery = array("hoge" =>; "foo"); $strAccessSecret = "API_SECRET"; $strAccessKey = "Access_key"; $strMessage = $intNonce . $strUrl . http_build_query($arrQuery); //create hash with PHP function $strSignature = hash_hmac("sha256", $strMessage, $strAccessSecret); $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"ACCESS-KEY:".$strAccessKey."\r\n". "ACCESS-NONCE:".$intNonce."\r\n". "ACCESS-SIGNATURE:".$strSignature."\r\n", 'content'=>http_build_query($arrQuery) ) ); $context = stream_context_create($opts); $file = file_get_contents($strUrl, false, $context); print_r($file); ?> |
コインチェックではヘッダーの内容に、ACCESS-KEY、ACCESS-NONCE、ACCESS-SIGNATUREを含めるように指定しているので、その通りにします。
ACCESS-KEYは、アクセスキーです。シークレットキーではないので注意してください。
ACCESS-NONCEは、アクセスする度に増加させなければならない整数(今回はタイムスタンプ)です。
ACCESS-SIGNATUREは、前回生成したハッシュです。
これらを上記のようにしてヘッダーに含めます。配列のhttpはhttpsにしなくてもOKです。
また、アクセス方式はGETにしてください。
コンテンツは最初に決めたものと同じにしないと、ハッシュをした意味がなくなりますので、
そのままいじらないでください。
これでコインチェックの自アカウントの各コインの残高が表示されるはずです。
残高取得の関数化
下記はコインチェックにPrivateAPIでアクセスし残高を取得するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 |
$strUrl = "https://coincheck.com/api/accounts/balance"; $intNonce = time(); $arrQuery = array("hoge" => "foo"); $strAccessSecret = "API_SECRET"; $strAccessKey = "ACCESS_KEY"; $strMessage = $intNonce . $strUrl . http_build_query($arrQuery); //create hash with PHP function $strSignature = hash_hmac("sha256", $strMessage, $strAccessSecret); |
APIキーと秘密鍵を書き換えれば動くはずです。
アクセスするURLは、取得したい内容になって適宜変えてください。
上の例では口座残高のURLです。
残高を参照する場合、アクセスする際の中身は、ぶっちゃけなんでもいいので、できるだけ中身のないものにしてください。
(中身がない方が少しだけ通信に負担がかかりません)
APIでオーダーを出す
「Private apiでそれぞれの取引所の癖がわかったので、取引のリクエストは簡単なはず」
そう思っていた時期が私にもありました。
しかし、ここからいろいろと苦戦する日々が続きました。
まず結果から言うと、
「コインチェックは、Pricate APIの残高を参照する場合はfile_get_contentsが使えるが、
取引のリクエストをするときにはCURLでないと上手くいかない。(原因は不明)」
また、
「ビットフライヤーは、残高を参照する場合はHTTPヘッダをいろいろ省いてもOKだが、
取引リクエストのときにはコンテンツタイプや文字数をちゃんと入れないといけない。」
という仕様があります。
いやー、取引所ごとに仕様が違うのは仕方ないとして、APIの内部で微妙に仕様変えるのは勘弁してください。
残高の照会で上手くいってるから、取引も同じように行くはずだと思うじゃないですか。
ここら辺、かなり手こずりました。
WEB API使おうとして、ここらで挫折した人、多いんじゃないでしょうか。
下記はコインチェックにAPIからオーダーを出すための記述です。
アクセスキーや秘密鍵などを書き換えれば動きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php $orderamount = 0.005; $AccessKey_c = "アクセスキー"; $AccessSecret_c = "秘密鍵"; FUNCTION TradeCC($ordertype,$orderrate) { global $orderamount; global $AccessKey_c; global $AccessSecret_c; $orderpair = "btc_jpy"; $URL_c = "https://coincheck.com/api/exchange/orders"; $intNonce_c = time(); $arrQuery_c = array("rate" => $orderrate, "amount" => $orderamount, "order_type" => $ordertype, "pair" => $orderpair,); $Body_c = http_build_query($arrQuery_c); $Message_c = $intNonce_c . $URL_c . $Body_c; $Signature_c = hash_hmac("sha256", $Message_c, $AccessSecret_c); $curl_c = curl_init(); $options_c = array( CURLOPT_HTTPHEADER => array( "ACCESS-KEY: $AccessKey_c\r\n". "ACCESS-NONCE: $intNonce_c\r\n". "ACCESS-SIGNATURE: $Signature_c", ), CURLOPT_POST => true, CURLOPT_BODY => $Body_c ); curl_setopt($curl_c, CURLOPT_URL, $URL_c); curl_setopt($curl_c, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl_c, CURLOPT_POSTFIELDS, $Body_c); curl_setopt_array($curl_c, $options_c); echo "<br>COINCHECK TRADE"; $res_c = curl_exec($curl_c); echo "<br>"; curl_close($curl_c); }?> |
コインチェックの最小ロットは0.005です。
また、APIでトレードできるのはビットコイン(btc_jpy)のみです。
コインチェックを使う理由としてアルトコインのバリエーションがあるのに、APIが使えるのはビットコインだけという何とも残念な結果です。
(あと、コインチェックさん、てか和田氏。ドキュメントのサイドメニュー被ってるメニューがあります。あと、PHPのライブラリ直してくださいよ。)
この後、アービトラージをする予定ですが、せっかくZAIFの最小ロットが0.0001でも、
コインチェックの最小ロットが0.005なので、アービトラージのデバッグは0.005でやらざるを得ません。
信用取引
コインチェックの現物取引は、買いの場合にビットコインではなく、円で指定しなければならないという謎縛りがありましたが、信用取引の場合はその呪縛から解放されます。(現物の場合は交換する量を○○BTCではなく、○○円分と指定しなければならなかった)
現物か信用かは、オーダータイプで指定します。
(ビットフライヤーは通貨ペアで指定します。)
その他に特にこれと言って注意点はありませんが、証拠金を入れる場所は現物の場合と変わりますので、信用でやる場合にはレバレッジ口座に証拠金が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php FUNCTION TradeCC($ordertype,$orderamount,$orderrate) { global $AccessKey_c; global $AccessSecret_c; $orderpair = "btc_jpy"; if( $ordertype == "buy" ) { $ordertype = "leverage_buy"; $arrQuery_c = array("amount" => $orderamount, "order_type" => $ordertype, "pair" => $orderpair,); } else if( $ordertype == "sell" ) { $ordertype = "leverage_sell"; $arrQuery_c = array("amount" => $orderamount, "order_type" => $ordertype, "pair" => $orderpair,); } $URL_c = "https://coincheck.com/api/exchange/orders"; $intNonce_c = round(microtime(true) * 1000);//time(true); $Body_c = http_build_query($arrQuery_c); $Message_c = $intNonce_c . $URL_c . $Body_c; $Signature_c = hash_hmac("sha256", $Message_c, $AccessSecret_c); $curl_c = curl_init(); curl_setopt($curl_c,CURLOPT_RETURNTRANSFER,true); $options_c = array( CURLOPT_HTTPHEADER => array( "ACCESS-KEY: $AccessKey_c\r\n". "ACCESS-NONCE: $intNonce_c\r\n". "ACCESS-SIGNATURE: $Signature_c", ), CURLOPT_POST => true, CURLOPT_BODY => $Body_c ); curl_setopt($curl_c, CURLOPT_URL, $URL_c); curl_setopt($curl_c, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl_c, CURLOPT_POSTFIELDS, $Body_c); curl_setopt_array($curl_c, $options_c); $res_c = curl_exec($curl_c); curl_close($curl_c); $res_c = "CoinCheck:".$res_c; //echo $res_c; return $res_c; }?> |
上記の関数は成行注文なので、オーダーレートは指定しなくてもOKです。
(指値取引の名残です。)
アービトラージには、これまで行ってきた現物でトレードする方法と、信用取引でトレードする方法があります。
例えば、FXにおけるアービトラージは信用取引ですが、金(きん)の現物のさや取りなんかは現物です。
現物のアービトラージと信用のアービトラージは似ているようで全然別物で、基本的に信用取引の方が難易度は上がります。現物の場合は、レート差が縮まらない場合に最終手段として”送金”という手があるのですが、信用の場合はそれができません。
そのため、「レート差は、理論上広がったら縮まるはずだが、縮まらない可能性もある」のが信用取引のアービトラージです。
しかし、レバレッジをかけることができるので、現物レートのようにレートが推移すればビッグチャンスがあるのも信用取引アービトラージのメリットではあります。
- PREV
- バイナリーオプションのバックテスト(過去検証)のやり方
- NEXT
- ZAIFのAPIの使い方[PHP]
関連記事
-
APIビットコインアービトラージシステム
ここまで業者間アービトラージシステムのプログラミングの考察?をしてきましたが、 中には「中身がどう
-
ZAIFのAPIの使い方[PHP]
APIを使ってbitFlyerからレートを取得したり、残高を確認したり、オーダーを出す方法まとめです
-
仮想通貨の自動売買API開発 使用言語と方向性
公開:2017/6/21 今ならAPIの仕様の改良により、 CoinCheck、ZAIF、bit
-
[API]ビットコインスキャルピングの自動売買システムの作り方(Poloniex)
「アービトラージあるからいいじゃん」ってずっと思ってたのですが、(今でも思ってる)スキャルピングに関
-
bitFlyerのAPIの使い方と注意事項
APIを使ってbitFlyerからレートを取得したり、残高を確認したり、オーダーを出す方法まとめです