Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 7)


Empfohlene Beiträge

Hallo zusammen, 

nach der sechsten und vorletzten Lektion (https://coinforum.de/topic/16076-workshop-wir-basteln-uns-einen-tradingbot-lektion-6/) geht es heute weiter mit der letzten und nicht minder interessanten Lektion 7:

Lektion 7: Hallo Cronjob

1. Cronjob einrichten (Automatisierung)
2. Setup eines eigenen Raspberry Pi
3. Weiterführende Informationen

1. Cronjob einrichten (Automatisierung)

Es gibt höchst unterschiedliche Möglichkeiten einen Tradingbot zu automatisieren. Ich werde hier auf die zeitgesteuerte Variante eingehen, die in definierten Zeitintervallen eine Webseite (unser PHP-Skript) aufruft und sich danach wieder schlafen legt. Das ist die einfachste Variante, da sie lediglich den manuellen zyklischen Aufruf der Webseite automatisiert.

Je nach persönlicher Situation gibt es unterschiedliche Möglichkeiten dies zu realisieren, daher solltet Ihr nun schauen was auf Euch zutrifft:

1.a) Cronjob auf Windows (für XAMPP-Nutzer)
1.b) Cronjob auf Webserver (für Webspace ohne Crondienst)
1.c) Cronjob auf VPS / Raspberry Pi (für Linuxinstallationen)

1.a) Cronjob auf Windows (für XAMPP-Nutzer)

Windows stellt dafür das Programm „Aufgabenplanung“ zur Verfügung. Einfach im Suchfeld nach „Aufgabenplanung“ suchen und das Programm starten.

„Aktion“ -> „Einfache Aufgabe erstellen...“
... Name eingeben (z.B. BalanceBot)
... Trigger kann „täglich“ sein (es wird sich kaum lohnen den Computer Tag und Nacht laufen zu lassen)
... Aktion „Programm starten“
... Programm suchen (z.B. „C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
… und dann Argumente hinzufügen (z.B. „http://localhost/BalanceBot/index.php“)
=> fertig.

Soll das doch stündlich laufen, dann kann nach dem Anlegen der Aufgabe der Trigger auch so eingestellt werden, dass die Aufgabe stündlich wiederholt wird.

1.b) Cronjob auf Webserver (für Webspace ohne Crondienst)

https://cron-job.org/de/ ist in der Lage Cronjobs mit einer Ausführungsdauer von bis zu 30 Sekunden gratis zu hosten. Die Ausgabe der aufgerufenen Webseite darf jedoch nicht größer als 1 kB sein. Daher sollten alle Ausgaben (echo / print_r) des BalanceBots auskommentiert (mit „//“ oder „/*  ... */“) werden.

Auf der Webseite registrieren, dann bei "Cron-Jobs" auf "Cron-Job erstellen" klicken. Internet-Adresse eingeben und stündliche Ausführung wählen (das reicht völlig aus).

1.c) Cronjob auf VPS / Raspberry Pi (für Linuxinstallationen)

Cronjobs werden auf den meisten Linuxsystemen in der Datei „/etc/crontab“ eingetragen, das macht man mit dem folgenden Befehl (das $-Zeichen wird nicht eingegeben). Mit „sudo“ greift man auf Dateien mit root-Rechten zu (sudo = „super-user do“). „nano“ ist ein Texteditor auf Kommandozeilenebene, der auf vielen Linux-Systemen vorhanden ist.

$ sudo nano /etc/crontab    

Dort wird diese Zeile eingetragen:

0 * * * * root wget -O /dev/null -o /dev/null http://localhost/BalanceBot/index.php

„0 * * * *“ steuert wann der Job ausgeführt wird, siehe auch https://crontab-generator.org/ oder Google „crontab“.
„wget“ ist der Kommandozeilenbrowser, der die Datei downloaden wird.
„-O /dev/null“ schickt die downgeloadete Datei direkt ins Nirvana
„-o /dev/null“ schickt auch Statusmeldungen ins Nirvana

Gespeichert wird mit „Strg+X“, bestätigen mit „Y“ (oder „J“ ... einfach mal unten gucken) und „enter“.

Und das war’s auch schon – fortan wird stündlich der Job ausgeführt.

2. Setup eines eigenen Raspberry Pi

Für Laien mag ein Raspberry Pi als „Hexenwerk“ erscheinen, welches nur IT-Nerds vorbehalten ist, denn einen eigenen Server zu Hause zu haben klingt erstmal „weit weg“ für z.B. Familienväter.

Ich hingegen habe nun das Teilchen kennen gelernt und oh, staune und wunder ... das ist ja alles total easy und simpel gemacht.

Daher meine klare Empfehlung: Investiert mal diese „unter 100 Euro“ und geht das Projekt an einem Abend an während die Familie vorm Fernseher sitzt und Ihr mit dem Notebook mit auf der Couch hockt. (oder mal ein Bundesliga-Spiel nicht schauen :D)

In diesem Ablauf arbeiten wir uns nun da durch:

2.1. Hardware besorgen
2.2. Software besorgen
2.3. Hardware und Software miteinander verbinden
2.4. Webserver installieren
2.5. PHP installieren
2.6. MySQL installieren
2.7. BalanceBot einrichten
2.8. Cronjob einrichten
2.9. Zugriff per VNC (Desktop des Pi)

Los geht’s:

2.1. Hardware besorgen

Benötigt wird folgende Hardware:

1x Raspberrry Pi (ich rate zum aktuellen 3B+)
1x Netzteil (Micro-USB-Ladekabel)
1x 32GB-Micro-SD-Karte (eine zweite Karte braucht es entgegen der Info in der Lektion 6 nicht)
1x passende Adapter um an Eurem Computer die Micro-SD-Karten zu beschreiben.
1x Gehäuse
1x Kühlerset

Das gibt es als Bundle bei diversen Internetanbietern für 80 Euro.
(Tastatur, Maus und Bildschirm mit HDMI-Kabel braucht es in dieser Anleitung NICHT!)

