HowTo: bitcoin.de API

Ich mag die Idee eines dezentralen digitalen Zahlungssystems. Und bevor die Difficulty explodierte und die Stromkosten die Erträge auffrassen, habe ich auch selbst „geschürft“. (Einen KNC-Miner habe ich immer noch im Regal stehen – man weiss ja nie 😉 Ob nun der Bitcoin der Weissheit letzter Schluss ist weiss ich nicht, doch wenn man es so verfolgt, scheint zumindest die Blockchain eine Zukunft zu haben.

Nachdem das Mining nicht mehr profitabel war, habe ich mich auf den Handel bei bitcoin.de verlegt. Und dank der bitcoin.de API lässt sich dieser Handel mittlerweile auch automatisieren. Ich habe mir also ein kleines Tradingsystem gebaut, das den Handel automatisch für mich abwickelt. Natürlich kann ich mit den Finanzprofis nicht mithalten und ich werde auch nicht reich damit, aber meine Strategie funktioniert (für mich) und so ein Handelssystem macht einfach Spaß.

Wenn man sich in den Foren so umsieht, scheint es doch einige Verständnisschwierigkeiten zu geben, wie man so eine (REST-)API nutzt. Nachfolgend möchte ich daher kurz zeigen, wie man sie verwendet und stelle vier einfache Kommandozeilen-Tools zur Verfügung, die als Basis für Ihr eigenes System dienen können. Und selbst wenn man sich kein eigenes Tradingsystem bauen will, kann man so wenigstens das Kickback einstreichen 😉

Was man braucht…

Die bitcoin.de-API ist klar strukturiert und einfach aufgebaut. Sie stellt alle Funktionen bereit, die man für den automatisierten Handel benötigt. Alle Parameter und Rückgabewerte sind in der Dokumentation ausführlich erklärt. Auf das Wie und Warum von REST-APIs möchte ich hier nicht weiter eingehen. Wer es genau wissen will, liest sich z.B. den entsprechenden Wikipedia-Artikel durch. Um die API nutzen zu können, benötigt man zuerst einmal einen Key und ein Secret, mit denen man sich gegenüber der API authentifiziert. Sie generieren die Key/Secret-Paare in den Einstellungen unter Sonstige Einstellungen -> Trading-API. Ohne ein solches Key/Secret-Paar ist die Nutzung der API nicht möglich.

bitcoin.de stellt eine beispielhafte Implementierung der API in PHP zur Verfügung, die ich nachfolgend auch nutze. Wir Unix-Menschen neigen dazu, komplexere Systeme aus einfachen (Kommandozeilen-)Tools zusammenzubauen. PHP ist daher für mich so gut wie jede andere Sprache auch. Auf ihrem Rechner muss also zusätzlich ein PHP-Interpreter installiert sein. Unter Linux sollte er zu den Bordmitteln gehören, seit Version 10.0.0 auch unter OS X. Für ältere OS X-Versionen und unter Windows empfehle ich die Installation von XAMPP. Zusätzlich müssen Sie noch die PHP-Implementierung TradingApiSdkv1.php bei bitcoin.de herunterladen.

Die Tools…

Ich habe vier einfache Tools geschrieben, die ihnen die direkte Nutzung der bitcoin.de API erlauben:

  • addbuyoffer.php – Stellt eine Kaufanfrage ein
  • addselloffer.php – Stellt eine Verkaufsanfrage ein
  • getoffer.php – Kauft/Verkauft ein konkretes Angebot
  • canceloffer.php – löscht eine Kauf-/Verkaufsanfrage
So funktioniert’s…

Wie man die PHP-API konkret einsetzt, möchte ich beispielhaft anhand von addbuyoffer.php zeigen, das wie folgt aufgerufen wird:

$ php addbuyoffer.php <preis> <menge> <minmenge>

Im ersten Schritt müssen wir die API-Implementierung einbinden:

<?php
require_once __DIR__ . '/TradingApiSdkv1.php';

und mit dem Key/Secret-Paar ein API-Objekt erzeugen:

$btc_api = new TradingApiSdk (<key>, <secret>);

Bei einem Kaufangebot übergeben wir den Preis, die Menge sowie die minimale Menge, die wir zu kaufen wünschen. Diese übernehmen wir aus der Kommandozeile in entsprechende Variablen

$preis = $argv [1];
$menge = $argv [2];
$minmenge = $argv [3];

Bitte beachten Sie, dass ich die einzelnen Elemente nicht weiter prüfe.  Bitte beachten Sie auch, dass die API bei den übergebenen Werten etwas empfindlich ist, d.h. Sie müssen mit Dezimalpunkten arbeiten und bei kleinen Werten eine 0 vor den Dezimalpunkt stellen. Natürlich kann man das abfangen und entsprechend aufbereiten, aber das überlasse ich dem geneigten Leser als Übung. Bevor wir die Kaufanfrage einstellen, sollten wir noch mal in uns gehen, ob auch wirklich alles stimmt:

print "$menge/$minmenge Bitcoins für $preis € kaufen";
$c = readline ( "? " );
if ($c != 'ja') {
   print "Abbruch\n";
   exit ( -1 );
}

Beantworten Sie diese Rückfrage mit etwas anderem als ‚ja‘, wird das Programm abgebrochen.

Nun folgt das eigentliche Herzstück des Programms:

try {
   $buy_order = $btc_api->doRequest ( TradingApiSdk::METHOD_CREATE_ORDER, array (
     'type' => TradingApiSdk::ORDER_TYPE_BUY,
     'max_amount' => $menge,
     'price' => $preis,
     'min_amount' => $minmenge,
     'new_order_for_remaining_amount' => 1
   ) );

} catch ( Exception $e ) {
   print "Exception: " . $e->getMessage ();
   exit(-2);
 }

if ($buy_order ['status_code'] != 201) {
   print $buy_order ['errors'] [0] ['message'];
   exit(-3);
 }

else {
   print "Kaufanfrage ".$buy_order['order_id']." erfolgreich eingestellt\n";
}

exit(0);

Das Einstellen unseres Kaufangebotes erfolgt durch einen Aufruf von doRequest. Dabei müssen wir die gewünschte Methode (in diesem Fall METHOD_CREATE_ORDER) sowie ein Array mit den benötigten Parametern wie z.B. Order-Typ (ORDER_TYPE_BUY), Preis, Menge etc. angeben. Welche Parameter für die jeweiligen Aufrufe benötigt werden, können Sie in der API-Dokumentation nachlesen.

Eigentlich war es das schon, aber wir müssen natürlich überprüfen, ob unser Request erfolgreich war. Beim Aufruf des Programms kann es zu zwei Arten von Fehlern kommen. Zum einen kann es Probleme mit der Internetverbindung geben, d.h. wir können unseren Request nicht erfolgreich an bitcoin.de senden.  Mögliche Fehlerursachen sind eine fehlende Internetverbindung, DNS-Probleme und ähnliche Dinge. Diese Art von Fehlern fängt der obige try/catch-Block ab. Kommt es zu einer solchen Exception (Ausnahme), wird die entsprechende  Fehlermeldung des Systems ausgegeben und das Programm beendet.

Bei der zweiten Art von Fehler war der Request selbst zwar erfolgreich, konnte von bitcoin.de aber nicht erfüllt werden, z.B. weil ein Angebot nicht mehr zur Verfügung steht, oder weil Sie fehlerhafte Parameter übergeben haben. Diese Art von Fehler können (müssen) wir aus der Response (Antwort) auf unseren Request herausfiltern. Die REST-API liefert ein Array im JSON-Format zurück, das alle relevanten Informationen enthält. Die PHP-API liefert uns diese Informationen in Form eines PHP-Arrays zurück. Innerhalb dieses Arrays liefert uns das Feld status_code den Status unserer Aktion. Bei unterschiedlichen Operationen zeigen unterschiedliche Statuscodes den Erfolg an. In unserem Fall steht der Code 201 für eine erfolgreiche eingestellte Kaufanfrage. Wie immer können Sie die exakten Codes für die jeweiligen Operationen in der API-Dokumentation nachlesen. Wird beim Einstellen eines Kaufangebots also ein Status ungleich 201 zurückgegeben, ist ein Fehler aufgetreten, den wir ausgeben, bevor  wir das Programm beenden. Wenn Sie sich lieber die gesamte Response ansehen wollen, ersetzen Sie die print-Anweisung durch

print_r($buy_order);

War unser Aufruf hingegen erfolgreich, gibt uns das Programm die Trading-ID zurück. Und das war es auch schon.

Falls Sie die Tools nutzen wollen, schreiben Sie mir doch eine E-Mail und ich schicke sie ihnen zu. Alternativ können Sie den Code einfache aus dem Beitrag kopieren. Er ist direkt lauffähig. Wie immer erfolgt die Nutzung aber auf eigene Gefahr und unter Ausschluss jeglicher Garantie. Fragen beantworte ich innerhalb gewisser Grenzen.

Ich habe auch überlegt, ob ich die API in Python umschreibe, aktueller Bedarf besteht da bei mir aber nicht. Falls sich ein Sponsor findet, würde ich mich aber darum kümmern.

Falls dieser Beitrag hilfreich war, freue ich mich über eine Spende an
1YsWuiE58G8dVybEkWaBBFaRQgAULupEk.

Happy Trading….