mirror of
https://github.com/LBRYFoundation/pool.git
synced 2025-08-23 09:27:25 +00:00
240 lines
6.2 KiB
PHP
240 lines
6.2 KiB
PHP
<?php
|
|
|
|
function doPoloniexCancelOrder($OrderID=false, $pair=false, $poloniex=false)
|
|
{
|
|
if(!$OrderID) return;
|
|
if(!$pair) return;
|
|
|
|
if(!$poloniex) $poloniex = new CcexAPI;
|
|
|
|
$res = $poloniex->cancel_order($pair,$OrderID);
|
|
|
|
if($res && $res['success'])
|
|
{
|
|
$db_order = getdbosql('db_orders', "market=:market AND uuid=:uuid", array(
|
|
':market'=>'poloniex', ':uuid'=>$OrderID
|
|
));
|
|
if($db_order) $db_order->delete();
|
|
}
|
|
}
|
|
|
|
function doPoloniexTrading()
|
|
{
|
|
$exchange = 'poloniex';
|
|
$updatebalances = !YAAMP_ALLOW_EXCHANGE;
|
|
|
|
$poloniex = new poloniex;
|
|
|
|
// add orders
|
|
$savebalance = getdbosql('db_balances', "name='$exchange'");
|
|
$balances = $poloniex->get_complete_balances();
|
|
|
|
if (is_array($balances))
|
|
foreach($balances as $symbol => $balance)
|
|
{
|
|
if ($symbol == 'BTC') {
|
|
if (is_object($savebalance)) {
|
|
$savebalance->balance = $balance['available'];
|
|
$savebalance->save();
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if ($updatebalances) {
|
|
// store available balance in market table
|
|
$coins = getdbolist('db_coins', "symbol=:symbol OR symbol2=:symbol",
|
|
array(':symbol'=>$symbol)
|
|
);
|
|
if (empty($coins)) continue;
|
|
foreach ($coins as $coin) {
|
|
$market = getdbosql('db_markets', "coinid=:coinid AND name='$exchange'", array(':coinid'=>$coin->id));
|
|
if (!$market) continue;
|
|
$market->balance = $balance['available'];
|
|
$market->ontrade = arraySafeVal($balance,'onOrders',0);
|
|
$market->balancetime = time();
|
|
$market->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!YAAMP_ALLOW_EXCHANGE) return;
|
|
|
|
$flushall = rand(0, 8) == 0;
|
|
|
|
$min_btc_trade = 0.00010000; // minimum allowed by the exchange
|
|
$sell_ask_pct = 1.05; // sell on ask price + 5%
|
|
$cancel_ask_pct = 1.20; // cancel order if our price is more than ask price + 20%
|
|
|
|
sleep(1);
|
|
$tickers = $poloniex->get_ticker();
|
|
if(!$tickers) return;
|
|
|
|
// update orders
|
|
$coins = getdbolist('db_coins', "enable=1 AND dontsell=0 AND id IN (SELECT DISTINCT coinid FROM markets WHERE name='poloniex')");
|
|
foreach($coins as $coin)
|
|
{
|
|
$pair = "BTC_$coin->symbol";
|
|
if(!isset($tickers[$pair])) continue;
|
|
|
|
sleep(1);
|
|
$orders = $poloniex->get_open_orders($pair);
|
|
if(!$orders || !isset($orders[0]))
|
|
{
|
|
dborun("DELETE FROM orders WHERE coinid={$coin->id} AND market='poloniex'");
|
|
continue;
|
|
}
|
|
|
|
foreach($orders as $order)
|
|
{
|
|
if(!isset($order['orderNumber']))
|
|
{
|
|
debuglog($order);
|
|
continue;
|
|
}
|
|
|
|
if($order['rate'] > $tickers[$pair]['lowestAsk']*$cancel_ask_pct || $flushall)
|
|
{
|
|
debuglog("poloniex: cancel order for $pair {$order['orderNumber']}");
|
|
sleep(1);
|
|
doPoloniexCancelOrder($order['orderNumber'], $pair, $poloniex);
|
|
//$poloniex->cancel_order($pair, $order['orderNumber']);
|
|
|
|
//$db_order = getdbosql('db_orders', "market=:market AND uuid=:uuid", array(
|
|
// ':market'=>'poloniex', ':uuid'=>$order['orderNumber']
|
|
//));
|
|
//if($db_order) $db_order->delete();
|
|
}
|
|
|
|
else
|
|
{
|
|
$db_order = getdbosql('db_orders', "market=:market AND uuid=:uuid", array(
|
|
':market'=>'poloniex', ':uuid'=>$order['orderNumber']
|
|
));
|
|
if($db_order) continue;
|
|
|
|
// debuglog("poloniex: save order $coin->symbol");
|
|
$db_order = new db_orders;
|
|
$db_order->market = 'poloniex';
|
|
$db_order->coinid = $coin->id;
|
|
$db_order->amount = $order['amount'];
|
|
$db_order->price = $order['rate'];
|
|
$db_order->ask = $tickers[$pair]['lowestAsk'];
|
|
$db_order->bid = $tickers[$pair]['highestBid'];
|
|
$db_order->uuid = $order['orderNumber'];
|
|
$db_order->created = time();
|
|
$db_order->save();
|
|
}
|
|
}
|
|
|
|
$list = getdbolist('db_orders', "coinid={$coin->id} AND market='poloniex'");
|
|
foreach($list as $db_order)
|
|
{
|
|
$found = false;
|
|
foreach($orders as $order)
|
|
{
|
|
if(!isset($order['orderNumber'])) {
|
|
debuglog("poloniex no order id: ".json_encode($order));
|
|
continue;
|
|
}
|
|
|
|
if($order['orderNumber'] == $db_order->uuid) {
|
|
$found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!$found)
|
|
{
|
|
debuglog("poloniex: deleting order {$coin->symbol} $db_order->amount");
|
|
$db_order->delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
// add orders
|
|
|
|
foreach($balances as $symbol=>$balance)
|
|
{
|
|
if(!$balance || !$balance['available']) continue;
|
|
if($symbol == 'BTC') continue;
|
|
|
|
$coin = getdbosql('db_coins', "symbol=:symbol", array(':symbol'=>$symbol));
|
|
if(!$coin || $coin->dontsell) continue;
|
|
|
|
$market = getdbosql('db_markets', "coinid={$coin->id} AND name='poloniex'");
|
|
if($market) {
|
|
$market->lasttraded = time();
|
|
$market->balance = $balance['onOrders'];
|
|
$market->save();
|
|
}
|
|
|
|
$pair = "BTC_$symbol";
|
|
if(!isset($tickers[$pair])) continue;
|
|
|
|
if($coin->sellonbid)
|
|
$sellprice = bitcoinvaluetoa($tickers[$pair]['highestBid']);
|
|
else
|
|
$sellprice = bitcoinvaluetoa($tickers[$pair]['lowestAsk'] * $sell_ask_pct);
|
|
|
|
if($balance['available'] * $sellprice < $min_btc_trade) continue;
|
|
|
|
// debuglog("poloniex selling $pair, $sellprice, $balance");
|
|
sleep(1);
|
|
$res = $poloniex->sell($pair, $sellprice, $balance['available']);
|
|
|
|
if(!isset($res['orderNumber']))
|
|
{
|
|
debuglog($res, 5);
|
|
continue;
|
|
}
|
|
|
|
if(!isset($tickers[$pair])) continue;
|
|
|
|
$coin = getdbosql('db_coins', "symbol=:symbol", array(':symbol'=>$symbol));
|
|
if(!$coin) continue;
|
|
|
|
$db_order = new db_orders;
|
|
$db_order->market = 'poloniex';
|
|
$db_order->coinid = $coin->id;
|
|
$db_order->amount = $balance['available'];
|
|
$db_order->price = $sellprice;
|
|
$db_order->ask = $tickers[$pair]['lowestAsk'];
|
|
$db_order->bid = $tickers[$pair]['highestBid'];
|
|
$db_order->uuid = $res['orderNumber'];
|
|
$db_order->created = time();
|
|
$db_order->save();
|
|
}
|
|
|
|
if(is_object($savebalance))
|
|
if(floatval(EXCH_AUTO_WITHDRAW) > 0 && $savebalance->balance >= (EXCH_AUTO_WITHDRAW + 0.0002))
|
|
{
|
|
$btcaddr = YAAMP_BTCADDRESS;
|
|
|
|
$amount = $savebalance->balance - 0.0002;
|
|
debuglog("poloniex: withdraw $amount BTC to $btcaddr");
|
|
|
|
sleep(1);
|
|
$res = $poloniex->withdraw('BTC', $amount, $btcaddr);
|
|
debuglog($res);
|
|
|
|
if($res && isset($res->response) && strpos($res->response, 'Withdrew') !== false)
|
|
{
|
|
$withdraw = new db_withdraws;
|
|
$withdraw->market = 'poloniex';
|
|
$withdraw->address = $btcaddr;
|
|
$withdraw->amount = $amount;
|
|
$withdraw->time = time();
|
|
$withdraw->save();
|
|
|
|
$savebalance->balance = $savebalance->balance - $amount - 0.0002;
|
|
$savebalance->save();
|
|
}
|
|
}
|
|
|
|
// debuglog('-------------- doPoloniexTrading() done');
|
|
}
|
|
|
|
|
|
|
|
|
|
|