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


Zaifのtrade APIを使って新規注文・現物売買のPHPサンプルコードおよび実行結果

trade APIを使用することにより、Zaif で新規注文をすることができます。
以下にPHPを使用したサンプルコードおよび実行例を記します。


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


関連記事

trade APIを使用

本APIを使用するには、Zaif の口座開設が必要となります。

  • 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は使用しません。

現物取引注文(新規注文)のサンプルコード

<?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;
}

APIキー, APIシークレットキー

上記サンプルコード内にある、以下の部分ですが、APIキーの設定が必要となります。

$API_KEY = "APIキーを設定してください"; 
$API_SECRET_KEY = "APIシークレットキーを設定してください。"; 

以下の記事を参考にAPIキーを取得してください。

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

01.png

本サンプルコードの使い方

オプションを渡さず本サンプルコードを実行すると使用方法が表示されます。

$ 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)」記事を参照ください。
    $ php zaif_order.php list
    bch_btc
    bch_jpy
    bitcrystals_btc
    bitcrystals_jpy
    <snip>
    zaif_jpy
    erc20.cms_jpy
    mosaic.cms_jpy
     
  • 注文 以下の順番でオプション(パラメータ)を渡します。
  1. ACTION
    bid または ask を設定します。
    bidは買い注文、askは売り注文になります。
     
  2. CURRENCY_PAIR
    取引注文する通貨ペアを指定します。 通貨ペア一覧は上記の通り、listを渡し実行すると通貨ペア一覧が表示されます。
     
  3. AMOUNT
    数量を指定します。
     
  4. PRICE
    金額を指定します。
     
  • 注文発行の確認を表示
    yes/noが表示されるので、注文を実行する場合はyesを入力しEnterキーを押してください。
    中止する場合は、noを入力しEnterキーを押してください。

実行結果

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

bid 買い注文

$ 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ページを確認すると買い注文がされているのが確認できます。

03.png

ask 売り注文

$ 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ページを確認すると売り注文がされているのが確認できます。

02.png

注意点

本サンプルコードを公開した時点では、以下のエラーが多発しました。
ちょうど乱高下していた時なので注文が通りにくかったのでしょうね。
この場合は、再度実行してみてください。

Array
(
    [success] => 0
    [error] => trade temporarily unavailable.
)

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


添付ファイル: file03.png 343件 [詳細] file02.png 332件 [詳細] file01.png 334件 [詳細] filezaif_order.php.zip 322件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-12-07 (木) 02:00:08