Co je to vlastně to API?
Jednoduše řečeno jedná se o způsob jakým vykonávat (v případě Coinbase) operace nad portfoliem vzdáleně z prostředí své aplikace, případně svého scriptu.
Co konkrétně můžu dělat?
Vše co se dá dělat je zdokumentováno, ale abych vás čtenáře takto neodbyl, tak příkladem jsou metody (funkce) pro získání přehledů produktů, za kolik se aktuálně obchodují, data k vykreslení candle grafů, správa objednávek a mnoho dalších.
Co konkrétně používám?
Na API jsem se napojil, abych si v budoucnu mohl vytvořit (naprogramovat) svoji investiční strategii a tu automatizovat. Protože, jak jsem dříve psal, je třeba sledovat výkyvy ceny, ty analyzovat a na základě toho nakupovat a prodávat. A když to nějak svedu já, tak v případě dostatku dat a možnosti algoritmizace, může počítač vyhodnocovat situaci například co pět sekund včetně noci a ne jako já jen několikrát denně. Ale aktuálně je to velké sousto, protože jsem se nad tím zamyslel a uvědomil si s čím vším podvědomě pracuji a jak na to nahlížím. A to co se dá nazvat intuicí by bylo potřeba nahradit velkým množstvím matematiky, kterou bych si musel osvěžit, případně nastudovat (o tom snad jindy :-))…
Takže jsem si aktuálně zvolil menší konkrétní cíl, který mi ale usnadní usnadnit jeden konkrétní případ užití (anglicky „Use case“, takže budu používat jen zkratku UC)…
Můj případ užití
Pokud vidíte v grafu několik opakujících se vlnek, které mají maximum někde kolem 1,3 EUR (pro kryptoměnu Ox (ZRX)) a minimum klesá někde k hodnotě 1,2 EUR, tak je fajn si nastavit nákup v režimu LIMIT a nemuset to stále sledovat. Můj návyk je, že si určuji, jaký chci mít náklad na jeden obchod, abych diverzifikoval riziko a následně si určím jaký chci mít výnos při prodeji. Takže například chci nakoupit přesně za 500 EUR a následně nastavit prodej na 510 EUR, zde již po odečtení FEE, takže čistý výnos 10 EUR. O tom jsem více psal v dříve publikovaném článku. Problém je ten, že v režimu LIMIT se takto naplánovat transakce nedá. Jako vstupní pole jsou „jednotková cena za kryptoměnu“ a „počet jednotek, které chci koupit“. No a nyní se dostávám k té pointě, že si tento jednoduchý formulář mohu přetvořit k obrazu svému a na pozadí si dopočítat počet kupovaných jednotek tak, abych se dostal na těch kýžených 500 EUR.
Objednávkový formulář v režimu LIMIT – zadána cena 1,2 EUR/ks a počet 400 ks, ale cena je 481,68 EUR. A takto bych musel iterovat nebo na kalkulačce počítat tak dlouho, dokud bych se nedostal na 500 EUR.
Můj formulář je ale přesně takový, jaký vyhovuje mému UC.
Vlastní formulář, kde zadám přesně co chci a na pozadí se mi provede výpočet a založí daná objednávka.
Co je na pozadí?
Základem je jednoduchá třída pro komunikaci s Coinbase API:
<?php
class CoinbaseExchange {
protected $key;
protected $secret;
protected $passphrase;
protected $endpoint = 'https://api.pro.coinbase.com';
protected $timestamp;
public function __construct($key, $secret, $passphrase) {
$this->key = $key;
$this->secret = $secret;
$this->passphrase = $passphrase;
$this->timestamp = time();
}
private function signature($request='', $body='', $method='GET') {
$body = is_array($body) ? json_encode($body) : $body;
$what = $this->timestamp.$method.$request.$body;
return base64_encode(hash_hmac("sha256", $what, base64_decode($this->secret), true));
}
public function sendRequest($request, $body='', $method='GET', $auth=false) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->endpoint.$request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (strcasecmp($method, 'POST') === 0) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
}
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if ($auth) {
$headers = array();
$headers[] = "Content-Type: application/json";
$headers[] = "CB-ACCESS-KEY: " . $this->key;
$headers[] = "CB-ACCESS-SIGN: " . $this->signature($request, $body, $method);
$headers[] = "CB-ACCESS-TIMESTAMP: " . $this->timestamp;
$headers[] = "CB-ACCESS-PASSPHRASE: " . $this->passphrase;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$output = curl_exec($ch);
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {
return $output;
}
curl_close($ch);
return $output;
}
}
?> |
<?php
class CoinbaseExchange {
protected $key;
protected $secret;
protected $passphrase;
protected $endpoint = 'https://api.pro.coinbase.com';
protected $timestamp;
public function __construct($key, $secret, $passphrase) {
$this->key = $key;
$this->secret = $secret;
$this->passphrase = $passphrase;
$this->timestamp = time();
}
private function signature($request='', $body='', $method='GET') {
$body = is_array($body) ? json_encode($body) : $body;
$what = $this->timestamp.$method.$request.$body;
return base64_encode(hash_hmac("sha256", $what, base64_decode($this->secret), true));
}
public function sendRequest($request, $body='', $method='GET', $auth=false) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->endpoint.$request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (strcasecmp($method, 'POST') === 0) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
}
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if ($auth) {
$headers = array();
$headers[] = "Content-Type: application/json";
$headers[] = "CB-ACCESS-KEY: " . $this->key;
$headers[] = "CB-ACCESS-SIGN: " . $this->signature($request, $body, $method);
$headers[] = "CB-ACCESS-TIMESTAMP: " . $this->timestamp;
$headers[] = "CB-ACCESS-PASSPHRASE: " . $this->passphrase;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$output = curl_exec($ch);
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {
return $output;
}
curl_close($ch);
return $output;
}
}
?>
A pak implementace volání konkrétního requestu, dle dokumentace:
$cb = new CoinbaseExchange(KEY, SECRET, PASSPHRASE); // získáte při registraci
$totalPrice = (int)$_POST['totalPrice'];
$fee = 0.0035;
$price = (double)$_POST['price'];
$size = round(($totalPrice - ($totalPrice * $fee)) / $price, 2);
$request = '/orders';
$body = array(
"size" => "$size",
"price" => "$price",
"side" => "buy",
"product_id" => "ZRX-EUR"
);
$response = $cb->sendRequest($request, $body, 'POST', true);
echo $response; // json message, dá se dále zpracovat |
$cb = new CoinbaseExchange(KEY, SECRET, PASSPHRASE); // získáte při registraci
$totalPrice = (int)$_POST['totalPrice'];
$fee = 0.0035;
$price = (double)$_POST['price'];
$size = round(($totalPrice - ($totalPrice * $fee)) / $price, 2);
$request = '/orders';
$body = array(
"size" => "$size",
"price" => "$price",
"side" => "buy",
"product_id" => "ZRX-EUR"
);
$response = $cb->sendRequest($request, $body, 'POST', true);
echo $response; // json message, dá se dále zpracovat
Záměrně jsem kód hodně zjednodušil, aby z něho bylo patrné to podstatné. Například $fee, se dá také načítat aktuálně pomocí API, ale další řádky by zápis jen učinily nepřehledným.
Ta kouzelná formule, kterou „aplikace“ dělá za mě je tento řádek,
$size = round(($totalPrice - ($totalPrice * $fee)) / $price, 2); |
$size = round(($totalPrice - ($totalPrice * $fee)) / $price, 2);
kde vycházím z cílové investice např. 500 EUR ($totalPrice), odečtu fee a ze zbytku zjistím, kolik mohu koupit jednotek.
Doufám, že jsem vysvětlil význam API a nastínil základ pro implementaci pro službu COINBASE PRO.
Jako obvykle, kdyby byl jakýkoliv dotaz nebo připomínka, tak komentáře jsou vám k dispozici.