Einen Trading Bot bauen Teil 2 - Kryptoindikatorblog Teil 5
Im zweiten Teil des Blogs wollen wir etwas konkreter werden und uns mit folgenden Aspekten befassen:
1.) Umsetzung
2.) Bedingungen für die Profitmitnahme
3.) kostenloses Testen mit "Spielgeld"
Zu diesem Zweck werde sich beispielhaft auf einen Indikator und eine Strategie festgelegt. Diese sei:
-der Bot kauft bei entsprechender Bewertung des Bitcoinpreises für 50% des zur Verfügung stehenden Kapitals Bitcoins
-der Bot verkauft bei entsprechender Bewertung des Preises ALLE erworbenen Bitcoins in EUR
-Die Gewinne aus Verkauf und Einkauf werden getrennt gespeichert und nicht reinvestiert!
Die Instruktionen und Tipps werden in Pseudo-Code verfasst, den du dann für deine Programmiersprache anpassen kannst. In Begleitvideos auf Odysee werde ich dir einen Botbau explizit für Python zeigen. Also bleib dran, wenn dich das interessiert und folge mir auf Odysee!
1.) Umsetzung
Nehmen wir einmal an, wir wollen den Bitcoinpreis ausschließlich auf Basis des Mayer-Multiples bewerten. Nach dem Mayer-Multiple beginnt Bitcoin bei einem Wert von 2.5 eine Blase zu bilden.
Unsere Beispielstrategie definieren daher, den Bitcoin vor Blasenbildung bei unter 2.5 zu verkaufen und in günstigen Phasen, sei mal als unter 1.2 definiert, nachzukaufen:
if (Mayer_Multiple<1.2):
kaufen()
if (Mayer_Multiple>2.4):
verkaufen()
Werden diese Bedingungen so direkt implementiert, würde der Bot an jedem weiteren Tag kaufen/verkaufen, solange die Bedingungen gültig sind.
In der Realität stünde dem Bot aber nur eine begrenzte Menge an Bitcoin oder Geld für den Trade zur Verfügung. Um dies zu vermeiden, werden wir eine weitere Boolean-Variable hinzufügen, die weitere Aktionen in dieselbe Richtung verhindert, sofern die Bedingung einmal erfüllt wurde.
Diese nennen wir einmal "bereits_gekauft". Eine Boolean Variable kann nur die Werte "wahr" (englisch "true") oder "falsch" (englisch "false") annehmen. Wenn also bereits gekauft wurde, soll der Bot nicht weiter kaufen können. Die obige Strategie wird dann definiert als:
if (Mayer_Multiple<1.2 and bereits_gekauft==false):
kaufen()
gekauft=true
if (Mayer_Multiple >2.4 and bereits_gekauft==true):
verkaufen()
gekauft=false
Nach dem Kauf oder Verkauf muss die bereits_gekauft Variable noch in den jeweils anderen Zustand gesetzt werden, so dass nach einem Kauf wieder verkauft werden kann usw.
Tipp: Logischerweise muss dem Bot zu Beginn einmal erklärt werden, in welchem Zustand der Bot starten soll. Natürlich ist dies auch davon abhängig, ob du zu Testzwecken- dazu später mehr - mit Bitcoin oder EUR anfangen willst. Wenn du mit EUR startest, muss der Bot in der Lage sein zu kaufen (der Boolean muss mit false starten)
2.) Bedingung für Profitmitnahme
Neben der Bewertung des Preises muss der Profit auch gegen die Handelsgebühren gepreist werden. Transaktionsgebühren bei Bitcoin sind im Vergleich zu anderen Blockchains sehr hoch (insbesondere z.Z. durch das Aufkommen von Bitcoin-NFT und BRC20-Token).
Wenn darüber hinaus noch in einen Stablecoin auf Ethereum getauscht werden soll, fallen ebenfalls noch hohe Gebühren bei Ethereum an. Die Wertsteigerung in Bitcoin (fortan als Profit bezeichnet) muss also diese Gebühren decken.
Da die Gebühren aber ständig variieren, und wir das Abfragen der aktuellen Gebühren auf beiden Ketten der Einfachheit halber nicht zum Teil des Bots machen wollen, nehmen wir an, dass die gesamten für den Tausch nötigen Gebühren durch 5% des Verkaufswertes gedeckt werden können. Wenn wir Beispielsweise mit 200 EUR Transaktionen handeln, ist diese Annahme in den meisten Fällen erfüllt, wie die beiden folgenden Charts zeigen:
Abb. 1) Mittlere Transaktionsgebühren für Ethereum über einen Zeitraum von etwa 4 Jahren nach Messari. io.
Abb. 2) Mittlere Transaktionsgebühren für Bitcoin über einen Zeitraum von etwa 3 Jahren nach bitinfocharts. com. Die mittlere Gebühr über diesen Zeitraum betrug etwa 5 USD.
Zusätzlich zu den oberen beiden Bedingungen muss also für den Verkauf gelten:
1.05*Investment < (Investment_Wert-Investment)
Pro-Tipp: Beim schnellen Handel müssen diese Gebühren einkalkuliert werden. Wenn wir jedoch Indikatoren nehmen, deren Datenbasis auf langen Zeiträumen basiert, sollte eine Kurssteigerung von 5% in den Bewertungsanweisungen des Bots bereits enthalten sein. Das Mayer Multiple drückt das Vielfache des mittleren Preises der vergangenen 200 Tage aus. Wenn das Mayer-Multiple sich von einem Wert von 1.2 auf 2.4 fast verdoppelt, verdoppelt sich auch das Verhältnis vom mittleren Preis.
3.) Kostenloses Testen mit "Spielgeld"
Für die Optimierung des Bots und die ersten Probeläufe wäre es schön, Fehler ausmerzen zu können, bevor wir echtes Geld verlieren. Außerdem können wir durch Proben erste Gewinnerwartungen des Bots ermitteln.
Um mit "Spielgeld", das uns nichts kostet, zu arbeiten, definieren wir uns in dem Bot eine Array-Variable, die das verfügbare Fiat-Geld zählt:
FIAT=[]
Und eine, die die vorhandenen Bitcoins zählt:
BTC=[]
Vor Start des Bots weisen wir eine der beiden Währungen einen Startwert zu. Diesen kannst du in der Probe beliebig wählen, solltest ihn aber in realistischem Rahmen zu deinen Trades setzen:
Zu Demozwecken, wählen wir 100 EUR (dies sind wie gesagt keine echten EUR).
Denk daran, dass diese 100 EUR nun definieren würden, welche Transfergebühren wir minestens unterschreiten müssen, um einen Tausch durchzuführen (hier wären das 5 EUR). Sobald wir also bei 106 EUR verkaufen könnten, hätten wir bei maxmal 5 EUR Gebühren nur 1 EUR Gewinn gemacht!
FIAT.append(100)
Sobald also das Mayer Multiple von 1.2 unterschritten wird, was heute - 14.05.2023 -der Fall wäre, soll der Bot also 50% des FIATs verkaufen und entsprechend Bitcoin kaufen:
if (Mayer_Multiple<1.2 and bereits_gekauft==false):
BTC.append(0.5*FIAT[-1]/Kauf_Preis)
gekauft=true
FIAT.append(0.5*FIAT[-1])
Wir tun also nichts anderes, als eine Liste zu führen und dabei immer den letzten Eintrag [-1] für eine Berechnung zu nutzen und den berechneten Wert der Liste dann hinzuzufügen (append).
Tipp: Wir können diese Liste dann nehmen und die Trades über die Zeit graphisch darstellen.
Die Verkaufsanweisungen des Bots können ein Wenig anders aussehen. Hier stehen dir zwei Optionen zur Auswahl:
1) Führe den Gewinn (die Differenz aus Verkaufspreis und Kaufpreis inkl. Gebühren) in einer separaten Liste. Dies bedeutet, dass dein Bot zwar nie mehr als mit 100 EUR Wert traden kann, aber du riskierst es nicht, deine zusätzlich erworbenen EUR wieder zu verlieren.
2) Nutze die Gewinne für weitere Käufe. Gemäß der obigen Strategie-Definition beschäftigt sich der Rest dieses Artikels mit Punkt 1).
Gewinn=[]
if (Mayer_Multiple >2.4 and bereits_gekauft==true):
BTC.append(0)
FIAT.append(Fiat[0])
Gewinn.append(BTC[-1]*Aktueller_Preis-Investment)
gekauft=false
Der Verkauf macht nichts anderes als der Liste gehaltener Bitcoins den Wert 0 hinzuzufügen und der Liste vorhandener EUR wieder den Startwert hinzuzufügen.
ABER nun wird die Differenz aus Anzahl verkaufter Bitcoins mal aktuellem Preis (Wert der Bitcoins) und dem Investment (50% des FIAT-Startwerts) separat abgespeichert .
Der Bot ist jetzt für erste analoge Testzwecke fast fertig. Wir müssen nur noch Probedaten von Coingecko herunterladen (das habe ich dir in vielen meiner Videos bereits gezeigt) und dann für jeden einzelnen Datenpunkt in der Länge des Datensatzes (in range(len())) die Bewertung durchführen und anhand dieser den Bot entscheiden lassen, was zu tun ist. Dazu setzen wir um jeden Schritt, der nach der Festsetzung unserer Variablen erfolgt, eine Schleife (for loop):
FIAT=[]
BTC=[]
FIAT.append(100)
Gewinn=[]
gekauft=false
for i in range(len(CoingeckoPreisDaten)):
Mayer-Multiple_berechnen()
if (Mayer_Multiple<1.2 and bereits_gekauft==false):
BTC.append(0.5*FIAT[-1]/Kauf_Preis)
gekauft=true
FIAT.append(0.5*FIAT[-1])
if (Mayer_Multiple >2.4 and bereits_gekauft==true):
BTC.append(0)
FIAT.append(Fiat[0])
Gewinn.append(BTC[-1]*Aktueller_Preis-Investment)
gekauft=false
Herzlichen Glückwunsch, der Bot steht für erste Testzwecke bereit. Wie wir den Bot testen und optimieren können, sehen wir uns in Teil 3 an!