2.2. Software besorgen

Google "Raspbian Stretch Diskimage" laden (knapp 2 GB!)
=> https://www.raspberrypi.org/downloads/raspbian/
(Raspbian Stretch with desktop and recommended software)

Etcher runterladen (damit wird das Image auf die SD-Karte geschrieben)
=> https://www.balena.io/etcher/

Putty runterladen (nur für Windows nötig, der Mac kann das auch so)
=> https://www.putty.org/

WinSCP laden um Dateien auf den RaspberryPi über das Netzwerk zu übertragen:
=> https://winscp.net/eng/download.php
(Als MacUser benutze ich CyberDuck: https://cyberduck.io/)

2.3. Hardware und Software miteinander verbinden

Das Programm "Etcher" ist recht einfach gehalten: Das geladene Image auswählen, die SD-Karte auswählen und los geht’s!

Danach die Karte nochmal in den Computer stecken und auf das Laufwerk namens „boot“ eine Datei namens „ssh“ legen – der Inhalt ist vollkommen egal. Damit erreichen wir, dass der RaspberryPi direkt nach dem ersten Start einen SSH-Zugang zur Verfügung stellt.

Datei "ssh" anlegen.

Den Raspi ins Gehäuse stecken, die beiden Kühlkörper draufkleben und SD-Karte rein. Netzwerkkabel dran und Stromanschluss dran – das war’s schon, den könnt Ihr nun zu Eurem Internetrouter legen, da müsst Ihr nicht mehr dran.

Mit Putty verbindet Ihr Euch mit Eurem Raspi (der ist binnen weniger Sekunden gebootet).
User: pi
Server: raspberrypi
Passwort: raspberry

Auf dem Mac: Terminal öffnen und "ssh pi@raspberrypi" eingeben.

Nun solltet Ihr schon das erste Erfolgserlebnis haben und seht die Kommandozeile Eures Raspberry! Befehle könnt Ihr einfach per Copy&Paste übernehmen. Aber Achtung! Die Forensoftware setzte bei mir unsichtbare Zeichen in den Text, könnte durch Formatierungen kommen. Wenn etwas nicht tut wie es soll, nicht verzweifeln - Befehle händisch eintippen (beim crontab-Eintrag sieht man das nicht sofort) ... hier im Thread fragen oder an balancebot@gmx.de schreiben.

Nun müssen wir noch die Lokalisierung vornehmen und das Passwort ändern:

$ sudo raspi-config

(mit Tab und Pfeiltasten durchnavigieren)

=> Option 1: Passwort ändern
=> Option 4: dort die passenden Einstellungen vornehmen. (de_DE ISO-8859-1, de_DE)
=> Option 7: Filesystem anpassen "Expand Filesystem"

Dann wird nochmal ein Upgrade und Update macht:

$ sudo apt-get -y upgrade   
$ sudo apt-get -y update   

2.4. Webserver installieren

Nun kommt der Webserver drauf

$ sudo apt-get install -y apache2   

Nun müssen wir noch Apache konfigurieren:

$ sudo nano /etc/apache2/apache2.conf   

Diesen Abschnitt anpassen:

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

Und ganz unten einfügen:

ServerName raspberrypi

(nano mit ctrl+X beenden, dann mit "Y" oder "J" das Überschreiben bestätigen und "enter")

Apache neu starten mit

$ sudo systemctl restart apache2    

Auf dem eigenen PC kann nun im Browser „http://raspberrypi“ aufgerufen werden und der Apache meldet sich direkt.

2.5. PHP installieren

Nun kommt der nächste Schritt – wir installieren PHP (PHP-Modul, und die MySQL-Anbindung:

$ sudo apt-get install -y php  libapache2-mod-php php-mysql     

Das Web-Verzeichnis machen wir für alle schreibberechtigt anstatt nun Extra-User anzulegen (das macht man auf Produktivsystemen nicht!):

$ sudo chmod 777 -R /var/www/html/    

Nun legen wir eine erste PHP-Datei an:

$ echo '<?php phpinfo(); ?>' | tee /var/www/html/info.php  

Und wir müssen die PHP-Config-Datei anpassen (nicht die auskommentierten Zeilen mit ; beginnend ändern, das bringt nix):

$ sudo nano /etc/php/7.0/apache2/php.ini

=> error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
=> display_errors = On

Apache neu starten:

$ sudo systemctl restart apache2   

Im Browser nun "http://raspberrypi/info.php" aufrufen und es sollte sich die PHP-Konfiguration zeigen. Das nächste Erfolgserlebnis ist da – und so lange hat das bestimmt auch nicht gedauert?

2.6. MySQL installieren

Nun widmen wir uns dem MySQL-Server. Normalerweise installiert man keine Datenbank auf einer SD-Karte, da SD-Karten sonst zu schnell kaputt gehen. Der Einfachheit halber machen wir es dennoch. Das Schreib-Lese-Aufkommen ist enorm gering, es wird nur stündlich mal was geschrieben, das ist nicht wild.

MySQL-Server (genaugenommen wird damit MariaDB installiert, aber das ist egal) installieren:

$ sudo apt-get install -y mysql-server   

Damit haben wir die Datenbank nun schonmal installiert. Bevor wir sie einrichten installieren wir phpmyadmin:

$ sudo apt-get -y install phpmyadmin php-mbstring php-gettext   


=> "Apache2" mit Leertaste auswählen + enter
=> Passwort aufschreiben!

$ sudo phpenmod mbstring    
$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf   
$ sudo a2enconf phpmyadmin.conf    
$ sudo systemctl restart apache2   

Nun im Browser aufrufen:

http://raspberrypi/phpmyadmin

Einloggen mit User "phpmyadmin" und dem vergebenen Passwort um das nächste Erfolgserlebnis zu erhalten!

2.7. BalanceBot einrichten

Nun haben wir alles am Laufen, was wir für die Minimallösung brauchen und wir richten uns den BalanceBot auf dem Raspberry Pi ein:

Mit WinSCP verbinden wir uns auf dem Pi (Verbindungsdaten wie für ssh + Port 22).
Eventuell muss der Zugriff über die IP-Adresse erfolgen. Mit

$ ifconfig   

lässt sich die IP-Adresse des RaspberryPi ermitteln.

Die Daten kommen in das Verzeichnis /var/www/html .. am besten dort ein Unterverzeichnis „BalanceBot“ anlegen um Ordnung zu halten, eventuell kommen noch weitere Projekte hinzu. (Das Verzeichnis dann ebenfall „777“ berechtigen – das geht mit WinCSP.

Über SSH legen wir nun einen neuen User und eine Datenbank an:

$ sudo mysql   

> CREATE USER 'balancebot'@'localhost' IDENTIFIED BY 'BalanceBotPasswort';

> GRANT USAGE ON *.* TO 'balancebot'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

> CREATE DATABASE IF NOT EXISTS `balancebot`;

> GRANT ALL PRIVILEGES ON `balancebot`.* TO 'balancebot'@'localhost';

> FLUSH PRIVILEGES;

> exit

Und schwupp, können wir uns in phpmyadmin mit dem User “balancebot” und dem Passwort “BalanceBotPasswort” anmelden.

Nun müsst Ihr noch die Datenbankstruktur in phpmyadmin in der Datenbank „balancebot“ anlegen.

Das war in Lektion 2

CREATE TABLE `tblMessages` (
  `id` int(11) NOT NULL,
  `date_created` datetime NOT NULL,
  `message` text NOT NULL
);

ALTER TABLE `tblMessages` ADD PRIMARY KEY (`id`);

ALTER TABLE `tblMessages` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Und das in Lektion 6:

CREATE TABLE `tblBalances` (
  `id` int(11) NOT NULL,
  `coin_name` varchar(10) NOT NULL,
  `pair_name` varchar(10) NOT NULL,
  `date_created` datetime NOT NULL,
  `current_balance` double NOT NULL,
  `current_price` double NOT NULL,
  `target_percentage` double NOT NULL,
  `virtual_percentage` double NOT NULL,
  `virtual_balance` double NOT NULL
);

ALTER TABLE `tblBalances` ADD PRIMARY KEY (`id`);

ALTER TABLE `tblBalances` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Nun testet Ihr über den Browser den BalanceBot: http://raspberrypi/BalanceBot/index.php ... das nächste Erfolgserlebnis ist da, wenn keine Fehlermeldungen auftreten und in der .../BalanceBot/show_messages.php korrekte Logdaten stehen.

2.8. Cronjob einrichten

Und nun wird noch der Cronjob eingerichtet – dazu einfach „siehe oben“ bei dem Linux-Part, los geht es mit

$ sudo nano /etc/crontab   

Das hier dort eintragen:

0 * * * * root wget -O /dev/null -o /dev/null http://localhost/BalanceBot/index.php Hinweis: Tippt den Befehl besser händisch ab um undichtbare Formatierungszeichen drin zu haben.

Das war's ... der BalanceBot arbeitet nun jede Stunde seine Punkte ab.

2.9 Zugriff per VNC (Desktop des Pi)

Ja, der Pi hat als noch so kleine Kiste nicht nur Server-Qualitäten sondern der kann auch einen Desktop zur Verfügung stellen. Und das auch ohne Bildschirm, Maus und Tastatur!

Dazu wieder in die Config gehen:

$ sudo raspi-config   

=> Option 7: „Resolution“ auf eine brauchbare Größe setzen, 1024er oder so
=> Option 5: „VNC“ aktivieren

Für den eigenen PC den VNC-Viewer installieren und dann mit dem Raspberry verbinden. Er wird Euch dann nochmal durch den Installationsprozess führen, das könnt Ihr aber dann skippen.

Auch dort könnt Ihr Euch dann das Terminal aufrufen, das wäre dann durch’s Auge in die Brust geschossen weswegen wir das Setup komplett direkt über SSH durchgeführt haben.

Ich habe meinen Internetroute so konfiguriert, dass ich per VPN mit meinem iPhone von überall auf den Desktop des Pi zugreifen kann und im Zweifel Fehler beheben kann - wer eine Anleitung braucht für Fritzbox+iPhone, bitte im Thread hier melden.

3. Weiterführende Informationen

Mit dieser obigen Anleitung haben wir die Minimalversion eines Raspberry-Servers in Betrieb genommen wie es recht schnell auf der Couch vorm Fernseher geht aber wie er auf keinen Fall direkt dem Internet ausgesetzt werden sollte sondern immer nur in einem lokalen Netzwerk hinter einer Firewall stehen sollte.

Ein ganz heißer Tipp ist dieses Github-Repository:

https://github.com/Stadicus/guides/tree/master/raspibolt

Dort lest mal rein, Ihr werden vieles wiedererkennen, was hier in Kurzform schon drin ist was die Einrichtung des RaspberryPi angeht, nur „in sicher“.

Zusätzlich findet Ihr dort die Anleitung wie Ihr einen Bitcoin-Fullnode aufsetzt.

Dazu benötigt Ihr eine externe 3,5“-Festplatte mit eigenem Stromanschluss – auf die kommt dann auch die Datenbank und ein „Swapfile“ was dem Raspi zu deutlich besserer Arbeitsspeicherverwaltung verhilft.

Wer Interesse daran hat, kann sich gern mal daran versuchen - das ist mein nächstes Projekt ☺

... so, damit ist das Projekt „BalanceBot“ abgeschlossen.

Wenn Bugs auftauchen, dann liefere ich die gern nochmal nach. Es schadet also nicht ab und zu mal in die Lektionen hineinzuschauen – ich werde Admins bitten die aktualisierte Lektion direkt im ersten Beitrag zu kennzeichnen und auf den Bugfix-Beitrag in dem Thread zu verweisen.

 

Bearbeitet von Jokin
  • Love it 1
  • Thanks 12
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Wochen später...

Hi

hab, falls es von Interesse ist, ein kleines Tool ausprobiert welches ich euch nicht vorenthalten möchte.

Richtet sich an alle die den oder die Bot(s) auf einem Windowsrechner mit xamp nutzen..

Mich hat an der Automatisierung über Aufgabenplaner immer etwas gestört, dass ich nicht vernünftig mit dem Browser oder dem PC selber weiter arbeiten konnte wenn der Aufgabenplaner meinen Bot gestartet hat, weil das (in meinem Fall) Firefoxfenster in den Vordergrund gepopt kam.

Nun habe ich mir das Addon TAB AUTO REFRESH geladen und kann jetzt meine Bot's einmalig je in einen TAB laden und dann den jeweiligen TAB per Tool individuel neuladen lassen. Das funktioniert auch minimiert im Hintergrund prima.

Somit kann ich meine Bot's je nach meiner gewünschten Strategie immer wieder laden lassen und kann trotzdem am PC weiterarbeiten ohne Popup...

Bestimmt gibt es elegantere Lösungen wie z.B. vielleicht per PHP das script automatisch zu reloaden, aber dafür fehlen mir die Programmierkenntnisse...

Vielleicht ist das Tool ja was für jemanden...mir hats geholfen.

Lars

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb creader:

Richtet sich an alle die den oder die Bot(s) auf einem Windowsrechner mit xamp nutzen..

Mich hat an der Automatisierung über Aufgabenplaner immer etwas gestört, dass ich nicht vernünftig mit dem Browser oder dem PC selber weiter arbeiten konnte wenn der Aufgabenplaner meinen Bot gestartet hat, weil das (in meinem Fall) Firefoxfenster in den Vordergrund gepopt kam.

Nun habe ich mir das Addon TAB AUTO REFRESH geladen und kann jetzt meine Bot's einmalig je in einen TAB laden und dann den jeweiligen TAB per Tool individuel neuladen lassen. Das funktioniert auch minimiert im Hintergrund prima.

Jedenfalls unter Windows 7 muss man den URL nicht zwingend von einem Browser aufrufen lassen. CURL.exe tut's auch via Aufgabenplaner. CURL muss man halt vorher installieren.

Mit folgenden Einstellungen poppt auch nichts auf, und die Abfrage läuft regelmäßig im Hintergrund:

Allgemein:

  • Häkchen setzen bei Ausgeblendet

Trigger:

  • Einmal
  • Wiederholen jede {Zeitangabe} für die Dauer von: Sofort

Der Aufgabenplaner registriert dann brav: "Nach Auslösung alle {Zeitangabe} unbegrenzt wiederholen."

  • Thanks 1
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 Monate später...
  • 3 Monate später...
  • 4 Wochen später...
Am 14.11.2019 um 13:10 schrieb Zeusalim:

Gibt es irgendwo Reviews drüber, wie erfolgreich/ nicht erfolgreich der Bot über das Jahr lief?

Ja, in dem Thread mit der Interessensabfrage hatte ich das mal näher betrachtet:

Das Problem bei der Auswertung besteht darin, dass das nicht einfach zu ermitteln ist.

Wenn man für 1.000 Euro 10 Coins à 100 Euro kauft und nach einer Weile das Portfolio 1.100 Euro wert ist, dann kann das mehrere Ursachen haben:

a) Es sind 11 Coins à 100 Euro -> Der Bot war ein voller Erfolg
b) Es sind 10 Coins à 110 Euro -> Der Bot hat rein gar nix gemacht, der Gewinn kommt aus Kursgewinnen
c) Es sind 9 Coins à 122 Euro -> Der Bot hat voll versagt, der Kursgewinn kaschiert das Botversagen

