#author("2017-12-07T02:00:08+09:00","","")
#navi(../)
* Zaifのtrade APIを使って新規注文・現物売買のPHPサンプルコードおよび実行結果 [#ff25964c]
trade APIを使用することにより、&htmlinsert(zaif.html);で新規注文をすることができます。~
以下にPHPを使用したサンプルコードおよび実行例を記します。

----
&color(red){当サイトに記載されている会社名、製品名などは一般に各社または団体の商標または登録商標です。&br;当サイトの資料により直接的および間接的障害が生じても一切責任を負いません。&br;あらかじめご了承ください。};
----

#contents
#htmlinsert(zaif_wide_1.html)

* 関連記事 [#ac6dbd3c]
-[[API動作環境構築>API/環境構築]]
-[[currencies・通貨情報の取得(PHP)>API/zaif/currencies(PHP)]]
-[[currency_pairs・通貨ペア情報を取得(PHP)>API/zaif/currency_pairs(PHP)]]
-[[last_price・現在の終値を取得(PHP)>API/zaif/last_price(PHP)]]
-[[ticker・ティッカーを取得(PHP)>API/zaif/ticker(PHP)]]
-[[depth・板情報を取得(PHP)>API/zaif/depth(PHP)]]
-[[trades・全ての取引履歴を取得(PHP)>API/zaif/trades(PHP)]]
-[[取引通貨一覧の取得(PHP)>API/zaif/取引通貨一覧の取得(PHP)]]

-[[ZaifのAPIキー生成手順>API/zaif/APIキー生成手順]]
-[[アカウントの残高確認(PHP)>API/zaif/残高確認・get_info, get_info2(PHP)]]
-[[新規注文・現物売買(PHP)>API/zaif/新規注文・現物売買・trade(PHP)]]


* trade APIを使用 [#ha484b18]
本APIを使用するには、&htmlinsert(zaif.html);の口座開設が必要となります。

- ''trade'' API仕様~
ZaifAPI ドキュメントページから抜粋~
http://techbureau-api-document.readthedocs.io/ja/latest/trade/2_individual/7_trade.html
 trade
 取引注文を行います。
 
 パラメータ
 パラメータ	必須	詳細	型
 currency_pair	Yes	(例) btc_jpy	str(例 btc_jpy)
 action	Yes	注文の種類	bid もしくは ask
 price	Yes	指値注文価格	numerical
 amount	Yes	数量(例: 0.3)	numerical
 limit	No	リミット注文価格	numerical
 comment	No	コメントの追加	str
 <省略>
 戻り値
 <省略>
 received 今回の注文で約定した取引量 float
 remains  今回の注文で約定せず、板に残った取引量    float
 order_id 今回の注文がすべて成立した場合は0、一部、もしくはすべて約定しなかった場合は板に残った注文のID。 int
 funds    残高 dict
この記事では、パラメータのlimit, commentは使用しません。

* 現物取引注文(新規注文)のサンプルコード [#j60ac8cf]
#ref(zaif_order.php.zip)
 <?php
 // API doc : http://techbureau-api-document.readthedocs.io/ja/latest/trade/2_individual/7_trade.html
 
 // zaif trade api url
 $zaif_api_url  = "https://api.zaif.jp/tapi";
 // api method name
 $method = "trade";
 
 // Please set API_KEY and API_SECRET_KEY
 $API_KEY = ""; 
 $API_SECRET_KEY = ""; 
 
 // proxy settings
 $proxy      = "";
 $proxy_port = "";
 
 // currency pairs
 $currency_pairs = array(
      "bch_btc" ,"bch_jpy" ,"bitcrystals_btc"
     ,"bitcrystals_jpy" ,"btc_jpy" ,"cicc_btc"
     ,"cicc_jpy" ,"eth_btc" ,"eth_jpy"
     ,"fscc_btc" ,"fscc_jpy" ,"jpyz_jpy"
     ,"mona_btc" ,"mona_jpy" ,"ncxc_btc"
     ,"ncxc_jpy" ,"pepecash_btc" ,"pepecash_jpy"
     ,"sjcx_btc" ,"sjcx_jpy" ,"xcp_btc"
     ,"xcp_jpy" ,"xem_btc" ,"xem_jpy"
     ,"zaif_btc" ,"zaif_jpy"
     ,"erc20.cms_jpy", "mosaic.cms_jpy"
 );
 
 // check arguments
 if (!check_arguments($argc, $argv, $currency_pairs)) {
     usage();
     die(1);
 }
 if($argv[1] == "list") {
     // show currency_pairs
     foreach($currency_pairs as $cur) {
         printf("%s" . PHP_EOL, $cur);
     }
     exit(0);
 }
 
 // check amount and price
 if (!is_numeric($argv[3])) {
     fputs(STDERR, "amount: " . $argv[3] . " is not numeric." . PHP_EOL);
     exit(1);
 }
 if (!is_numeric($argv[4])) {
     fputs(STDERR, "price: " . $argv[4] . " is not numeric." . PHP_EOL);
     exit(1);
 }
 
 // show order request
 printf("action         : %s" . PHP_EOL, $argv[1]);
 printf("currency pair  : %s" . PHP_EOL, $argv[2]);
 printf("amount * price : %f * %f = %f" . PHP_EOL,
     $argv[3], $argv[4], $argv[3] * $argv[4]);
 print("----------------------------------------" . PHP_EOL);
 // yes or no
 if (!yes_no()) {
     exit(0);
 }
 
 $nonce = time();
 $body = http_build_query(
     array(
         "nonce"=>$nonce,
         "method"=>$method,
         "action"=>$argv[1],
         "currency_pair"=>$argv[2],
         "amount"=>$argv[3],
         "price"=>$argv[4]
     )
 );
 
 $signature = hash_hmac("sha512", $body, $API_SECRET_KEY);
 
 $headers = array(
     "Sign: {$signature}",
     "Key: {$API_KEY}"
 );
 
 $curl = curl_init();
 if ($curl == FALSE) {
     fputs(STDERR, "[ERR] curl_init(): " . curl_error($curl) . PHP_EOL);
     die(1);
 }
 
 // curl set options
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
 // set proxy server settings
 if (!empty($proxy) && !empty($proxy_port)) {
     curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1);
     curl_setopt($curl, CURLOPT_PROXY, $proxy . ":" . $proxy_port);
     curl_setopt($curl, CURLOPT_PROXYPORT, $proxy_port);
 }
 
 curl_setopt($curl, CURLOPT_URL, $zaif_api_url);
 curl_setopt($curl, CURLOPT_POST, TRUE);
 curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
 
 $response = curl_exec($curl);
 if ($response == FALSE) {
     fputs(STDERR, "[ERR] curl_exec(): " . curl_error($curl) . PHP_EOL);
     die(1);
 }
 
 // json decode
 $json_decode = json_decode($response, true);
 if ($json_decode == NULL) {
     fputs(STDERR, "[ERR] json_decode(): " . json_last_error_msg() . PHP_EOL);
     die(1);
 }
 
 curl_close($curl);
 
 print_r($json_decode);
 exit(0);
 
 //------------------------------
 // function
 //------------------------------
 function check_arguments($argc, $argv, $currency_pair) {
     if (($argc != 2) and ($argc != 5)) {
         return FALSE;
     }
     $opts = $currency_pair;
     array_push($opts, "list", "bid", "ask");
     if (!in_array($argv[1], $opts)) {
         return FALSE;
     }
     return TRUE;
 }
 
 function usage() {
     fputs(STDERR,
         "Usage: php order.php ACTION CURRENCY_PAIR AMOUNT PRICE" . PHP_EOL .
         "ACTION:" . PHP_EOL .
         "   - list : show all currency pair code" . PHP_EOL .
         "     currency pair code : show specified currency pair trades" . PHP_EOL .
         "   - bid : buy action" . PHP_EOL .
         "   - ask : sell action" . PHP_EOL .
         "CURRENCY_PAIR : Trade currency pair code" . PHP_EOL .
         "   show currency pair : php order.php list" . PHP_EOL .
         "AMOUNT : order quantity" . PHP_EOL .
         "PRICE  : order price" . PHP_EOL  .
         PHP_EOL .
         "e.g. : php order.php list" . PHP_EOL .
         "       show all currency pair code" . PHP_EOL .
         "e.g. : php order.php bid eth_jpy 0.1 50000" . PHP_EOL .
         "       buy order, 0.1 amount and price 5000JPY" . PHP_EOL .
         PHP_EOL);
 }
 
 function yes_no() {
     while (TRUE) {
         print("OK? [yes/no] :");
         $ok = trim(fgets(STDIN));
         if(!strcasecmp($ok, "yes")) {
             $ok = TRUE;
             break;
         } elseif(!strcasecmp($ok, "no")) {
             print("Order canceled." . PHP_EOL);
             $ok = FALSE;
             break;
         } else {
             print("Please check the input." . PHP_EOL);
         }
     }   
     return $ok;
 }

#htmlinsert(zaif_wide_2.html)

** APIキー, APIシークレットキー [#v4b6b8cc]
上記サンプルコード内にある、以下の部分ですが、APIキーの設定が必要となります。
 $API_KEY = "APIキーを設定してください"; 
 $API_SECRET_KEY = "APIシークレットキーを設定してください。"; 
以下の記事を参考にAPIキーを取得してください。
-[[Zaif APIキー生成手順>API/zaif/APIキー生成手順]]

APIキーを生成すると以下のスクリーンショットのように2つのAPIキーが表示されます。~
今回は、tradeするので、tradeにチェックを入れておく必要があります。
#ref(01.png)

* 本サンプルコードの使い方 [#yab2c30a]
オプションを渡さず本サンプルコードを実行すると使用方法が表示されます。
 $ php zaif_order.php
 Usage: php zaif_order.php ACTION CURRENCY_PAIR AMOUNT PRICE
 ACTION:
    - list : show all currency pair code
      currency pair code : show specified currency pair trades
    - bid : buy action
    - ask : sell action
 CURRENCY_PAIR : Trade currency pair code
    show currency pair : php zaif_order.php list
 AMOUNT : order quantity
 PRICE  : order price
 
 e.g. : php zaif_order.php list
        show all currency pair code
 e.g. : php zaif_order.php bid eth_jpy 0.1 50000
        buy order, 0.1 amount and price 5000JPY

- オプションに''list''のみ渡すと取引可能通貨ペア一覧が表示されます。~
ハードコードしてあるので、通貨ペアが増減した場合は修正が必要です。~
最新の通貨ペアを取得したい場合は、「[[取引通貨一覧の取得(PHP)>API/zaif/取引通貨一覧の取得(PHP)]]」記事を参照ください。
 $ php zaif_order.php list
 bch_btc
 bch_jpy
 bitcrystals_btc
 bitcrystals_jpy
 <snip>
 zaif_jpy
 erc20.cms_jpy
 mosaic.cms_jpy
#br
- 注文
以下の順番でオプション(パラメータ)を渡します。
+ ACTION~
bid または ask を設定します。~
bidは買い注文、askは売り注文になります。
#br
+ CURRENCY_PAIR~
取引注文する通貨ペアを指定します。
通貨ペア一覧は上記の通り、listを渡し実行すると通貨ペア一覧が表示されます。
#br
+ AMOUNT~
数量を指定します。
#br
+PRICE~
金額を指定します。
#br
- 注文発行の確認を表示~
yes/noが表示されるので、注文を実行する場合はyesを入力しEnterキーを押してください。~
中止する場合は、noを入力しEnterキーを押してください。

* 実行結果 [#mca1237d]
以下に本サンプルコードを実行し、ETH/JPYの売り注文、買い注文をした時の出力です。~

** bid 買い注文 [#id21fef7]
 $ php order.php bid eth_jpy 0.004 50000
 action         : bid 
 currency pair  : eth_jpy
 amount * price : 0.004000 * 50000.000000 = 200.000000
 ----------------------------------------
 OK? [yes/no] :yes
 Array
 (
    [success] => 1
    [return] => Array
        (
            [received] => 0
            [remains] => 0.004
            [order_id] => 1111111
            [funds] => Array
                (
                    [jpy] => 0.00018044
                    <省略>
                )
 
        )
 
 )
ZaifのWebページを確認すると買い注文がされているのが確認できます。~
#ref(03.png)

** ask 売り注文 [#xabb142a]
 $ php order.php ask eth_jpy 0.004 55000
 action         : ask 
 currency pair  : eth_jpy
 amount * price : 0.004000 * 55000.000000 = 220.000000
 ----------------------------------------
 OK? [yes/no] :yes
 Array
 (
    [success] => 1
    [return] => Array
        (
            [received] => 0
            [remains] => 0.004
            [order_id] => 2222222
            [funds] => Array
                (
                    [jpy] => 200.00018044
                    <省略>
                )
 
        )
 
 )
ZaifのWebページを確認すると売り注文がされているのが確認できます。~
#ref(02.png)

* 注意点 [#b858e07a]
本サンプルコードを公開した時点では、以下のエラーが多発しました。~
ちょうど乱高下していた時なので注文が通りにくかったのでしょうね。~
この場合は、再度実行してみてください。
 Array
 (
     [success] => 0
     [error] => trade temporarily unavailable.
 )


以上、trade APIを使用し現物・新規注文をするサンプルコードおよび実行例でした。

#htmlinsert(zaif_wide_3.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS