wiki/examples/php/cli.md
<?php
error_reporting(E_ALL);
date_default_timezone_set('UTC');
include './ccxt.php';
use React\Async;
date_default_timezone_set('UTC');
echo 'PHP v' . PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION . "\n";
echo 'CCXT version :' . \ccxt\async\Exchange::VERSION . "\n";
$main = function() use ($argv) {
if (count($argv) > 2) {
# first we filter the args
$verbose = count(array_filter($argv, function ($option) { return strstr($option, '--verbose') !== false; })) > 0;
$args = array_values(array_filter($argv, function ($option) { return strstr($option, '--verbose') === false; }));
$demo = count(array_filter($argv, function ($option) { return strstr($option, '--demo') !== false; })) > 0;
$args = array_values(array_filter($argv, function ($option) { return strstr($option, '--demo') === false; }));
$test = count(array_filter($args, function ($option) { return strstr($option, '--test') !== false || strstr($option, '--testnet') !== false || strstr($option, '--sandbox') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--test') === false && strstr($option, '--testnet') === false && strstr($option, '--sandbox') === false; }));
$debug = count(array_filter($args, function ($option) { return strstr($option, '--debug') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--debug') === false; }));
$spot = count(array_filter($args, function ($option) { return strstr($option, '--spot') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--spot') === false; }));
$no_keys = count(array_filter($args, function ($option) { return strstr($option, '--no-keys') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--no-keys') === false; }));
$swap = count(array_filter($args, function ($option) { return strstr($option, '--swap') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--swap') === false; }));
$future = count(array_filter($args, function ($option) { return strstr($option, '--future') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--future') === false; }));
$option = count(array_filter($args, function ($option) { return strstr($option, '--option') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--option') === false; }));
$new_updates = count(array_filter($args, function ($option) { return strstr($option, '--newUpdates') !== false; })) > 0;
$args = array_values(array_filter($args, function ($option) { return strstr($option, '--newUpdates') === false; }));
$id = $args[1];
$member = $args[2];
$args = array_slice($args, 3);
$exchange_found = in_array($id, \ccxt\async\Exchange::$exchanges);
if ($exchange_found) {
$keys_global = './keys.json';
$keys_local = './keys.local.json';
$keys_file = file_exists($keys_local) ? $keys_local : $keys_global;
$config = json_decode(file_get_contents($keys_file), true);
$settings = array_key_exists($id, $config) ? $config[$id] : array();
$config = array_merge($settings, array(
'verbose' => $verbose && $debug, // set to true for debugging
));
// instantiate the exchange by id
$exchange = null;
if (in_array($id, \ccxt\pro\Exchange::$exchanges)) {
$exchange = '\\ccxt\\pro\\' . $id;
} else {
$exchange = '\\ccxt\\async\\' . $id;
}
$exchange = new $exchange($config);
if ($spot) {
$exchange->options['defaultType'] = 'spot';
} else if ($swap) {
$exchange->options['defaultType'] = 'swap';
} else if ($future) {
$exchange->options['defaultType'] = 'future';
} else if ($option) {
$exchange->options['defaultType'] = 'option';
}
if ($new_updates) {
$exchange->newUpdates = true;
}
if ($test) {
$exchange->set_sandbox_mode(true);
} else if ($demo) {
$exchange->enable_demo_trading(true);
}
if (!$no_keys) {
// check auth keys in env var
foreach ($exchange->requiredCredentials as $credential => $is_required) {
if ($is_required && !$exchange->$credential ) {
$credential_var = strtoupper($id . '_' . $credential); // example: KRAKEN_SECRET
$credential_value = getenv($credential_var);
if ($credential_value) {
if (str_contains($credential_value, "---BEGIN")) {
$credential_value = str_replace('\n', "\n", $credential_value);
}
$exchange->$credential = $credential_value;
}
}
}
}
$args = array_map(function ($arg) {
global $exchange;
if ($arg[0] === '{' || $arg[0] === '[')
return json_decode($arg, true);
if ($arg === 'NULL' || $arg === 'null')
return null;
if (preg_match('/^[+-]?[0-9]+$/', $arg))
return intval ($arg);
if (preg_match('/^[.eE0-9+-]+$/', $arg))
return floatval ($arg);
if (preg_match('/^[0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2}[T\s]?[0-9]{2}[:]?[0-9]{2}[:]?[0-9]{2}/', $arg))
return $exchange->parse8601($arg);
else
return $arg;
}, $args);
$markets_path = '.cache/' . $exchange->id . '-markets.json';
if (file_exists($markets_path)) {
$markets = json_decode(file_get_contents($markets_path), true);
$exchange->markets = $markets;
} else {
yield $exchange->load_markets();
}
$exchange->verbose = $verbose;
echo $exchange->id . '->' . $member . '(' . @implode(', ', $args) . ")\n";
$is_ws_method = false;
if (mb_strpos($member, 'watch') !== false) {
$is_ws_method = true;
}
while (true) {
try {
$result = yield call_user_func_array(array($exchange, $member), $args);
echo print_r($result, true) . "\n";
if (!$is_ws_method) {
# make sure to exit with exit code zero here
exit(0);
}
} catch (\ccxt\NetworkError $e) {
echo get_class($e) . ': ' . $e->getMessage() . "\n";
exit(1);
} catch (\ccxt\ExchangeError $e) {
echo get_class($e) . ': ' . $e->getMessage() . "\n";
exit(1);
} catch (Exception $e) {
echo get_class($e) . ': ' . $e->getMessage() . "\n";
if (property_exists($exchange, $member)) {
echo print_r($exchange->$member, true) . "\n";
} else {
echo $exchange->id . '->' . $member . ": no such property\n";
}
exit(1);
}
}
} else {
echo 'Exchange ' . $id . " not found\n";
exit(1);
}
} else {
print_r('Usage: php -f ' . __FILE__ . " exchange_id member [args...]\n");
exit(1);
}
};
function teste() {
yield 0;
}
$promise = Async\coroutine($main);
Async\await($promise);
?>