Ebenso kann das Portfolio am Ende einen Wert von nur noch 900 Euro haben und nun hängt es davon ab ob es mehr Coins oder weniger Coins als vorher sind.

Das kann man bei nur einem Coin einfach ermitteln. Bei mehreren Coins, die zeitgleich bearbeitet werden, reduziert sich bei einem Coin der Bestand und bei dem anderen geht der Bestand rauf. Ich habe noch keine zuverlässige Möglichkeit gefunden den Bot nun hinsichtlich des Erfolges auszuwerten.

Aktuell lasse ich meine Bots einfach weiter laufen wie gehabt ... da sind um die 40.000 Euro drin oder so ... keine Ahnung, ich lasse die laufen und schaue nur hin und wieder mal ob's noch läuft. 

Vielleicht mache ich mir demnächst nochmal Gedanken dazu, denn seit Anfang des Jahres steigt die Bitcoin-Dominanz ... das bedeutet im Umkehrschluss, dass die Kurse massiv gefallen sind - und genau das sehe ich auch bei meinem Bot. Der Portfoliowert sinkt - gleichzeitig erhöht sich jedoch auch die Anzahl der Coins.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Adriana Monk:

Na ja, da wundert mich jetzt etwas. Das sollte doch einfach zu machen sein. Erst die Trades auswerten, die gemacht worden sind. Das kann man ja einfach in P&L auswerten, von mir aus auch in Bitcoin je nach Tageskurs, als die ausgeführt wurden. Für den offenen Bestand kannst Du doch einfach einen offenen P&L beziffern, das macht jedes normale Tradingprogramm als Beiwerk.

 

Ja, exakt das mache ich ja auch - aber nur je Währung. Da kommt nicht immer ein Profit bei raus, denn es wird ja auch ausbalanciert. Ich müsste mir eine Auswertung über alles schreiben.

Auch hier: Ich stelle gern meine Daten zur Verfügung - wer es auswerten kann: Bitte, gern.

(das wäre dann die Tradehistory von Binance)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb Adriana Monk:

Die Tradehistory bei Binance kannst Du bei Cointracker reinladen und er macht da was lesbares draus. Hat da jemand einen Account ? Wäre mal ein Versuch.

AM

Diese Auswertung würde auch keine Auskunft über die Effizienz des Bots geben, da nur die Trades für sich ausgewertet werden. Am Ende steht da auch nur, dassd er Portfoliowert über die Zeit gesunken ist - weil halt auch die Kurse gesunken sind.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab gerade mal die Auswertung erneuert:

 

vor 7 Minuten schrieb Adriana Monk:

Dann definiert mal Effizienz. Bei mir in P&L oder Sharp Ratio oder in wieweit die Coins gestiegen sind. Du kannst das ja auf den jeweiligen Basiscoin runterbrechen, weil, es geht ja nur darum Coins zu sammeln.

AM

Ja, das kann man machen - aber der Aufwand ist immens, ich hatte da mit Excel schon mehrere Ansätze gestartet das sauber zu bewerten.

