Как использовать параметр уровня с coinbase и GDAX

Я использую следующую библиотеку на Github

Мне нужно получить книгу заказов от GDAX. Я делаю это, делая следующее:

$getOrderBook = $exchange->getOrderBook($exchangeProduct);
echo '<pre>';
print_r($getOrderBook);
echo '<pre>';

Используя вышеизложенное, я получаю только уровень 1, который в соответствии с GDAX, я получу «Только лучшая ставка и спрос», и результат будет примерно таким:

Array
(
[sequence] => 2402392394
[bids] => Array
(
[0] => Array
(
[0] => 3857.13
[1] => 0.14
[2] => 1
)

)

[asks] => Array
(
[0] => Array
(
[0] => 3859.99
[1] => 0.0475099
[2] => 2
)

)

В документации говорится, что «по умолчанию возвращаются только внутренняя (т.е. лучшая) заявка и предложение. Это эквивалентно глубине книги в 1 уровень. Если вы хотите просмотреть книгу заказов большего размера, укажите параметр запроса уровня».

В документации также говорится, что уровень 2 получает «Лучшие 50 заявок и запросов (агрегировано)», а уровень 3 получает «Полный портфель заказов (не агрегировано)».

Класс на Github содержит следующий код, который относится к моему запросу:

  public function getOrderBook($product = 'BTC-USD') {
//$this->validate('product', $product);
return $this->request('book', array('id' => $product));
}

и для «книги»:

public $endpoints = array(
'book' => array('method' => 'GET', 'uri' => '/products/%s/book'),
);

Теперь я хотел бы вызвать мою функцию $getOrderBook = $exchange->getOrderBook($exchangeProduct) для уровня 2 или 3.

Как я могу сделать это без изменения кода, импортированного из Github, пожалуйста?

Используя URL, вывод должен быть следующим:

https://api.gdax.com/products/BTC-EUR/book?level=2

Благодарю.

1

Решение

Боюсь, единственный способ сделать это расширить класс и переопределить соответствующие методы.

В настоящее время URI, указанный в $endpoints свойство заполняется getEndpoint метод. Это заполняет %s Вы упомянули в заголовке вашего вопроса. Вы можете расширить этот класс и переопределить этот метод:

protected function getEndpoint($key, $params) {
// Check if the level has been specified and pull it from the $params
$level = null;
if (isset($params['level'])) {
$level = $params['level'];
unset($params['level']);
}
// Run the existing endpoint parse
$endpoint = parent::getEndpoint($key, $params);
// Add on the level
if ($level !== null) {
$endpoint['uri'] .= '?level='.$level;
}

return $endpoint
}

Тогда вам также придется переопределить orderBook метод:

public function getOrderBook($product = 'BTC-USD', $level = null) {
return $this->request('book', array('id' => $product, 'level' => $level));
}

В качестве альтернативы вы можете отправить запрос на извлечение в библиотеку Github, настраивая код для поддержки level,

0

Другие решения

Вы можете переопределить конечную точку, так как она объявлена public:

$exchange = new CoinbaseExchange;
// ...
$exchange->endpoints['book']['uri'] = '/products/%s/book?level=2';
$getOrderBook = $exchange->getOrderBook($exchangeProduct);

Хотя было бы лучше создать PR, расширяющий API, как это предлагается в Ответ Скопи.

0