class Notifier_Trade {
const DIR_PL = "PL";
const DIR_LP = "LP";
private static $_lastError = "";
private static $_lastResult = "";
private static $_lastBalanceId;
private static $_lastPercent;
/**
* @param $pair
* @param $dir (poloniex-liquio, liquio-poloniex)
* @param $customAmount
*/
public static function createTrade($pair, $dir, Notifier_CalcResult $result, $balances, $percent) {
self::$_lastResult = "";
$fromAPI = Notifier_Exchange::getByNick($from);
$toAPI = Notifier_Exchange::getByNick($to);
$buyOrders = $fromAPI->getOrders($pair);
$buyOrders = $buyOrders['asks'];
$sellOrders = $toAPI->getOrders($pair);
$sellOrders = $sellOrders['bids'];
$calcResult = Notifier_Calculator::calc($buyOrders, $sellOrders, $result->amountSource, $result->commission, $result->commissionFixed);
if(!empty($calcResult->error)) {
self::$_lastError = $calcResult->error;
return false;
}
if($calcResult->percent < $percent) {
self::$_lastError = "Requested operation percent ({$calcResult->percent}) lower $percent!";
return false;
}
$orderBuy = $fromAPI->buy($pair, $calcResult->lastRateBuy, $calcResult->amountBuy);
if(!$orderBuy) {
self::$_lastError = "ERROR at buy: ".$fromAPI->getLastError();
return false;
}
self::$_lastResult .= "BOUGHT {$from} Pair: {$pair} Rate: $calcResult->lastRateBuy Amount: $calcResult->amountBuy\n";
$orderSell = $toAPI->sell($pair, $calcResult->lastRateSell, $calcResult->amountBuy);
if(!$orderSell) {
self::$_lastError = "ERROR at sell: ".$toAPI->getLastError();
return false;
}
self::$_lastResult .= "SOLD {$to} Pair: {$pair} Rate: $calcResult->lastRateSell Amount: $calcResult->amountBuy\n";
F_DB
::exec("INSERT INTO balancies (dt) VALUES ('%s')", date("Y-m-d H:i:s"));
$balanceId = F_DB::lastInsertId();
self::$_lastBalanceId = $balanceId;
self::$_lastPercent = $result->percent;
foreach ($balances[$from] as $currency => $amount) {
F_DB
::exec("INSERT INTO balancies_curr (balance_id, location, `currency`, `value`) VALUES (%d, '%s','%s','%s')", $balanceId, $from, $currency, $amount);
}
foreach ($balances[$to] as $currency => $amount) {
F_DB
::exec("INSERT INTO balancies_curr (balance_id, location, `currency`, `value`) VALUES (%d, '%s','%s','%s')", $balanceId, $to, $currency, $amount);
}
return true;
/*$poloniex = Notifier_Poloniex::instance();
$liquio = Notifier_Liqui::instance();
$poloniexBalances = $poloniex->getBalances();
if($poloniexBalances === false) {
self::$_lastError = "Unable to get poloniex balances! Error: ".$poloniex->getLastError();
return false;
}
$liquioBalances = $liquio->getBalances();
if($liquioBalances === false) {
self::$_lastError = "Unable to get liquio balances! Error: ".$liquio->getLastError();
return false;
}
if($dir == self::DIR_PL) {
$buyOrders = $poloniex->getOrders($pair, ORDERS_COUNT);
if($buyOrders === false) {
self::$_lastError = "Unable to get Poloniex balances! Error: ".$poloniex->getLastError();
return false;
}
$sellOrders = $liquio->getOrders($pair, ORDERS_COUNT);
if($sellOrders === false) {
self::$_lastError = "Unable to get Liquio balances! Error: ".$liquio->getLastError();
return false;
}
$pairSettings = null;
foreach (PAIRS as $p) {
if($p[0] == $pair) {
$pairSettings = $p;
break;
}
}
if(empty($pairSettings)) {
self::$_lastError = "Unsupported pair (".$pair.")!";
return false;
}
if(!empty($customAmount)) {
$amount = $customAmount;
} else {
$amount = $pairSettings[1];
}
$commission = $pairSettings[2];
$commissionFixed = $pairSettings[3];
$notifyPercent = $pairSettings[4];
$calcResult = Notifier_Calculator::calc($buyOrders['asks'], $sellOrders['bids'], $amount, $commission, $commissionFixed);
list($pair1, $pair2) = explode("_", $pair);
//...
if($poloniexBalances[$pair1] < ($calcResult->amountSource)) {
self::$_lastError = "Insufficient funds!(poloniex) dir: P_L ({$poloniexBalances[$pair1]} < {$calcResult->amountSource})";
return false;
}
if($liquioBalances[$pair2] < $calcResult->amountBuy) {
self::$_lastError = "Insufficient funds!(liquio) dir: P_L ({$liquioBalances[$pair2]} < {$calcResult->amountBuy})";
return false;
}
if(!empty($calcResult->error)) {
self::$_lastError = $calcResult->error;
return false;
}
if($calcResult->percent < $notifyPercent) {
self::$_lastError = "Requested operation percent lower $notifyPercent ({$calcResult->percent})!";
return false;
}
$orderPoloniex = $poloniex->buy($pair, $calcResult->lastRateBuy, $calcResult->amountBuy);
if($orderPoloniex === false) {
self::$_lastError = "Error at buy Poloniex: ".$poloniex->getLastError();
return false;
}
self::$_lastResult .= "Buy $pair, Rate {$calcResult->lastRateBuy}, Amount: {$calcResult->amountSource}";
$orderLiquio = $liquio->sell($pair, $calcResult->lastRateSell, $calcResult->amountBuy);
if($orderLiquio === false) {
self::$_lastError = "Error at sell Liquio: ".$liquio->getLastError();
return false;
}
self::$_lastResult .= "||| Sell $pair, Rate {$calcResult->lastRateSell}, Amount: {$calcResult->amountBuy}";
} else if($dir == self::DIR_LP) {
$buyOrders = $liquio->getOrders($pair, ORDERS_COUNT);
if($buyOrders === false) {
self::$_lastError = "Unable to get Liquio balances! Error: ".$liquio->getLastError();
return false;
}
$sellOrders = $poloniex->getOrders($pair, ORDERS_COUNT);
if($sellOrders === false) {
self::$_lastError = "Unable to get Poloniex balances! Error: ".$poloniex->getLastError();
return false;
}
$pairSettings = null;
foreach (PAIRS as $p) {
if($p[0] == $pair) {
$pairSettings = $p;
break;
}
}
if(empty($pairSettings)) {
self::$_lastError = "Unsupported pair (".$pair.")!";
return false;
}
if(!empty($customAmount)) {
$amount = $customAmount;
} else {
$amount = $pairSettings[1];
}
$commission = $pairSettings[2];
$commissionFixed = $pairSettings[3];
$notifyPercent = $pairSettings[4];
$calcResult = Notifier_Calculator::calc($buyOrders['asks'], $sellOrders['bids'], $amount, $commission, $commissionFixed);
list($pair1, $pair2) = explode("_", $pair);
//...
if($liquioBalances[$pair1] < $calcResult->amountSource) {
self::$_lastError = "Insufficient funds!(liquio) dir: L_P ({$liquioBalances[$pair1]} < {$calcResult->amountSource})";
return false;
}
if($poloniexBalances[$pair2] < $calcResult->amountBuy) {
self::$_lastError = "Insufficient funds!(poloniex) dir: L_P ({$poloniexBalances[$pair2]} < {$calcResult->amountBuy})";
return false;
}
if(!empty($calcResult->error)) {
self::$_lastError = $calcResult->error;
return false;
}
if($calcResult->percent < $notifyPercent) {
self::$_lastError = "Requested operation percent lower $notifyPercent ({$calcResult->percent})!";
return false;
}
$orderLiquio = $liquio->buy($pair, $calcResult->lastRateBuy, $calcResult->amountBuy);
if($orderLiquio === false) {
self::$_lastError = "Error at buy Liquio: ".$liquio->getLastError();
return false;
}
self::$_lastResult .= "Buy $pair, Rate {$calcResult->lastRateBuy}, Amount: {$calcResult->amountBuy}";
$orderPoloniex = $poloniex->sell($pair, $calcResult->lastRateSell, $calcResult->amountBuy);
if($orderPoloniex === false) {
self::$_lastError = "Error at sell Poloniex: ".$poloniex->getLastError();
return false;
}
self::$_lastResult .= "||| Sell $pair, Rate {$calcResult->lastRateSell}, Amount: {$calcResult->amountBuy}";
} else {
self::$_lastError = "Unsupported direction (".$dir.")!";
return false;
}
F_DB::exec("INSERT INTO balancies (dt) VALUES ('%s')", date("Y-m-d H:i:s"));
$balanceId = F_DB::lastInsertId();
self::$_lastBalanceId = $balanceId;
self::$_lastPercent = $calcResult->percent;
foreach ($poloniexBalances as $currency => $amount) {
F_DB::exec("INSERT INTO balancies_curr (balance_id, location, `currency`, `value`) VALUES (%d, '%s','%s','%s')", $balanceId, "poloniex", $currency, $amount);
}
foreach ($liquioBalances as $currency => $amount) {
F_DB::exec("INSERT INTO balancies_curr (balance_id, location, `currency`, `value`) VALUES (%d, '%s','%s','%s')", $balanceId, "liquio", $currency, $amount);
}
return true;
*/
}
private static function create(Notifier_CalcResult $calc) {
}
public static function getLastError() {
return self::$_lastError;
}
public static function getLastResult() {
return self::$_lastResult;
}
public static function getLastBalanceId() {
return self::$_lastBalanceId;
}
public static function getLastPercent() {
return self::$_lastPercent;
}