Ich selber kam zu einem positiven Ergebnis, aber was heißt das schon, wenn man es nicht plausibel mit einfacher Darstellung rüberbringen kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...
Am 16.1.2019 um 20:49 schrieb Jokin:

2.6. MySQL installieren

Nun widmen wir uns dem MySQL-Server. Normalerweise installiert man keine Datenbank auf einer SD-Karte, da SD-Karten sonst zu schnell kaputt gehen. Der Einfachheit halber machen wir es dennoch. Das Schreib-Lese-Aufkommen ist enorm gering, es wird nur stündlich mal was geschrieben, das ist nicht wild.

MySQL-Server (genaugenommen wird damit MariaDB installiert, aber das ist egal) installieren:


$ sudo apt-get install -y mysql-server   

Damit haben wir die Datenbank nun schonmal installiert. Bevor wir sie einrichten installieren wir phpmyadmin:


$ sudo apt-get -y install phpmyadmin php-mbstring php-gettext   


=> "Apache2" mit Leertaste auswählen + enter

Danke an @Natna für den Hinweis:

Derzeit ist auf dem Raspi "Buster" das aktuelle System und Mysql-Server wird nicht mehr über obigen Befehl installiert sondern über

$ sudo apt-get install mariadb-server

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...
vor 57 Minuten schrieb bjew:

@Jokin, was sagen deine Tradingbots derzeit? Oder sind sie derzeit gestoppt?

Ja, ich hab die alle noch am Laufen. Allerdings werte ich die nicht mehr so akribisch aus, denn die Auswertung bringt mir keine Aussagekraft.

Durch den heftigen Anstieg von ETH sieht mein 10-ETH-Bot hat der Bot an Portfolio-Wert verloren, da stehen nun nur noch 6,84 ETH.

Somit ganz klar: "HODL" wäre die bessere Strategie gewesen.

Ich müsste nun nochmal genauer auswerten wie die Entwicklung in den einzelnen Coins ist ob der jeweilige Coinbestand maßgeblich erhöht werden konnte.

Das ist aber ziemlicher händischer Aufwand, den ich nur ungern betreibe. Ich mache das mal in der nächsten Zeit 🙂

Ich hoffe mal, dass der Portfoliowert mit der nächsten "Altcoin-Season" wieder auf 10 ETH ansteigt, erst dann habe ich eine "Unbekannte" raus und ich kann direkt anhand der Coinbestände sehen was erfolgreich war und was nicht.

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb bjew:

wobei die Frage auf die aktuelle Situation gezielt, wo doch alle relvanten Coins starke Verluste aufweisen. Könnte mir vorstellen, dass die sich gegenseitig ausverkaufen ;)  - wenn ich es ganz richtig gelesen habe

Wenn alle Coins gleichzeitig an Wert verlieren, dann haben alle Coins wertmäßig den gleichen Anteil am Portfolio, dann passiert nix.

Fällt nur ein Coin, dann wird dieser gekauft und ein anderer, der etwas mehr gestiegen oder "weniger als alle anderen gefallen" ist, wird verkauft.

Das ist ja gerade das Grundprinzip des Ausbalancierens. Und weil halt ETH massiv gegenüber allen anderen Coins gestiegen ist, ist der Bot "augenscheinlich" im Minus.

Real jedoch ist der natürlich massiv im Plus - nur halt weniger im Plus als wenn eine reine ETH-Hodl-Strategie gefahren werden würde.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb bjew:

Irgendwo hast du mal geschrieben, dass du den Bot in bestimmten Situationen abstellst.

Nö, ich lass den durchlaufen - ich hab ja mehrere davon laufen, ein paar mit ETH und noch zwei mit ein paar BTC.

vor 22 Minuten schrieb bjew:

Das hatte ich schon grundsätzlich so verstanden, nur da die ganze Palette sich nach unten schaukelt, hatte ich Verdacht, dass sie sich wertmäßig überproportional ausverkaufen.

Nein, das passiert nicht.

So sieht der gerade aus:

1001338920_Bildschirmfoto2020-03-09um21_13_32.thumb.png.70260810c2667dc6a4ea8cba2c3b0aee.png

 

 

XLM startete vor 417 Tagen bei einem Kurs von 0,00087 ETH/XLM ... der Kurs derzeit ist bei 0,00025 ETH/XLM ... absolutes Disaster von der Coin-Performance her.
... mein durchschnittlicher EInkaufspreis liegt bei 0,00063 ETH/XLM -> also erfolgreich nach unten gearbeitet

ADA startete bei einem Kurs von 0,000363 ... derzeit bei 0,000205 ... auch eine miese Coinperformance
... mein durchschnittlicher EInkaufspreis liegt bei 0,000297  -> also auch erfolgreich nach unten gearbeitet

XRP startete bei 0,00268 ... derzeit bei 0,00103 ... wieder extrem miese Performance des Coins
... mein durchschnittlicher EInkaufspreis liegt bei 0,00225  -> also auch erfolgreich nach unten gearbeitet

