Author

Topic: poliniex watcher: small commandline price watcher (Read 2402 times)

sr. member
Activity: 812
Merit: 250
A bit complicated and this is new to me. there is an easier application. but I appreciate your hard work.
hopefully many people are interested.  Smiley
full member
Activity: 163
Merit: 100
Do anyone have a desktop watcher?
hero member
Activity: 581
Merit: 504
thx, still working
(i know its an old thread - sry)
sr. member
Activity: 266
Merit: 250
hi,

this is nothing fancy... its just a very small php script (which doesnt need a webserver) which uses the api-php from poliniex.

it looks at your balances and prints this:

Code:
                                      BTC Value                Last                 Ask                 Bid %Change    Volume
   BTC:          0.12004677
   XMR:          8.43757394          0.05536635          0.00656188          0.00669000          0.00656187     24%       700
        buy 20 @ 0.0064 total: 0.128 BTC

   BBR:        100.00000000          0.19579900          0.00195799          0.00203201          0.00195883      3%        67


Total BTC: 0.49921212


i use it together with watch to see whats going on.
Code:
watch "php -e c.php"

...and here it is
Code:

$key = "PLACE YOUR API KEY HERE";
$secret = "PLACE YOUR API SECRET HERE";

class poloniex {
protected $api_key;
protected $api_secret;
protected $trading_url = "https://poloniex.com/tradingApi";
protected $public_url = "https://poloniex.com/public";

public function __construct($api_key, $api_secret) {
$this->api_key = $api_key;
$this->api_secret = $api_secret;
}

private function query(array $req = array()) {
// API settings
$key = $this->api_key;
$secret = $this->api_secret;

// generate a nonce to avoid problems with 32bit systems
$mt = explode(' ', microtime());
$req['nonce'] = $mt[1].substr($mt[0], 2, 6);

// generate the POST data string
$post_data = http_build_query($req, '', '&');
$sign = hash_hmac('sha512', $post_data, $secret);

// generate the extra headers
$headers = array(
'Key: '.$key,
'Sign: '.$sign,
);

// curl handle (initialize if required)
static $ch = null;
if (is_null($ch)) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT,
'Mozilla/4.0 (compatible; Poloniex PHP bot; '.php_uname('a').'; PHP/'.phpversion().')'
);
}
curl_setopt($ch, CURLOPT_URL, $this->trading_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

// run the query
$res = curl_exec($ch);

if ($res === false) throw new Exception('Curl error: '.curl_error($ch));
//echo $res;
$dec = json_decode($res, true);
if (!$dec){
//throw new Exception('Invalid data: '.$res);
return false;
}else{
return $dec;
}
}

protected function retrieveJSON($URL) {
$opts = array('http' =>
array(
'method'  => 'GET',
'timeout' => 10
)
);
$context = stream_context_create($opts);
$feed = file_get_contents($URL, false, $context);
$json = json_decode($feed, true);
return $json;
}

public function get_balances() {
return $this->query(
array(
'command' => 'returnBalances'
)
);
}

public function get_open_orders($pair) {
return $this->query(
array(
'command' => 'returnOpenOrders',
'currencyPair' => strtoupper($pair)
)
);
}

public function get_my_trade_history($pair) {
return $this->query(
array(
'command' => 'returnTradeHistory',
'currencyPair' => strtoupper($pair)
)
);
}

public function buy($pair, $rate, $amount) {
return $this->query(
array(
'command' => 'buy',
'currencyPair' => strtoupper($pair),
'rate' => $rate,
'amount' => $amount
)
);
}

public function sell($pair, $rate, $amount) {
return $this->query(
array(
'command' => 'sell',
'currencyPair' => strtoupper($pair),
'rate' => $rate,
'amount' => $amount
)
);
}

public function cancel_order($pair, $order_number) {
return $this->query(
array(
'command' => 'cancelOrder',
'currencyPair' => strtoupper($pair),
'orderNumber' => $order_number
)
);
}

public function withdraw($currency, $amount, $address) {
return $this->query(
array(
'command' => 'withdraw',
'currency' => strtoupper($currency),
'amount' => $amount,
'address' => $address
)
);
}

