Poloniex APIのPHPラッパーの利用結果と一部修正。



いまさら(2017/12/6)ながら、Poloniex API使う。
意外とすんなりと上手くいったのでAPIのレスポンスを見返すためにも残します。


 - Poloniex - API DOCUMENTATIONは[こちら](https://poloniex.com/support/api/)
 - APIのPHP Wrapperは[Poloniex - API DOCUMENTATION](https://poloniex.com/support/api/)にあった[PHP wrapper by compcentral](https://pastebin.com/iuezwGRZ)を使いました。


今回は[Poloniexの PHP Wrapper](https://pastebin.com/iuezwGRZ)を`polo.php`として保存し、`main.php`から呼び出して実行させます.

※ APIの実行には`APIキー`と`SECRETキー`が必要なのでPoloniex HPから取得しておきます.


```php

// 実行
php main.php ABCDEFG-YOUR-APIKEY-HIJKLMN abcd0your0secret0keys0123456789
```

`APIキー`と`SECRETキー`は環境に残しておくのはあまり好きでないので、`main.php`の引数としてます


以下、`main.php`で、`poloniex`クラスに実装されている関数を実行し結果を残しています。


```php

<?php
/*
 * main.pnp
 */

require_once 'polo.php';


# コマンドライン引数からAPIキーとSecretキーを取得
$apy_key = $argv[1];
$secret_key = $argv[2];


$p = new poloniex($apy_key, $secret_key);


/* 以下実行結果 */


// Public API Methods
$ret = $p->get_trading_pairs();
// 利用できる通貨ペアを取得
// array(99) {
//   [0] =>
//   string(7) "BTC_BCN"
//   [1] =>
//   string(8) "BTC_BELA"
//   [2] =>
//  ....


// Public API Methods
$ret = $p->get_order_book("ALL");
// 現時点での注文板を表示
// var_dump($ret['XMR_ZEC']['bids']);
// array(50) {
//   [0] =>
//   array(2) {
//     [0] =>
//     string(10) "1.26728153"
//     [1] =>
//     double(2.1E-5)
//   }
//   [1] =>
//   array(2) {
//     [0] =>
//     string(10) "1.24250061"
//     [1] =>
//     double(155.90149009)
//   }


// Public API Methods
$ret = $p->get_volume();
// 取引総量を表示
//   'USDT_BTC' =>
//   array(2) {
//     'USDT' =>
//     string(17) "74938426.36199297"
//     'BTC' =>
//     string(13) "6309.72084154"
//   }
//   'USDT_DASH' =>
//   array(2) {
//     'USDT' =>
//     string(16) "2260852.12898294"
//     'DASH' =>
//     string(13) "3038.97564685"
//   }
//   'USDT_LTC' =>
//   array(2) {
//     'USDT' =>
//     string(16) "4205524.08145450"
//     'LTC' =>
//     string(14) "41639.03123061"
//   }


// Public API Methods
$ret = $p->get_ticker("USDT_BTC");
// 特定の通貨ペアの`Ticker`取得
// array(10) {
//   'id' =>
//   int(121)
//   'last' =>
//   string(14) "12438.16711453"
//   'lowestAsk' =>
//   string(14) "12438.16000000"
//   'highestBid' =>
//   string(14) "12430.00000019"
//   'percentChange' =>
//   string(10) "0.07596601"
//   'baseVolume' =>
//   string(17) "75541818.20710723"
//   'quoteVolume' =>
//   string(13) "6357.91442531"
//   'isFrozen' =>
//   string(1) "0"
//   'high24hr' =>
//   string(14) "12497.00000000"
//   'low24hr' =>
//   string(14) "11459.29472806"
// }




// Trading API Methods
$ret = $p->get_balances();
// 自分の持つ各コインの総量を取得
// array(291) {
//   '1CR' =>
//   string(10) "0.00000000"
//   'ABY' =>
//   string(10) "0.00000000"
//   'AC' =>
//   string(10) "0.00000000"
//   'ACH' =>
//   string(10) "0.00000000"


// Trading API Methods
$ret = $p->buy("USDT_BTC", 12400, 0.000001);
//BTCをUSDTで買い注文. rate=12400[USDT/BTC] Amoun=0.000001[BTC]
// ※ つまり、USDTでBTCを購入.
// array(2) {
//   'orderNumber' =>
//   string(12) "118649087266"
//   'resultingTrades' =>
//   array(1) {
//     [0] =>
//     array(6) {
//       'amount' =>
//       string(10) "0.00000100"
//       'date' =>
//       string(19) "2017-12-06 06:49:21"
//       'rate' =>
//       string(14) "12364.99999850"
//       'total' =>
//       string(10) "0.01236499"
//       'tradeID' =>
//       string(8) "14200718"
//       'type' =>
//       string(3) "buy"
//     }
//   }
// }

// Trading API Methods
$ret = $p->sell("USDT_BTC", 12400, 0.000001);
// BTCをUSDTで買い注文. rate=12400[USDT/BTC] Amoun=0.000001[BTC]
// ※ つまり、所有しているBTCを売る.
// array(2) {
//   'orderNumber' =>
//   string(12) "118649814538"
//   'resultingTrades' =>
//   array(0) {
//   }
// }


// Trading API Methods
$ret = $p->get_my_trade_history("USDT_BTC");
// 買い注文が約定されていた場合、売買履歴に記録されている.
// array(1) {
//   [0] =>
//   array(10) {
//     'globalTradeID' =>
//     int(279065068)
//     'tradeID' =>
//     string(8) "12300321"
//     'date' =>
//     string(19) "2017-12-06 06:49:21"
//     'rate' =>
//     string(14) "12345.999"
//     'amount' =>
//     string(10) "0.00000100"
//     'total' =>
//     string(10) "0.012345"
//     'fee' =>
//     string(10) "0.00250000"
//     'orderNumber' =>
//     string(12) "118321876662"
//     'type' =>
//     string(3) "buy"
//     'category' =>
//     string(8) "exchange"
//   }
// }


// Trading API Methods
$ret = $p->cancel_order("USDT_BTC", 118650367984);
// 注文のキャンセル. HPの「MY OPEN ORDER」表の未決算注文をキャンセルします。


// Trading API Methods
$ret = $p->get_open_orders("ALL");
// 未決算注文の一覧を表示
//array(99) {
//   'BTC_AMP' =>
//   array(0) {
//   }
//   'BTC_ARDR' =>
//   array(0) {
//   }
//   'BTC_BCH' =>
//   array(0) {
//   }
//   'BTC_BCN' =>
//   array(0) {
//   }
//   'BTC_BCY' =>



// Trading API Methods
$ret = $p->withdraw("BTC", 0.0000001, "Sy6tu7cJ<送金先アドレス>CYr31");
// (通貨, 送金量, 送金先アドレス)
// Poloniex HPにてAPIのWithdrawals権限を有効にしていないとエラーとなります。
// 
// ** API Optionsの"Enable Withdrawals"を許可してない場合 **
// array(1) {
//   'error' =>
//   string(30) "Permission to withdraw denied."
// }


 

$ret = $p->get_total_btc_balance();
// 今保有しているコインのBTC換算量 (一部コードを修正)
// Poloniex HPの「BALANCES, DEPOSITS & WITHDRAWALS」あたりで確認しました。
// double(5.081294646709107)


```

## Poloniex APIクラス修正

poloniex.get_total_btc_balance()の実行時にエラーがでてしまうので修正。[2017/12/6]

どうも`$prices[$pair]`が配列なのに`$amount`らと四則演算してしまい型のエラー? 適当に動作するように修正。Poloniex HPの「BALANCES, DEPOSITS & WITHDRAWALS」あたりで確認したところ大きく外れないので正しそう。
※ 自信はないのでミスあると教えて頂けるとありがたいです


```php

public function get_total_btc_balance() {
	
	$balances = $this->get_balances();
	+ sleep(0.2); // 念のため
	
	$prices = $this->get_ticker();
	+ sleep(0.2); // 念のため
	
	+ $open_orders_S = $this->get_open_orders("ALL"); // 配列保持しておき,forループ内で毎回APIを叩くのを軽減

	$tot_btc = 0;

	foreach($balances as $coin => $amount){
		$pair = "BTC_".strtoupper($coin);
		
		// ****************************************
		// convert coin balances to btc value
		// ****************************************
		if($amount > 0){
			if($coin != "BTC"){
			    - $tot_btc += $amount * $prices[$pair];
			    + $tot_btc += $amount * $prices[$pair]['last'];
			}else{
				$tot_btc += $amount;
			}
		}

		// ****************************************
		// process open orders as well
		// ****************************************
		if($coin != "BTC"){
			
			- $open_orders = $this->get_open_orders($pair); // 配列保持しておき,forループ内で毎回APIを叩くのを軽減
			+ $open_orders = $open_orders_S[$pair];
			+ if($open_orders == NULL) continue;

			foreach($open_orders as $order){
				if($order['type'] == 'buy'){
					$tot_btc += $order['total'];
					
				}elseif($order['type'] == 'sell'){
					- $tot_btc += $order['amount'] * $prices[$pair];
					+ $tot_btc += $order['amount'] * $prices[$pair]['last'];
					
				}
			}
		}
	}

	return $tot_btc;
}

```



## おまけ

Poloniexで取り扱っているキーペアの種類を吐き出すサンプルです。コーディング中に意外と探したりするので吐き出していると便利だったりします。


```php

/*
 * 取り扱いペアの一覧を吐き出し
 */ 

$ret = $p->get_trading_pairs();

// 以下trading_pairs.txtに吐き出し
ob_start();
var_dump($ret);
$result =ob_get_contents();
ob_end_clean();

$fp = fopen("./trading_pairs.txt", "w" );
fputs($fp, $result);
fclose( $fp );
```