IOTA startete bei 0,00251 ... derzeit bei 0,000924 ... auch ein extremer Wertverlust gegenüber ETH
... mein durchschnittlicher EInkaufspreis liegt bei 0,00196  -> also auch erfolgreich nach unten gearbeitet

BNB startete bei 0,0528 ... derzeit bei 0,0834 ... endlich mal ein Coin, dessen Performance besser ist als ETH
... mein durchschnittlicher EInkaufspreis liegt bei 0,0109 -> also auch erfolgreich nach unten gearbeitet

NEO startete bei 0,06195 ... derzeit bei 0,04849 ... nicht ganz so extrem mies, aber auch schlechte Performance gegenüber ETH
... mein durchschnittlicher EInkaufspreis liegt bei 0,0548 -> also auch erfolgreich nach unten gearbeitet

 

Leider fällt mir kein anderer Ansatz ein um die Performance meines Balancebots zu ermitteln außer dass ich ihn daran messe ob er die durchschnittlichen Einkaufspreise mit der Zeit immer weiter gesenkt bekommt.

 

Vom Aspekt der Einkommensteuer her ist das ganze Konzept völliger Bullshit - das muss man so ehrlich und deutlich auch schreiben. Denn durch die Wertsteigerung des ETH-Kurses ist das gesamte Portfolio mehr wert, also zahle ich auf die Wertsteigerung Einkommensteuer. Der Ertrag jedoch deckt diese Steuer nichtmal ansatzweise - zumal mit der HODL-Strategie gar keine Einkommensteuer fällig gewesen wäre.

Diese BalanceBots "leiste" ich mir dennoch, da das Risiko für mich überschaubar ist. Ich hoffe ja immernoch auf eine neue Altcoin-Season, da dürfte sich dann ein bisschen mehr tun und hoffentlich gegenüber der ETH-Hodl-Strategie ein ordentlicher Bonus abfallen.

Falls jemand noch mehr Daten zum Selbstauswerten braucht, hier mal die Trading-Historie von BNB:
https://pastebin.com/xDAAiyUE
... schön zu sehen wie der durchschnittliche Kaufkaurs auch mal negativ wird.
Zur Erklärung: 

"BUY 0.2 0.052796 0.0105592 / 0.2 = 0.052796 vor 416 Tagen"

meint

"BUY-Trade mit Volumen von  0.2 BNB @ 0.052796 BNBETH .... damit sind alle BNB im Portfolio 0.0105592 ETH wert / 0.2 BNB = 0.052796 BNBETH durchschn. Kaufkurs (Trade war vor 416 Tagen)"

 

... ich weiß, das ist nicht grafisch aufbereitet und für Laien auch nicht ganz so einfach zu durchblicken.

 

Fazit: Der BalanceBot funktioniert 🙂 ... schnell reich wird man damit aber nicht. Und wie zu sehen ist: HODLer sind in dieser Phase schneller reich geworden - aber wer kann das schon vorher wissen? 😉 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Minuten schrieb bjew:

Ich spiele ab und zu damit rum. Das mit dem bnb muss ich mir genauer ansehen. Das Script zu der Auswertung ist in aber nicht in deinem Musterbot enthalten?

 

Stimt, das hatte ich nachträglich gemacht und ich wollte das auch nochmal in "schön" machen.

Hier der derzeitige Code:

<?php
/***
*

CREATE TABLE `tblTrades` (
  `id` int(11) NOT NULL,
  `tradeId` int(11) NOT NULL,
  `orderId` int(11) NOT NULL,
  `symbol` varchar(10) NOT NULL,
  `price` double NOT NULL,
  `qty` double NOT NULL,
  `commission` double NOT NULL,
  `commissionAsset` varchar(10) NOT NULL,
  `time` int(11) NOT NULL,
  `isBuyer` int(11) NOT NULL,
  `isMaker` int(11) NOT NULL
) 

ALTER TABLE `tblTrades`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `tradeId` (`tradeId`);

* 
*/

require_once 'config.php'; // Config-Datei einbinden

$mysqli = new mysqli($__db_server, $__db_user, $__db_passwort, $__db);

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
    exit(); // Skript beenden, wenn keine DB-Verbindung zustande kommt.
}

function show_howlongago($binance_time){

	$time_delta = time() - $binance_time;
	
	if ($time_delta < 60*60) {
		return "vor < 1 Stunde";
	}

	if ($time_delta < 2*24*60*60) {
		return "vor ". round($time_delta/60/60) ." Stunden";
	}

	return "vor ". round($time_delta/24/60/60) ." Tagen";

}

$symbol = $_GET["symbol"];



 
// Binance-API anbinden
require_once ("php-binance-api.php"); // Binance-API Code laden
$binance_api_handler = new Binance\API($__binance_APIkey ,$__binance_APIsecret);
// prüfen ob die Binance-API tatsächlich angesprochen werden kann
if (!$binance_api_handler){
    echo "FEHLER: 'binance_api_handler' nicht vorhanden";
    exit;
}

$starttime = mktime(0,0,0,1,1,2019);

/* 
Größte TradeId auslesen, denn ich muss ja nur neuere Trades von Binance holen
*/
$fromId = 1;
$sql_query="SELECT max(tradeId) as tradeId FROM `tblTrades` where symbol = '$symbol'";
$result_tblTrades = $mysqli->query($sql_query);
$binance_trade = $result_tblTrades->fetch_array(MYSQLI_BOTH);
$fromId += $binance_trade["tradeId"]; // damit holt er nicht den bereits vorhandenen Trade und es ergibt auf jeden Fall eine Zahl > 0;


$array_binance_trades = $binance_api_handler->history($symbol, $starttime * 1000, 1000, $fromId);


 echo "<pre> So sieht nun unser Array <i>array_binance_trades</i> aus: <br>";
 print_r($array_binance_trades);
 echo "</pre>";

/*
Nachdem alle Trades von Binance gelesen worden sind, sollen die nun in die Datenbank 
Denn Binance gbt max. 1000 Trades raus - wenn es um einen längeren Rückblick geht, müssen die Daten aus der DB kommen
*/

foreach ($array_binance_trades as $binance_trade){

	if ($binance_trade["time"] >= $starttime * 1000){ // Nur Trades nach dem Startdatum berücksichtigen
		$sql = "INSERT INTO `tblTrades` (`tradeId`, `orderId`, `symbol`, `price`, `qty`, `commission`, `commissionAsset`, `time`, `isBuyer`, `isMaker`) VALUES ( '".$binance_trade["id"]."', '".$binance_trade["orderId"]."', '".$binance_trade["symbol"]."', '".$binance_trade["price"]."', '".$binance_trade["qty"]."', '".$binance_trade["commission"]."', '".$binance_trade["commissionAsset"]."', ".$binance_trade["time"]."/1000, '".$binance_trade["isBuyer"]."', '".$binance_trade["isMaker"]."')";
	
    	if (!$mysqli->query($sql)) {
  			echo " FEHLER: ".$mysqli->error."<br>".$sql ."<hr>";
    	}
    }
    	
}

/*
Alle Trades aus der Datenbank auslesen
*/
$sql_query="SELECT * FROM `tblTrades` WHERE `symbol` = '$symbol' ORDER BY `tradeId` ASC";
$result_tblTrades = $mysqli->query($sql_query);




$amount = 0;
$value = 0;
$arr_commission = array();

while($binance_trade = $result_tblTrades->fetch_array(MYSQLI_BOTH)) {
	if ($binance_trade["isBuyer"]){
		$amount += $binance_trade["qty"];
		$value += ($binance_trade["qty"] * $binance_trade["price"]);
		$arr_commission[$binance_trade["commissionAsset"]] += $binance_trade["commission"];
		echo "BUY ";
	} else {
		$amount -= $binance_trade["qty"];
		$value -= ($binance_trade["qty"] * $binance_trade["price"]);
		$arr_commission[$binance_trade["commissionAsset"]] += $binance_trade["commission"];
		echo "SELL ";
	}
	
	echo $binance_trade["qty"]." ".$binance_trade["price"]."  $value / $amount = ".( $value / $amount)." ".show_howlongago($binance_trade["time"])."<br> ";
}

echo " $value / $amount = ".( $value / $amount)." <br>";

echo "<pre> So sieht nun unser Array <i>arr_commission</i> aus: <br>";
print_r($arr_commission);
echo "</pre>";

?>

... ganz oben im Kommentar ist der SQL-Befehl um die Tabelle und die Keys in der Datenbank anzulegen.

So wird das aufgerufen - einfach das Binance-Symbol als Parameter in der URL übergeben:

http://HIERDEINEIPADRESSE/BalanceBot/show_trades.php?symbol=BNBETH

 

.... dem Skript ist es egal ob in der Vergangenheit schon Trades stattfanden, das greift sich alles ab.

Wenn Du vor dem Start des Balancebots schon Trades hattest, dann ändere oben bei "$starttime" auf Dein Wunschdatum - in meinem Fall wollte ich keine Trades auslesen, die vor dem 1.1.2019 stattfanden.

 

... bei Fragen: fragen 😉

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

Nur eine Idee,

wie wärs den Bot auf ausgemusterten Smartphone laufen zu lassen? Ich habe bisher zwar keine Linux Distrubution gefunden, welche gut läuft bzw. meine Smartphones, die hier rum fliegen, sind nicht gerootet und meistens wird root benötigt. 

Smartphone dürfte sparsamer sein als Rasberry und es ist vorhanden ☝️(Elektromüll)

Evtl, weiß jemand eine brauchbare Linux Distribution, welche funktioniert, vorzugsweise auf Ubuntu Basis. Wenn die auch noch ohne root läuft, wäre es perfekt. 

Ich will Sony/Erricson LT26i (Höhstes Modell gewesen, Nachfolger ist Xperia Z1) einsetzten. Dürfte Android 3 evtl. 4 haben. Akku gerade leer, kann nicht naschauen.

Zeitlich ist es so den Iphone-1 oder Iphone-2 Zeiten zuzuordnen.

Bearbeitet von Axmlm
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Jokin,

bin recht neu in der Kryptoscene unterwegs und bin auf deinen tollen RaspiBolt gestoßen. Tolle Arbeit!!

Wenn ich jetzt die /BalanceBot/index.php im Browser aufrufe, bekomme ich folgende Fehlermeldung:

Incorrect string value: '\xFCr NEO...' for column `balancebot`.`tblMessages`.`message` at row 1Incorrect string value: '\xFCr BNB...' for column `balancebot`.`tblMessages`.`message` at row 1Incorrect string value: '\xFCr ADA...' for column `balancebot`.`tblMessages`.`message` at row 1

Wie kann ich das beheben?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb immergut:

Wie kann ich das beheben?

Das Erste was ich in solchen Fällen mache ist mit Google zu suchen: "\xFCr"

Dabei findest Du, dass das ein Zeichensatzproblem ist gepaart mit nachlässiger Programmierung (eventuell von mir in diesem Fall 😉 )

Dieser Suchtreffer ist passend: https://forum.pokefans.net/plauderecke-technik-webentwicklung/topic52804.html

... allerdings wüsste ich nicht an welcher Stelle das passiert sein könnte, denn ich wahr durchaus umsichtig genug.

Die Nachrichten werden in der Funktion "update_messages()" in die Datenbank geschrieben und nur dort.

function update_messages($message){

    global $mysqli;    // Datenbank-Handler innerhalb der Funktion zugänglich machen

    // Mit "real_escape_string" werden Sonderzeichen umgewandelt um sie in der DB zu speichern
    $sql_query = "INSERT INTO `tblMessages` (`date_created`, `message`) 
        VALUES ('".date("Y-m-d H:i:s")."', '".$mysqli->real_escape_string($message)."')";

    echo "MESSAGE: $message <br>"; // Was in die DB kommt, kann auch gleich mal ausgegeben werden, 

    // Minimales Fehlerhandling
    if (!$mysqli->query($sql_query)) {
        echo $mysqli->error;
    }
}