public function get_trade_history($pair) {
$trades = $this->retrieveJSON($this->public_url.'?command=returnTradeHistory¤cyPair='.strtoupper($pair));
return $trades;
}

public function get_order_book($pair) {
$orders = $this->retrieveJSON($this->public_url.'?command=returnOrderBook¤cyPair='.strtoupper($pair));
return $orders;
}

public function get_volume() {
$volume = $this->retrieveJSON($this->public_url.'?command=return24hVolume');
return $volume;
}

public function get_ticker($pair = "ALL") {
$pair = strtoupper($pair);
$prices = $this->retrieveJSON($this->public_url.'?command=returnTicker');
if($pair == "ALL"){
return $prices;
}else{
$pair = strtoupper($pair);
if(isset($prices[$pair])){
return $prices[$pair];
}else{
return array();
}
}
}

public function get_trading_pairs() {
$tickers = $this->retrieveJSON($this->public_url.'?command=returnTicker');
return array_keys($tickers);
}

public function get_total_btc_balance() {
$balances = $this->get_balances();
$prices = $this->get_ticker();

$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];
}else{
$tot_btc += $amount;
}
}

// process open orders as well
if($coin != "BTC"){
$open_orders = $this->get_open_orders($pair);
foreach($open_orders as $order){
if($order['type'] == 'buy'){
$tot_btc += $order['total'];
}elseif($order['type'] == 'sell'){
$tot_btc += $order['amount'] * $prices[$pair];
}
}
}
}

return $tot_btc;
}
}

$polo = new poloniex($key, $secret);
$balances = $polo->get_balances();
$ticker = $polo->get_ticker();

echo str_pad("", 27)
. str_pad('BTC Value', 20, " ", STR_PAD_LEFT)
. str_pad('Last', 20, " ", STR_PAD_LEFT)
. str_pad('Ask', 20, " ", STR_PAD_LEFT)
. str_pad('Bid', 20, " ", STR_PAD_LEFT)
. str_pad('%Change', 8, " ", STR_PAD_LEFT)
. str_pad('Volume', 10, " ", STR_PAD_LEFT)
. "\r\n";

$totalbtc = 0;

foreach ($balances as $currency=>$balance) {
if($balance > 0.0001) {

echo str_pad($currency, 6, " ", STR_PAD_LEFT)
. ':'
. str_pad(number_format($balance, 8, '.' , ',' ), 20, " ", STR_PAD_LEFT);

if($currency != 'BTC') {
$tick = $ticker['BTC_' . $currency];
if($tick['isFrozen'] > 0) {
echo ' FROZEN';
} else {
$totalbtc += $balance * $tick['last'];
echo str_pad(number_format($balance * $tick['last'], 8, '.' , ',' ), 20, " ", STR_PAD_LEFT)
. str_pad(number_format($tick['last'], 8, '.' , ',' ), 20, " ", STR_PAD_LEFT)
. str_pad(number_format($tick['lowestAsk'], 8, '.' , ',' ), 20, " ", STR_PAD_LEFT)
. str_pad(number_format($tick['highestBid'], 8, '.' , ',' ), 20, " ", STR_PAD_LEFT)
. str_pad(number_format($tick['percentChange']*100, 0, '.' , ',' ), 7, " ", STR_PAD_LEFT)
. '%'
. str_pad(number_format($tick['baseVolume'], 0, '.' , ',' ), 10, " ", STR_PAD_LEFT);
echo "\r\n";
$orders = $polo->get_open_orders('BTC_' . $currency);

if($orders) {
foreach ($orders as $order) {
$totalbtc += $order['total'];
echo "\t" . $order['type'] . ' ' . $order['amount'] . ' @ ' . $order['rate'] . ' total: ' . $order['total'] . " BTC\r\n";
}
}
}
} else {
$totalbtc += $balance;
}
echo "\r\n";
}
}

echo "\r\nTotal BTC: " . number_format($totalbtc, 8, '.' , ',' )

?>


NOTE: you must specify a valid api key in the beginning. this is only used to get your current balances. you can check the code: its very short Wink
Jump to: