DCA Bot für Kraken

Hi foobar

Wie erkläre ich das am besten? Ich versuchs mal, aber stell gerne Rückfragen, falls was unverständlich ist.

Mein Ziel ist es, Kursschwankungen auszugleichen, indem man über den ganzen Monat hinweg kauft und das so häufig wie möglich. Wenn der Preis sinkt, kauft man öfters (fühlt sich gut an), wenn er steigt wird wieder weniger gekauft, aber am Ende des Geldes (nach einem Monat) läuft’s darauf hinaus, dass man so gut wie möglich am Kurs entlang kauft und nicht zB einfach die Hochs oder die Tiefs trifft. Also wenn du bspw. einmal im Monat kaufst und am nächsten Tag hat sich der Kurs halbiert… Dann ist das so, klar, aber du hättest einen Tag warten können und hättest dann doppelt so viele Sats bekommen. Mich persönlich störts das ein bisschen. Das passiert dir mit meinem Bot nicht, da der einfach so häufig wie nur möglich, sauber verteilt über den Monat, einkauft. Sein Ziel ist, dass bis zum nächsten Monat (aka Zahltag) das ganze Fiat weg ist und das du als Anwender immer ein gutes Gefühl hast.

Der Bot läuft in Iterationen ab, die ich hier mal textuell beschreibe (aus Sicht des Bots):

  1. Kaufe 0.0001 Bitcoin.
  2. Wie viel Fiat Geld habe ich?
  3. Wann ist der nächste Zahltag? (Wochenenden und so weiter werden alles automatisch berücksichtigt)
  4. Wie viele Käufe könnte ich zum aktuellen Preis tätigen mit der kleinsten Ordergrösse? (0.0001 BTC per Kauf/Verkauf ist Minimum)
  5. Wie viele Millisekunden verbleiben, bis zum Ende (Mitternacht) des nächsten Zahltages?
  6. Anzahlt Millisekunden dividiert durch Anzahl Orders ergibt dann die Anzahl Millisekunden, in denen der nächste Kauf statt finden muss.
  7. Warte bis zum nächsten Kauf und starte dann wieder bei Punkt 1.

Und irgendwo dazwischen gibt es dann noch den Check, ob ein Withdrawal (Abheben) ausgeführt werden soll.

Hoffe, das hilft! :slight_smile:

3 „Gefällt mir“

Hi @codepleb ,
ich probiere gerade deinen Bot aus, die Installation über Docker hat problemlos geklappt!

Ich habe zwei Anmerkungen:

  • Es wird mit jedem Neustart sofort ein Kauf ausgelöst. Ich denke das ist so zu erwarten, da der Bot keine vergangenen Buchungen prüft. Wäre es vielleicht sinnvoll ein Logfile lokal zu schreiben, in dem Zeitstempel und Intervall der letzten Buchung steht und wenn das Intervall größer als Zeit bis zur letzten Buchung ist keinen Kauf auszulösen?

  • Der Bot rechnet ja damit, dass z.B. am 5. des Monats neues Geld eingezahlt wird. Habe ich es richtig verstanden, dass der 5. Um 24 Uhr angenommen wird? Wenn dann Geld am 5. Um 8 Uhr ankommt, wurde der Bot versuchen das Konto bis Mitternacht auf 0 zu bekommen? Was würde passieren, wenn das frische Geld erst am 7. ankommt?

Vielen Dank!

1 „Gefällt mir“

Hey @omentron

Danke für dein Feedback:

  • Möglich klar. Mein Bot ist ein „Zero-Dependency“ Bot der Wert auf Schlichtheit und Schlankheit legt. Alles ist selber implementiert, keine Libraries (ausserhalb von Node) werden benutzt. Dies macht das ganze stabiler. Da ich mit deiner Idee quasi eine Datenbank einführen würde, ist mir das zu viel Komplexität. Es ist eigentlich nicht die Idee, dass man den Bot mehrmals pro Tag neu startet. Ich restarte den vielleicht maximal 3x im Monat. Da wird das dann belanglos, wenn von über 200 Käufen 2 davon etwas asynchron ausgelöst werden. Sehe deinen Punkt aber ein. Habe mir auch schon überlegt, die Reihenfolge zu ändern, damit das nicht einfach so passiert (kann ja sein, dass gar kein Geld drauf ist, und das würde ja im Ablauf sowieso abgefragt werden.
    Was mir allerdings gerade als Idee gekommen ist: Man könnte über die Kraken-API den zuletzt ausgeführten Order abfragen. Aber der Bot rechnet die Zeit halt nicht rückwärts, sondern nur vorwärts (wann muss ich den nächsten Order machen ab JETZT?). Also imho ist das Problem zu klein, um deswegen den Code komplexer zu machen.
  • Gute Frage! Nein, das passiert dann nicht. Sobald der 5. erreicht ist und der erste Order ausgeführt wird (ab00:00 Uhr), wird das Datum in die Zukunft verschoben (5. des Folgemonats). Aber ein Problem dabei: Wenn der Order um 00:14 Uhr ausgeführt wird, als Beispiel und das Datum dann um einen Monat verschoben wird, muss er mit den verbleibenden… sagen wir 8 Euro auskommen bis zum nächsten Zahltag in einem Monat. Sprich, am Zahltag wird der Bot eine kurze Pause einlegen, bis neues Geld da ist (bei mir so ab 09:00 Uhr meinte ich).

Top Anmerkungen von dir, vielen Dank! Beides nicht wahnsinnig schön, aber verschmerzbar in meinen Augen (zugunsten der Wartbarkeit und geringen Fehleranfälligkeit).

1 „Gefällt mir“

Es wäre doch recht einfach, auf die Trading-Historie von Kraken zurückzugreifen. Dort steht ja bereits alles in einer Datenbank :slight_smile:

Dieser Trade aus der Trading-Historie könnte dann als Startpunkt dienen. Falls es keinen Trade heute gab, bleibt die Logik wie sie jetzt ist bestehen.

1 „Gefällt mir“

@DocBrown Ich kaufe so alle 1.5 Stunden aktuell. Wär doch doof, wenn ich den Bot um 3:00 Uhr anhalte und dann nochmals starte und er für den ganzen Tag dann nichts mehr kauft. Das ist dann noch viel unpräziser, als mit der aktuellen Lösung ohne extra Code. :slight_smile:

War nur ein Vorschlag :wink:

Habe den Bot nun auf meinem Raspberry Pi getestet. Will man Node.js über den Paketmanager updaten, hat man das Problem, dass die Version aus dem Repository massiv veraltet ist. Damit lief das Script bei mir zumindest nicht.

Der beste weg, um dennoch an die aktuelle Version von Node.js ranzukommen läuft über folgende Commands, die als root user ausgeführt werden müssen:

su root
curl -fsSL https://deb.nodesource.com/setup_current.x | bash -
apt-get install -y nodejs

Im Detail nachzulesen hier.

2 „Gefällt mir“

Welches OS/Bits hast Du auf dem Raspi im Einsatz? Welche Version zieht er sich aus dem Repo?

Eine andere Möglichkeit wäre noch, Node.js über Docker zu installieren, da sollte es arm und arm64 Images geben. Ist zwar ein bißchen komplizierter, aber man hätte den Bot sauber isoliert, falls da noch was anderes auf dem Raspi läuft.

Edit: In dem GitHub Repo gibt es ja sogar bereits schon eine Variante mit Docker.

2 „Gefällt mir“

Läut auf meinem Raspiblitz.
Die Version aus dem Repo wäre v12.22.12

1 „Gefällt mir“

@codepleb
Nochmal eine Frage. Ich steuere den Bot nun über SSH. Als ich gestern das Terminal geschlossen habe, hat sich das Script offensichtlich beendet… zumindest wurden keine weiteren Käufe ausgeführt und ich musste es heute morgen neustarten. Weißt du evtl. woran das liegt bzw. wie ich da in Zukunft am besten vorgehen kann?
Danke im Voraus!

Wie hast Du den Bot gestartet? Direkt oder mit Docker?
Wenn Du den Bot direkt über das Terminal gestartet hast und dann das Terminal schließt, wird der Prozess des Bots natürlich auch gekilled. In Linux gäbe es die Möglichkeit, den Prozess weiter laufen zu lassen, suche mal nach dem nohup oder screen Kommando.
Oder man macht einen systemd Service daraus.

Edit: Es gäbe auch noch tmux

2 „Gefällt mir“

Danke für deinen super Input :partying_face:
Habe den Bot direkt, also ohne Docker gestartet. Das mit nohup hat zwar nicht geklappt, dafür aber das screen umso besser. Echt hervorragender Tipp. Vielen Dank :star_struck:

Eventuell nohup mit einem & am Ende des Commands. Ich bin mir aber nicht sicher, ob das geht. Ich glaube, das hat mal einer per Telegram angefragt, probiert und nicht geschafft. Kann aber auch an der Person gelegen haben, bin mir nicht ganz sicher. In meinen Augen müsste es gehen (sehe zumindest nicht, warum es nicht funktionieren sollte), aber ich kenne mich da vermutlich selber zu wenig gut aus, grad in Kombination mit SSH.

1 „Gefällt mir“

Ich lasse es jetzt erstmal mit dem screen-command weiterlaufen, weil es gerade einfach super funzt. Teste ich im Zweifel wann anders nochmal. Danke auf jeden Fall :slight_smile:

1 „Gefällt mir“

Hey, ich habe ein neues Update rausgehauen. Ändert den zeitlichen Approach, den ich ursprünglich gebaut habe und nimmt viel Error Potenzial heraus!

Hier der Text auf English, könnt ihr auf https://deepl.com auf deutsch übersetzen lassen, falls ihr Mühe habt damit (auch das readme File auf Github).


I released the new final version!

Changes:

  • New Time Management: There was an issue with the date of deposit. If that fell on a weekend, and your banks would send the money on Friday rather than Monday, you would buy a months worth of bitcoin over the weekend and then run out of money. Since this is an error prone way, I decided to completely change the algorithm. It will now check in a fixed interval, if new fiat got deposited and if that happened, it will calculate 1 month into the future from there, for when the last order should be gone through before the next deposit. This new approach fixes several issues with the previous approach!
    TL;DR: You can add money anytime, but whenever you do, a new „month of DCA“ starts.

  • Variable Order Size: The minimum Kraken order is 0.0001 BTC. I got asked by someone, if that could be lifted, so that he would have less transactions. Doubling this value leads to the amount of buy orders being approximately halved. You can do this now with the variable KRAKEN_BTC_ORDER_SIZE.

  • You can adapt the default fiat checking time with the variable FIAT_CHECK_DELAY. Currently, it will check every 10 minutes, but for whatever reason, you could change this cycle. The value must be in milliseconds!

  • DATE_OF_CASH_REFILL still exists as a variable. If you need to stop/restart/start your bot on, say, the 15th of the month and the 24th would be the day where you deposit new fiat, it might not be in your interest to start from the 15th and add one whole month until the remaining fiat is being used up, when it’s actually only 10 days when your next deposit happens. This date will ONLY be considered the first time you fire up the bot and it will deduct weekends (if that date is a Sunday, it will use Friday as a target).

Your old command needs to be adapted slightly! Check the update section of the readme: GitHub - raphaellueckl/kraken-dca: A flexible Bitcoin DCA app for the cryptocurrency exchange kraken.com!

Don’t forget to join the discord! :slight_smile: raphaellueckl

2 „Gefällt mir“

Vielen Dank @codepleb
Super Sache!

1 „Gefällt mir“

Ist es eigentlich normal, dass ich meinen ursprünglichen Beitrag nicht mehr editieren kann? Der könnte mal ein paar Updates vertragen.

Ich hatte kürzlich ein interessantes Gespräch auf einem Bitcoin Meetup, auf dem ich voller Freude deinen Bot angepreist habe.

Mein Gegenüber war jedoch etwas verdutzt, warum der Bot immer den gleichen BTC Betrag kauft, statt den gleichen Euro Betrag zu kaufen, da ich so lediglich den Durchschnittspreis kaufe, allerdings nicht UNTERHALB des Durchschnittspreises. Was soll ich sagen, I did the math and he was right :smiley: Hatte mir da nie Gedanken zu gemacht und im Großen und ganzen reißt es das Ganze auch nicht raus und besser als alles auf einen Schlag zu kaufen ist es so oder so (vor allem entspannter), aber dennoch:

Kannst du eine Möglichkeit einbauen, einen festen Euro-Betrag zu wählen?

Ist das Ganze überhaupt noch relevant, jetzt wo Kraken selbst recurring buys anbietet?

Wenn ich das jetzt auf die Schnelle richtig sehe, geht das lediglich über die App mit höheren Gebühren.

Der Bot hier handelt via Market Orders bis maximal 0.26% Gebühren. Da lässt sich Kraken über die App deutlich teurer bezahlen

3 „Gefällt mir“