Diese Sonderzeichen, die zu Problemen führen, werden mit der Funktion "$mysqli->real_escape_string()" so formatiert, dass sie sauber in die Datenbank flutschen.

Ich denke nicht, dass das bei Dir fehlt, oder?

Zu Testzwecken schreib mal den unteren Teil um:

    // Minimales Fehlerhandling
    if (!$mysqli->query($sql_query)) {
        echo $mysqli->error;
        echo $sql_query;
    }

Mit "echo $sql_query;" lässt Du Dir die SQL-Abfrage ausgeben, die eigentlich "escapte" Sonderzeichen ausgeben sollte. Das bedeutet, dass aus einem Backslash ein doppelter Backslash wird. Aus Anführungszeichen werden Anführungszeichen mit vorangestelltem Backslash.

Hier gibt es weitere Informationen dazu: https://www.php.net/manual/de/mysqli.real-escape-string.php

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb bjew:

An irgendeiner Stelle schreibt jokin auch davon, dass beim Kopieren was passieren kann, und verweist dahet auf das Archiv

Ach, stimmt ja!!!

Da kann es beim der Codeschnippsel Kopieren aus dem Forum zu uncoolen Steuerzeichen kommen. 

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für eure Antworten.

Habe jetzt mal die Zeilen geändert

// Minimales Fehlerhandling
    if (!$mysqli->query($sql_query)) {
        echo $mysqli->error;
        echo $sql_query;
    }

bekomme jetzt folgende Fehlermeldungen:

Incorrect string value: '\xFCr NEO...' for column `balancebot`.`tblMessages`.`message` at row 1INSERT INTO `tblMessages` (`date_created`, `message`) VALUES ('2020-04-22 12:39:04', 'Finde Preis f�r NEOETH: 0.04199900 (24h high/low: 0.04273400 / 0.04183000) ')Incorrect string value: '\xFCr BNB...' for column `balancebot`.`tblMessages`.`message` at row 1INSERT INTO `tblMessages` (`date_created`, `message`) VALUES ('2020-04-22 12:39:04', 'Finde Preis f�r BNBETH: 0.08777300 (24h high/low: 0.08894100 / 0.08697000) ')Incorrect string value: '\xFCr ADA...' for column `balancebot`.`tblMessages`.`message` at row 1INSERT INTO `tblMessages` (`date_created`, `message`) VALUES ('2020-04-22 12:39:04', 'Finde Preis f�r ADAETH: 0.00019984 (24h high/low: 0.00020323 / 0.00019783) ')

Kann da vielleicht der Zeichensatz im Raspberry falsch eingestellt sein?

Wenn ich die Dateien aus dem "Release_version-1.2_stable" nehme, bekomme ich beim Aufruf im Browser Chrome nur eine leere weiße Seite.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 40 Minuten schrieb immergut:

Kann da vielleicht der Zeichensatz im Raspberry falsch eingestellt sein?

Ja, irgendwas ist da krumm - sehr merkwürdig.

Als Workaround empfehle ich Dir aus "für" einfach "fuer" zu machen, also die Umlaute händisch rausnehmen. 

Konkret würde ich nun den Fehler nach und nach eingrenzen bis ich zum Ziel komme, aber das sprengt hier den Rahmen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab das Projekt mit Interesse verfolgt, Wahnsinn Jokin, was Du da an Arbeit rein gesteckt hast!!

Hut ab... und vielen Dank für die Masse an Information, samt ihrer Transparenz...

Und zu welchem Fazit seid ihr gekommen, PT oder Workshop Bot, was funktioniert besser??

Beste Grüße

Willy

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Willy:

Und zu welchem Fazit seid ihr gekommen, PT oder Workshop Bot, was funktioniert besser??

Der ProfitTrailer hatte das Problem, dass er immer wieder Bags gebildet hatte. Also abschmierende Coins immer weiter nachgekauft. Das hat mich zweimal heftig runtergerissen.

@PeWi hatte sehr viel Arbeit investiert um den PT mit einem externen Tool zu optimieren. Ich hab ihm zugearbeitet und selber noch mehr Sicherheit hinzuprogrammiert. Ende 2018 hab ich das Projekt beerdigt.

Falls Du PT-Lizenzen brauchst, ich hab noch welche - kannste geschenkt haben.

Der Balancebot kann in dieselbe Falle laufen einen Coin immer wieder nachzukaufen, der gedelistet wird - also dieselbe Gefahr.

Insgesamt ist mein Bot, der mit 10 ETH gestartet ist, derzeit bei 7 ETH. Da ETH von 80 auf nun 180 Euro gestiegen ist, sind das keine direkten Verluste - jedoch wäre reines Hodln besser gewesen (dann wären noch 10 ETH da).

Allerdings wurde der Bestand der anderen Coins im Portfolio stetig ausgebaut.

Ich hab momentan ca. 6 Bots laufen. Teils mit ETH und teils mit BTC. So richtig renditestark sind die nicht, das muss ich ehrlich zugeben.

Da das Projekt jedoch eher aufzeigen soll "wie" es geht, muss jeder selber seinen weiteren Weg gehen.

Da nun sowohl das Halving bei BTC als auch das Upgrade bei ETH ansteht, rate ich zu max. 5% des Portfolios dem BalanceBot zu überlassen - mindestens 50% des Portfolios rate ich lieber einfach nur in den Steuerschlaf zu schicken.

Denn die Chance auf heftige Kurssteigerungen bei BTC und ETH sehe ich durchaus kommen - und das steuerpflichtige BalanceBot-Traden ist bei heftigst steigenden Kursen nicht ratsam.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.