Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 5)


Empfohlene Beiträge

24 minutes ago, Theo Kojak said:

Z-Score zeigt Dir, wo Du bist. Einfach WIKI fragen.

Das hatte ich schon gefunden und ist auch nicht schwer zu verstehen. Sobald die Folge zu weit vom Erwartungswert abweicht, bricht man ab.

Kommt das öfters vor, hat man die falsche Marktphase und pausiert. Kommt das selten vor, war es lokales Pech und kann ignoriert werden.

In der Simulation muss man austesten, wie lange das Fenster für den Z-Score sein soll.
Je nach Progression legt man die notwendige Dichte der 1er fest.

Faszinierendes Thema ...

Bearbeitet von PeWi
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 28 Minuten schrieb Theo Kojak:

Wenn ich mal Zeit habe, werde ich Deinem System eine Progressionsansatz aufsetzen. Ich habe mal kurz angetestet mit Daten, wo ich 10000 Trades life auf Dummy getradet habe.

Maximal kam eine Negative Serie mit max 4x Verluste hintereinander. Das bedeutet, ich kann bei 10000 Trades und jeweils 0.5% Gewinn alle Gewinne mitnehmen und alle Verluste kompensieren. Das zeigt ein riesen Potential von Deinem Konzept. wenn Du es nicht glaubst, ist auch gut 🙂

Theo

Sehr gern! 

Solange es einfach und logisch nachvollziehbar ist, dann nehme ich das gern mit auf. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, schon klar - man kann da sicher noch mehr machen, aber das ist dann ein anderes Konzept. Außerdem muss dann deutlich mehr Arbeit reingesteckt werden, kurze Peaks können oft nicht genutzt werden weil das Programm dann doch zu langsam reagiert, bzw. die API-Schnittstelle zu träge ist.

Das sieht im Backtesting immer ganz toll aus, die Realität ist anders.

Bearbeitet von Jokin
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Stunden schrieb Theo Kojak:

Wenn ich mal Zeit habe, werde ich Deinem System eine Progressionsansatz aufsetzen. Ich habe mal kurz angetestet mit Daten, wo ich 10000 Trades life auf Dummy getradet habe.

Maximal kam eine Negative Serie mit max 4x Verluste hintereinander. Das bedeutet, ich kann bei 10000 Trades und jeweils 0.5% Gewinn alle Gewinne mitnehmen und alle Verluste kompensieren. Das zeigt ein riesen Potential von Deinem Konzept. wenn Du es nicht glaubst, ist auch gut 🙂

 

Ich glaube das sofort, ist ja auch irgendwie logisch. Was im Roulette funktioniert – zumindest wenn man sich den grundsätzlich negativen Erwartungswert mal wegdenkt – warum sollte es beim Trading dann nicht funktionieren? Immerhin ist hier der Erwartungswert nicht grundsätzlich negativ.

Konkret stehe ich aber noch auf dem Schlauch mit dem z-Score. Man braucht für die Berechnung doch Erwartungswert und Standardabweichung. Bei reinem Glückspiel wie Roulette hat man als Standardabweichung σ = √(n*p*q), mit n= Anzahl Spiele, p=W'keit und q=1-p. Der Erwartungswert ist n*p. Ab 3facher Standardabweichung wird's interessant für eine angemessene  Verlustprogression. Und ja: Man muss unbedingt rechtzeitig aufhören. Ich halte nichts von den Versuchen mancher Spieler, die sowas wie eine "unverlierbare" Progression austüfteln wollen, die niemals platzt.

Beim Trading ist es wohl nicht so einfach... man braucht doch relativ viel Mathematik für meinen Geschmack. Aber wie heißt es doch so schön: Von nix kommt nix :). Werde mal versuchen mich da ein bisschen reinzuarbeiten.

Danke jedenfalls für die Anregung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Theo Kojak:

Ich habe dir alles angegeben, was Du machen musst, um das selber hin zu bekommen. Rest musst Du schon selber machen.

Also ich hab das mit Deiner Progression nun auch nicht verstanden.

Hier mal ein Auszug was der BalanceBot mit LTC über die letzten Trades machte:

Zitat

SELL 0.05000000 0.39681000 1.43839301 / 4.862 = 0.29584389345948 
SELL 0.05000000 0.39742000 1.41852201 / 4.812 = 0.29478844763092 
BUY 0.05300000 0.36392000 1.43780977 / 4.865 = 0.29554157656732 
BUY 0.05300000 0.36318000 1.45705831 / 4.918 = 0.29627049816999 
BUY 0.05400000 0.36242000 1.47662899 / 4.972 = 0.29698893604183 
BUY 0.05300000 0.36281000 1.49585792 / 5.025 = 0.2976831681592 
BUY 0.05400000 0.35439000 1.51499498 / 5.079 = 0.29828607599921 
BUY 0.05500000 0.34992000 1.53424058 / 5.134 = 0.298839224776 
BUY 0.05500000 0.35055000 1.55352083 / 5.189 = 0.29938732511081 
SELL 0.05300000 0.36613000 1.53411594 / 5.136 = 0.2986985864486 
SELL 0.05400000 0.36118000 1.51461222 / 5.082 = 0.29803467532468 
SELL 0.05400000 0.36176000 1.49507718 / 5.028 = 0.29735027446301 
SELL 0.05400000 0.36261000 1.47549624 / 4.974 = 0.29664178528347 
SELL 0.05400000 0.36307000 1.45589046 / 4.92 = 0.29591269512195 
SELL 0.05300000 0.36356000 1.43662178 / 4.867 = 0.29517603862749 
BUY 0.05600000 0.33805000 1.45555258 / 4.923 = 0.2956637375584 
BUY 0.05600000 0.33676000 1.47441114 / 4.979 = 0.29612595701948 
BUY 0.04400000 0.35018000 1.48981906 / 5.023 = 0.29659945450926 
BUY 0.01000000 0.35018000 1.49332086 / 5.033 = 0.29670591297437 
BUY 0.05400000 0.34998000 1.51221978 / 5.087 = 0.29727143306468 
BUY 0.05400000 0.34253000 1.5307164 / 5.141 = 0.29774681968489 
BUY 0.05500000 0.34109000 1.54947635 / 5.196 = 0.29820561008468 
BUY 0.05500000 0.32523000 1.567364 / 5.251 = 0.29848866882499 
BUY 0.05500000 0.32172000 1.5850586 / 5.306 = 0.29872947606483 
SELL 0.05300000 0.33073000 1.56752991 / 5.253 = 0.29840660765277 
SELL 0.05300000 0.33110000 1.54998161 / 5.2 = 0.29807338653846 
SELL 0.05300000 0.33176000 1.53239833 / 5.147 = 0.29772650670293 
SELL 0.05300000 0.33195000 1.51480498 / 5.094 = 0.29737043188064 
SELL 0.05300000 0.33197000 1.49721057 / 5.041 = 0.29700665939298 
SELL 0.05300000 0.33296000 1.47956369 / 4.988 = 0.29662463712911 
SELL 0.05300000 0.33437000 1.46184208 / 4.935 = 0.29621926646403 
SELL 0.05300000 0.33339000 1.44417241 / 4.882 = 0.29581573330602 
SELL 0.05400000 0.33342000 1.42616773 / 4.828 = 0.29539513877382 
SELL 0.05600000 0.33027000 1.40767261 / 4.772 = 0.29498587803856 
SELL 0.05500000 0.33067000 1.38948576 / 4.717 = 0.29456980284079 
SELL 0.05300000 0.34775000 1.37105501 / 4.664 = 0.29396548241853 
SELL 0.05300000 0.34754000 1.35263539 / 4.611 = 0.29334968336586 
SELL 0.04700000 0.34865000 1.33624884 / 4.564 = 0.29278020157756 
SELL 0.00600000 0.34865000 1.33415694 / 4.558 = 0.29270665642826 
BUY 0.05400000 0.33783000 1.35239976 / 4.612 = 0.29323498699046 
BUY 0.05500000 0.33453000 1.37079891 / 4.667 = 0.29372164345404 
BUY 0.05500000 0.33152000 1.38903251 / 4.722 = 0.2941619038543 
BUY 0.05500000 0.32974000 1.40716821 / 4.777 = 0.29457153234247 
BUY 0.05600000 0.32774000 1.42552165 / 4.833 = 0.29495585557625 
BUY 0.05600000 0.31707000 1.44327757 / 4.889 = 0.29520915729188 
BUY 0.05700000 0.31430000 1.46119267 / 4.946 = 0.29542916902548 
SELL 0.05600000 0.32766000 1.44284371 / 4.89 = 0.29506006339468 
SELL 0.05600000 0.32912000 1.42441299 / 4.834 = 0.29466549234588 
SELL 0.05600000 0.33298000 1.40576611 / 4.778 = 0.29421643156132 
BUY 0.05700000 0.32774000 1.42444729 / 4.835 = 0.29461164219235 
SELL 0.05600000 0.33031000 1.40594993 / 4.779 = 0.29419333124085 
SELL 0.05500000 0.33723000 1.38740228 / 4.724 = 0.29369226926334 
SELL 0.05500000 0.34013000 1.36869513 / 4.669 = 0.29314524095095 
SELL 0.05400000 0.34885000 1.34985723 / 4.615 = 0.29249344095341 
SELL 0.05300000 0.35402000 1.33109417 / 4.562 = 0.29177864313897 
SELL 0.05300000 0.35951000 1.31204014 / 4.509 = 0.29098251053449 
SELL 0.05200000 0.36357000 1.2931345 / 4.457 = 0.29013562934709 

 

... das liest sich so:

SELL 0.05200000 0.36357000 1.2931345 / 4.457 = 0.29013562934709 

=> SELL 0.052 LTC @ 0.36357 LTC/ETH => 1.2931345 Gesamt bezahlte ETH / 4.457 Gesamt vorhandene LTC  = 0.29013562934709 Durchschnittskurs für LTC in ETH 

Damit verfolge ich, dass der Durchschnittskurs wirklich permanent gesenkt wird.

 

So, und wo genau würdest Du nun eine Progression einbauen? Wie würde der Tradeverlauf mit Progression aussehen?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Theo Kojak:

Das ergibt eine Null/Eins Folge von : 111011111011111011111110, 1 steht für Profit, 0 für Verlust. Selbst wenn ich nur eine einfache Martingale Progression hier laufen lassen würde, ist das Ding sehr profitabel.

Stimmt, nur weiß man das immer erst im Nachinein. Natürlich kann man Rückoptimieren und sagen, bei diesem Verlauf wäre die einfache Martingale profitabel gewesen. In die Zukunft schauen kann man so ja trotzdem nicht. Woran kann man sehen, ob es profitabel weiter gehen wird oder nicht? MA-Kreuzungen vielleicht? Oder aufhören sobald sich mehr Nullen einstellen als die Progression verkraftet? Aber dann wäre sie ja schon geplatzt...

Nachtrag: Was  ich oben geschrieben habe, dass es beim Trading keinen grundsätzlich negativen Erwartungswert gibt, stimmt so nicht ganz. Die Tradinggegbühr macht die Sache ja mathematisch auch unfair. Bei bitcoin.de immerhin mindestens 0,8% vom Durchschnittspreis pro Kauf/Verkauf. Unter 1% Differenz kann man also von einem Profit nicht wirklich sprechen, weil der Großteil für die Tradinggebühr weggeht. Trotzdem ist es natürlich besser als die 2,7%, die man im Schnitt auf einen Roulette-Einsatz zahlt.

Bearbeitet von Herr Coiner
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb Herr Coiner:

MA-Kreuzungen vielleicht?

Auch diese Kreuzungen sind nix wert, da man je nach gewähltem Zeitbereich die Kreuzung an einer anderen Stelle erhält. 

Weiterhin ist die Kreuzung auch nur die "Wirkung" des Marktwechsels und nicht die "Ursache".  Bevor sich MAs kreuzen hatte sich der Markt schon eine ganze Weile gedreht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Theo Kojak:

Ich denke, Du hast das Konzept nicht Ansatzweise verstanden. Du solltest Dich mit was anderem beschäftigen.

Ooch, so schnell gebe ich nicht auf. Der Ansatz ist mir schon klar, und ich habe es auch nicht eilig damit. Was wir fehlt, ist Erfahrung beim Trading, bin aber ein alter Hase mit Roulettestrategien. Es gibt Gemeinsamkeiten, soviel ist klar, und was es da Umzudenken gilt, finde ich schon noch heraus, nicht zuletzt dank dir und überhaupt Dank des Forums hier :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Theo Kojak:

Aber ich verbringe hier zuviel Zeit. Das von hier gezeigte Konzept von Jokin kann mit einfachen Kniffen um mindestens das 10fache an Profit gesteigert werden, glaubt es oder nicht, das überlass ich Euch. Man kann das seht einfach simulieren und eigene Versuche machen.

Mit Verlaub - das unterscheidet uns beide von einander.

Ich "mache" und das auf einfache Art und Weise, sodass man das auch nachvollziehen kann.
Du hingegen "redest" und "simulierst". Wenn Du Deine Redezeit in Umsetzungszeit investieren würdest, würdest Du einen großen Beitrag hier zum Forum leisten. Aber das möchtest Du nicht.

Warum also versuchst Du theoretischen 10-fachen Profit zu predigen anstatt es einfach mal an einem praktischen Beispiel zu zeigen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb Jokin:

Ich "mache" und das auf einfache Art und Weise, sodass man das auch nachvollziehen kann.

Du hingegen "redest" und "simulierst". Wenn Du Deine Redezeit in Umsetzungszeit investieren würdest, würdest Du einen großen Beitrag hier zum Forum leisten. Aber das möchtest Du nicht.

Warum also versuchst Du theoretischen 10-fachen Profit zu predigen anstatt es einfach mal an einem praktischen Beispiel zu zeigen?

Ich finde, da tust du Theo unrecht. Er redet ja nicht nur, sondern hat sein Konzept doch im Prinzip vorgestellt, auch einigermaßen konkret, wenn auch nicht mit allen Details. So sind sie halt, die Dauergewinner ;). Ist ja auch verständlich, wenn man jahrelang etwas ausgetüftelt hat, dass man es nicht einfach verschenken oder in einem Forum womöglich als Perle vor die Säue werfen will.

Gibt es beim Crypotrading eigentlich auch Systemverkäufer, die den Stein der Weisen gefunden haben und verkaufen wollen? @Theo Kojak: Nix für ungut, aber du hättest das Zeug dazu :).

Da fällt mir noch eine Anekdote aus einem Programmierforum ein, wo junge Leute, teilweise wirklich zu faul zum selber Denken Fragen stellten und man ihnen auf die Sprünge half. "Wie sieht das Programm denn aus?" fragte schliesslich einer nach dem gefühlt 10. Hinweis, und ich konnte nicht umhin auch das zu beantworten: "Weisser Hintergrund vielen komischen Zeichen wie {[;$> etc. meistens gedichtartig eingerückt..." 😛

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

vor 14 Minuten schrieb Herr Coiner:

So sind sie halt, die Dauergewinner ;).

Naja ... genau genommen schreibt er immer nur von Simulationen und Backtests. 

Ich vergleiche solche Leute gern gegen diejenigen, deren Erfolge ich sehen kann. Und nein, die tragen diese Erfolge auch nicht so sehr in die Öffentlichkeit, aber zwischen den Zeilen dessen was sie schreiben, wofür sie sich interessieren und auf welche Art und Weise sie sich beteiligen erkenne ich recht gut wer realen Erfolg hat.

An den Folgen des Erfolgs zeigt es sich - nicht an theoretischem Wissen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

3 hours ago, Herr Coiner said:

Die Tradinggegbühr macht die Sache ja mathematisch auch unfair. Bei bitcoin.de immerhin mindestens 0,8% vom Durchschnittspreis pro Kauf/Verkauf.

Die logische Konsequenz daraus ist, dass man dieses System dann natürlich nicht gegen bitcoin.de probiert, sondern sich eine Börse sucht mit möglichst niedrigen Gebühren.

Da man mit 5min-Candles und dieser Methode vermutlich viel Umsatz erzeugt, könnte man auch Börsen nehmen, die umsatzabhängig Rabatt einräumen.
Wenn man auf 10 Mio Umsatz im Monat kommt, dann hat Kraken 0.0% - Jokin weiß, wie man das macht ... :ph34r:

  • Haha 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb PeWi:

Die logische Konsequenz daraus ist, dass man dieses System dann natürlich nicht gegen bitcoin.de probiert, sondern sich eine Börse sucht mit möglichst niedrigen Gebühren.

Da man mit 5min-Candles und dieser Methode vermutlich viel Umsatz erzeugt, könnte man auch Börsen nehmen, die umsatzabhängig Rabatt einräumen.
Wenn man auf 10 Mio Umsatz im Monat kommt, dann hat Kraken 0.0% - Jokin weiß, wie man das macht ... :ph34r:

10 Mio. was? Shitcoins? Dollars? Die Tradinggebühr bis 10 Mio. ist auch nicht gerade wenig... 30.000 bei 0,3% pro Deal, wenn ich mich nicht verrechnet habe. Und das jeden Monat? Also wenn man es in einem halben Monat schafft, dann darf man den Rest vom Monat gratis traden? Fragen über Fragen.

Bearbeitet von Herr Coiner
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Theo Kojak:

Beispiel : Wenn Du als 1 = 1 Euro und als 0 = -1 Euro setzt, dann sind das bei 10% Gebühren (Pi mal Daumen) eben 1 = 1,1 und 0 = -1,1 oder 1 = 1 Euro und 0.9 Gewinn. Rest kann man durch Parameter ausgleichen.

Das ist schon klar, aber ausreichend große Schwankungen müssen erst mal erreicht werden. In deinem Beispiel mit 10% Gebühren braucht es eben Schwankungen über 10%. Alle 5 Minuten findet man die natürlich nicht, und auch nicht alle paar Stunden. Je länger man auf eine ausreichende Schwankung warten muss, umso unsicherer wird es auch mit Progression, die man sich ausgesucht hat, oder man muss sie laufend anpassen... oder wie immer. Die Gebühren schlagen auf jeden Fall negativ zu Buche, genau wie der Hausvorteil beim Glücksspiel.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Minuten schrieb Herr Coiner:

10 Mio. was? Shitcoins? Dollars? Die Tradinggebühr bis 10 Mio. ist auch nicht gerade wenig... 30.000 bei 0,3% pro Deal, wenn ich mich nicht verrechnet habe. Und das jeden Monat? Also wenn man es in einem halben Monat schafft, dann darf man den Rest vom Monat gratis traden? Fragen über Fragen.

10 Mio. "USD".

Und nein, das sind keine 30.000 USD Gebühren:
Das sind weniger als 4.000 USD an Gebühren (https://www.kraken.com/features/fee-schedule).

Und nein, auch nicht jeden Monat - nur im ersten Monat zahlt man diese Gebühren, danach bleibt man bei 0,0% und muss nur zusehen, dass man ausreichend hohen Umsatz hat - man zahlt ja dann keine Gebühren mehr.

Und ja, sobald man den Umsatz geschafft hat, tradet man vollkommen gratis solange man diesen Umsatz hält.

Mein Balancebot macht bei Binance auch nur Sinn, weil die Gebühren für "Low-Volume-Trader" günstiger sind als bei Kraken und es dort Ref-Boni gibt. Bei Kraken wird es bei einem höheren Umsatzvolumen weit interessanter. Mit meinen derzeitigen vorsichtigen Einstellungen wird je Monat gerade mal der Einsatz umgewälzt. Man muss da schon 10 Mio USD einsetzen um das zu erreichen.

Oder aber man skaliert entsprechend runter ... wenn man von 0,1% Volumen je Trade auf das 100-fache geht, also auf 10%, dann reicht ein Kapital von 100.000 USD bereits aus.

Auch ganz interessant: Ab einem bestimmten Handelsvolumen (keine Ahnung, ob das auch schon bei weniger als 10 Mio der Fall ist), bekommste einen persönlichen Support-Mitarbeiter, der dann (fast) jederzeit für Dich da ist und mit dem man auch gern telefonieren kann.

... falls sich nun die Frage stellt, wieso das bei Kraken alles gratis ist: Diese Vorteile gelten nur für Market-Maker, also für diejenigen, die Liquidität ins Orderbuch bringen und die dann durch andere auch aufgezehrt wird. Also einfach nur Show-Order einzustellen, die man dann wieder weg nimmt, bringen es nicht. Man muss schon aktiv am Marktgeschehen teilehmen.

Bearbeitet von Jokin
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Theo Kojak:

@Herr Coiner, mach doch mal folgendes. Versuch mal Roulette zu verstehen.

Ich verstehe Roulette so gut wie kaum ein anderer, habe das Spiel 30 Jahre lang erforscht, mit W'keitrechnungen, Simulationen und allem bis zum Abwinken.

Zitat

In einem normalen Roulette System mit Gausverteilung auf Rot/Schwarz, warum funktioniert da keine Martingale Progression und wie kann man die dort zum laufen bringen ?

Es ist keine Gaussverteilung, sondern die sog. Binomialverteilung. Die Martingale-Progression funktioniert grundsätzlich, d.h. rein theoretisch. Praktisch aber nicht, weil man unendlich viel Kapital bräuchte und es auch kein oberes Limit geben dürfte. Es hat aber niemand unendlich viel Kapital und jede Spielbank hat Limits.

Man kann die Martingale trotzdem nutzen als Gewinnprogression, d.h. man lässt im Gewinnfall den Einsatz stehen und lässt die Bank verdoppeln, statt im Verlust immer mehr gutes Geld hinterher zu werfen. Auch als Verlustprogression funktioniert sie gelegentlich, aber frühestens ab 3 Sigma, z.B. bei Rot/Schwarz nach mindestens 10 mal gleicher Farbe in Folge erst anfangen dagegen zu setzen – auf keinen Fall früher – und dann nur für wenige Coups: 1 Stück – 2 Stück, fertig. Für mutige oder wenn man eh gerade fett im Plus ist auch mal noch mit 4 Stück versuchen, aber das war's dann. Nur dumme Anfänger verdoppeln im Verlust weiter und haben am Ende sowas wie 1024 Stücke eingesetzt, um vielleicht ein einziges zu gewinnen.

Zitat

Die Verteilung bei Roulette ist 53 (Bank)/47 mit Doppelnull, wenn ich mich richtig erinnere ?

Nein Doppelzero ist schon mal nicht normal. Das gibt's nur in den USA und ist doppelt unverschämt. Normal sind 37 Zahlen 0...36. 
 

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 12.1.2019 um 21:36 schrieb Jokin:

Hallo zusammen,

 

nach der vierten Lektion (https://coinforum.de/topic/16035-workshop-wir-basteln-uns-einen-tradingbot-lektion-4/) geht es heute weiter, jedoch werden wir vorher noch eine Änderung am Beispiel-Portfolio vornehmen.

Mein Beispiel richtet sich an diejenigen mit geringem Portfoliowert von ca. 100 USD. Die Basiswährung "USDT" ist da nicht sinnvoll, da Order mit mindestens 10 USDT erstellt werden müssen. Sinnvoller ist es da "ETH" zu nehmen, das Mindestvolumen beträgt 0,01 ETH, was derzeit weit unter 2 USDT sind. Da jedoch BTC nicht im ETH-Markt gehandelt werden kann, ändern wir diese Währungen in der config.php:

USDT -> ETH
BTC -> NEO
ETH -> BNB

Diese Änderung ist kein Zwang! Es kann so belassen werden wie es ist, jedoch bei kleineem Vermögen sollte auf ETH umgestellt werrden.


// Abschnitt config.php 3: Nun erstellen wir ein Array welches später alle Informationen zu den Coins enthält, die wir brauchen.
$__balanceBot_basecurrency = array (
					"name" => "ETH",
					// "40" bedeutet, dass 40% des Coin-Gesamtwertes auch als Basis-Währung an der Seitenlinie liegen soll
					// Der "Coin-Gesamtwert" ist die Summe der USDT-Werte der Coins (BTC, ETH und ADA in unserem Beispiel)
					"target_percentage" => "40"	// Achtung, das letzte Element ohne Komma!
				);

$__balanceBot_coins = array(				
					array(
						"name" => "NEO",
						// "40" meint, dass 40% des Coin-Gesamtwertes als BTC vorhanden sein sollen
						// Summe aller Prozentwerte muss 100 ergeben, ansonsten wird es später zur Fehlermeldung kommen
						// Weiterhin sollte die Vorgabe nicht dazu führen, dass Coins einen Gegenwert von unter 20 USDT haben.
						// Berechnungsbeispiel: Wenn 30% eines Coins min. 20 USDT sein sollen, dann wird der 100%-Coin-Gesamtwert
						//                      mindestens 66,67 USDT betragen. Wenn zudem 40% dieses Wertes an der Seitenlinie liegen sollen,
						//						dann würden mindestens 26,67 USDT an der Seitenlinie liegen.
						//						... somit müssen ca. 100 USDT an Portfolio-Gesamtwert vorhanden sein.
						// Portfolio-Gesamtwert = Seitenlinie + Coin-Gesamtwert 
						// ... wird minimal "20" gewählt, also 20% eines Coinwertes müssen 20 USDT entsprechen, dann wird der 
						// Coin-Gesamtwert mindestens 100 USDT betragen. Zusätzlich 40% an der Seitenlinie zwingen zu einem
						// Gesamt-Portfoliowert von mindestens 140 USDT.
						"target_percentage" => "40"	// Achtung, das letzte Element ohne Komma!
						),
					array(
						"name" => "BNB",
						"target_percentage" => "30"	// Achtung, das letzte Element ohne Komma!
						),
					array(
						"name" => "ADA",
						"target_percentage" => "30"	// Achtung, das letzte Element ohne Komma!
						) // Achtung, das letzte Element ohne Komma!
					);

 

Heute stehen diese Punkte auf dem Programm:

1. Ordererstellung vorbereiten
2. Die vier Gedanken zur Strategie
3. mögliche Buy-Order löschen
4. mögliche Sell-Order löschen
5. Sell-Order anlegen
6. Buy-Order anlegen
7. Veraltete Order löschen

1. Ordererstellung vorbereiten

Um Order zu erstellen, bauen wir uns eine Funktion „create_order“ der diese Parameter übergeben werden:
$side ... ob die Order eine SELL- oder BUY-Order werden soll
$symbol ... welcher Coin gegen welche Basiswährung getradet werden soll (z.B. „BTCUSDT“)
$amount ... welche Anzahl an Coins getradet werden soll
$price ... zu welchem Preis die Coins getradet werden sollen.

Besonders wichtig: Binance erlaubt mit „sellTest“ und „ buyTest“ erstmal Testorder an die Exchange zu senden. Die werden auf Gültigkeit geprüft, jedoch nicht in das Orderbuch übertragen. Dadurch wird vermieden, dass viel zu viele Coins als Marketorder das Orderbuch leer fegen.
Nichts destotrotz sollte dem Bot solange nur ein geringes Budget zur Verfügung gestellt werden damit ein Programmierfehler nicht zu größeren Verlusten führen kann.


// Abschnitt index.php 7: 
// An mindestens zwei Stellen werden wir später Order in das Orderbuch schreiben, das rechtfertigt auch hier eine Funktion.
function create_order($side, $symbol, $amount, $price){

	global $binance_api_handler;	// API-Handler innerhalb der Funktion zugänglich machen

	// Schonmal vorbereiten was wir in die Log-Datei schreiben wollen.
	$message = "CREATE ORDER: $side $amount @ $price $symbol ";

	// Hier führen wir die Order aus, "sellTest" / "buyTest" meint, dass Binance prüft ob die Order so 
	// anlegbar sind jedoch keine Order in das Orderbuch schreiben wird. Keine Gefahr für Geldverlust!
	// in Teil 6 ersetzen wir "sellTest" durch "sell" und "buyTest" durch "buy"
	if ($side == "SELL") $result_binance_create = $binance_api_handler->sellTest($symbol,$amount,$price);
	if ($side == "BUY") $result_binance_create = $binance_api_handler->buyTest($symbol,$amount,$price);

	// falls ein Fehler zurück kommt, wollen wir das wissen
	if ($result_binance_create['code']){
		$message .= "Binance-API-Call-ERROR ".$result_binance_create['code'].": ".$result_binance_create['msg']." ";	
	}
	update_messages ($message);								
}

 

An dieser Stelle erweitern wir auch noch unsere config.php


// Abschnitt config.php 4: 
$__trading_factor = 0.1; 	// 0.1 meint, dass mit 0.1% des Gesamt-Portfolio-Wertes jeweils getradet wird.
							// Große Werte erlauben ein schnelles Ausbalancieren, aber die Strategie wird instabil
							// ... am Besten klein starten und dann nach oben ausprobieren.
$__max_orderAge = 12;		// 12 meint, dass eine Order max. 12 Stunden alt sein darf
							// Werden Order zu früh gelöscht, kann nichts balanciert werden
							// Werden Order zu spät gelöscht, sind zu wenig freie Coins vorhanden

 

2. Die vier Gedanken zur Strategie

Hier haben wir mal einen Codeabschnitt mit besonders viel Kommentierung direkt im Code. Ich halte das für sehr wichtig, dass der Programmcode jederzeit anhand der dort enthaltenen Kommentare nachvollziehbar ist.
Auch Ihr solltet in den Code kommentieren was Euch wichtig ist.

Es ist gar nicht so einfach strategische Gedanken in Worte zu fassen – besser wäre es ein Youtube-Video zu erstellen, welches jeden Gedanken aufgreift, wie die Umsetzung aussieht und welche neuen Probleme dadurch entstehen.

Ich beginne jeden Gedanken indem ich aufgreife, was für Informationen wir bereits zu jedem der verwalteten Bots kennen und was wir damit anstellen wollen

Los geht‘s

$__balanceBot_coins[$key]['deviation_percentage'] enthält die prozentuale Abweichung von IST und SOLL-Wert des Coin-Anteils vom Coin-Gesamtwert, er ist kleiner 1 wenn wir zu wenig Coins haben (IST) als wir haben wollen (SOLL). (z.B. BTC, ETH, NEO, BNB oder ADA)

Gedanke 1: Wenn es KEINE Abweichung von IST und SOLL gibt, muss NICHT ausbalanciert werden, ansonsten wird ausbalanciert:

... if ($__balanceBot_coins[$key]['deviation_percentage'] > 1) then SELL Coin
... if ($__balanceBot_coins[$key]['deviation_percentage'] < 1) then BUY Coin

Neues Problem: Ein BUY ist unsinnig wenn meine Basiswährung ebenfalls unter dem SOLL-Wert liegt, dadurch vergrößere ich meine Abweichung bei der Basiswährung.

Beispiel: Ich habe 30% BTC obwohl ich 40% haben will. Gleichzeitig habe ich 35% USDT obwohl ich dort 45% haben will. Somit würde ich zwar den BTC-Anteil mit einer BUY-Order erhöhen und näher an das SOLL bringen, gleichzeitig würde ich meinen USDT-Teil deutlich verringern und noch weiter vom SOLL-Wert entfernen.

Das würde nun aber bedeuten, dass ich nur dann Coins kaufe, wenn ich mehr USDT zur Verfügung habe als ich im SOLL haben will. Damit verliere ich jedoch den Grundgedanken des „Ausbalancierens“, denn zum Ausbalancieren gehört auch dazu, dass ich im Zweifel gleiche Abweichungen über alle Coins und Basiswährungen habe.

Dies wiederum ist unlogisch, denn ich kann nicht bei allen Coins unter dem SOLL liegen, irgendein Coin muss zwangsläufig über dem SOLL liegen. Dennoch führt die Vereinfachung des Grundgedankens zum zweiten Gedanken:

$__balanceBot_basecurrency['deviation_percentage'] enthält die prozentuale Abweichung von IST und SOLL des Basiswährungs-Anteils vom Coin-Gesamtwert (z.B. USDT oder ETH)

Gedanke 2: Wenn die IST/SOLL-Abweichung des Coins GLEICH der IST/SOLL-Abweichung der Basiswährung ist, muss NICHT ausbalanciert werden, ansonsten wird ausbalanciert:

... if ($__balanceBot_coins[$key]['deviation_percentage'] > $__balanceBot_basecurrency['deviation_percentage']) then SELL Coin
... if ($__balanceBot_coins[$key]['deviation_percentage'] < $__balanceBot_basecurrency['deviation_percentage']) then BUY Coin

Neues Problem: Jede kleinste Abweichung von 0,01 USDT führt zu einer Order mit 10 USDT Mindestvolumen, die eine viel größere IST/SOLL-Abweichung zur Folge haben wird. Das Gesamtsystem würde in Schwingung geraten und immer wieder verkaufen und kaufen und verkaufen und kaufen – es kann sich keine Balance einstellen.

Es muss also eine „Bremse“ eingefügt werden, die verhindert, dass jede kleinste Abweichung direkt ausgeglichen wird und unnötig Tradinggebühren verbrannt werden.

$__balanceBot_coins[$key]['tolerance_factor'] enthält die tolerierte prozentuale Abweichung.

Gedanke 3: Wenn die Abweichung des Coins und die Abweichung der Basiswährung tolerierbar sind, wird NICHT ausbalanciert, ansonsten wird ausbalanciert:

... if ($__balanceBot_coins[$key]['deviation_percentage']+$__balanceBot_coins[$key]['tolerance_factor']/100 > $__balanceBot_basecurrency['deviation_percentage']) then SELL Coin
... if ($__balanceBot_coins[$key]['deviation_percentage']-$__balanceBot_coins[$key]['tolerance_factor']/100 < $__balanceBot_basecurrency['deviation_percentage']) then BUY Coin

Bevor wir also nun eine SELL-Order platzieren prüfen wir ob die Abweichung groß genug ist – wir erhöhen die Abweichung künstlich um diesen tolerance_factor. Normalerweise werden Faktoren mit einem Wert multipliziert. Da wir aber zwei Faktoren miteinander verrechnen und vergleichen addieren/subtrahieren wir.

Neues Problem: Die Toleranzschwelle liegt bei geringem Portfoliowert von 100 USDT recht hoch, fast schon zu hoch für vernünftiges Ausbalancieren. Dagegen würden noch präzisere Ermittlungen des virtuellen Bestandes nach einer möglichen Erfüllung der noch nicht angelegten Order helfen. Sicherlich, das kann man machen und sollte man sogar machen bei sehr kleinem Vermögen.
Bei größerem Vermögen fällt das aber alles gar nicht mehr ins Gewicht, daher kann man sich den Aufwand auch gleich komplett schenken. Somit gilt Gedanke 4 bei kleinem 100-USDT-Budget:

Gedanke 4: mo' money helps a lot ...


// Abschnitt index.php 12.2:
// hier durchlaufe ich die Coins nach der vorgenommenen Sortierung: Größte Abweichung zuerst
foreach ($array_coins_sorted_by_deviation as $key => $nothing){ // $nothing weil ich nur den $key brauche, nicht das Subarray.

	$already_order_deleted = 0; // Loeschmerker, falls ich für den Coin schon eine Order gelöscht habe
	
	// Abschnitt index.php 12.2.1.:
	// $__balanceBot_coins[$key]['name'] enthält den Namen des derzeit bearbeiteten Coins.
	//
	// $__balanceBot_coins[$key]['deviation_percentage'] enthält die prozentuale Abweichung von IST und SOLL-Wert des Coin-Anteils vom Coin-Gesamtwert
	// Gedanke 1: Wenn es KEINE Abweichung von IST und SOLL gibt, muss NICHT ausbalanciert werden, ansonsten wird ausbalanciert:
	// ... if ($__balanceBot_coins[$key]['deviation_percentage'] > 1) then SELL Coin
	// ... if ($__balanceBot_coins[$key]['deviation_percentage'] < 1) then BUY Coin
	// Neues Problem: Ein BUY ist unsinnig wenn meine Basiswährung ebenfalls unter dem SOLL-Wert liegt, dadurch vergrößere ich meine Abweichung bei der Basiswährung.
	//
	// $__balanceBot_basecurrency['deviation_percentage'] enthält die prozentuale Abweichung von IST und SOLL des Basiswährungs-Anteils vom Coin-Gesamtwert
	// Gedanke 2: Wenn die IST/SOLL-Abweichung des Coins GLEICH der IST/SOLL-Abweichung der Basiswährung ist, muss NICHT ausbalanciert werden, ansonsten wird ausbalanciert:
	// ... if ($__balanceBot_coins[$key]['deviation_percentage'] > $__balanceBot_basecurrency['deviation_percentage']) then SELL Coin
	// ... if ($__balanceBot_coins[$key]['deviation_percentage'] < $__balanceBot_basecurrency['deviation_percentage']) then BUY Coin
	// Neues Problem: Jede kleinste Abweichung von 0,01 USDT führt zu einer Order mit 10 USDT Mindestvolumen, 
	// die eine viel größere IST/SOLL-Abweichung zur Folge haben wird.
	//
	// $__balanceBot_coins[$key]['tolerance_factor'] enthält die tolerierte prozentuale Abweichung.
	// Gedanke 3: Wenn die Abweichung des Coins und die Abweichung der Basiswährung tolerierbar sind, wird NICHT ausbalanciert, ansonsten wird ausbalanciert:
	// ... if ($__balanceBot_coins[$key]['deviation_percentage']+$__balanceBot_coins[$key]['tolerance_factor']/100 > $__balanceBot_basecurrency['deviation_percentage']) then SELL Coin
	// ... if ($__balanceBot_coins[$key]['deviation_percentage']-$__balanceBot_coins[$key]['tolerance_factor']/100 < $__balanceBot_basecurrency['deviation_percentage']) then BUY Coin
	// Neues Problem: Die Toleranzschwelle liegt bei geringem Portfoliowert von 100 USDT recht hoch, fast schon zu hoch für vernünftiges Ausbalancieren
	//
	// Gedanke 4: mo' money helps a lot ...
	
	$message = "BALANCE SELL: ".$__balanceBot_coins[$key]['name']." ".round($__balanceBot_coins[$key]['deviation_percentage'],2)."-".($__balanceBot_coins[$key]['tolerance_factor']/100)."  = ".round($__balanceBot_coins[$key]['deviation_percentage']-$__balanceBot_coins[$key]['tolerance_factor']/100,2)." > ".round($__balanceBot_basecurrency['deviation_percentage'],2)." ";
	if ($__balanceBot_coins[$key]['deviation_percentage'] - $__balanceBot_coins[$key]['tolerance_factor']/100 <= $__balanceBot_basecurrency['deviation_percentage']){
		$message .= " => do nothing";
		update_messages($message); // Message in DB schreiben und ausgeben.
	} else { // ... die Abweichung des Coins ist > der Abweichung der Basiswährung

		$message .= " => SELL ... ";
		update_messages($message); // Message in DB schreiben und ausgeben.

		// Abschnitt index.php 12.2.1.1.:
		// (Platzhalter)
		
		// Abschnitt index.php 12.2.1.2.:
		// (Platzhalter)
			
	}
	
	
	// Abschnitt index.php 12.2.2.:
	// Beispielwert: BTC-Deviation 0,3 + (10/100) > 0,6 ist ok - ansonsten: Das führt zum BUY der BTC
	$message = "BALANCE BUY: ".$__balanceBot_coins[$key]['name']." ".round($__balanceBot_coins[$key]['deviation_percentage'],2)."+".($__balanceBot_coins[$key]['tolerance_factor']/100)."  = ".round($__balanceBot_coins[$key]['deviation_percentage']+$__balanceBot_coins[$key]['tolerance_factor']/100,2)."  < ".round($__balanceBot_basecurrency['deviation_percentage'],2)." ";
	if ($__balanceBot_coins[$key]['deviation_percentage'] + $__balanceBot_coins[$key]['tolerance_factor']/100 >= $__balanceBot_basecurrency['deviation_percentage']){
		$message .= " => do nothing";
		update_messages($message); // Message in DB schreiben und ausgeben.
	} else { // ... die Abweichung des Coins ist < der Abweichung der Basiswährung
		$message .= " => BUY ... ";
		update_messages($message); // Message in DB schreiben und ausgeben.

		// Abschnitt index.php 12.2.2.1.:
		// (Platzhalter)	

		// Abschnitt index.php 12.2.2.2.:
		// (Platzhalter)
			
	}
	
}

 

Diesen Code könnt Ihr an dieser Stelle bereits ausgiebig testen, das Logfile sagt Euch ob der Bot kaufen oder verkaufen würde. Wenn Ihr zudem manuell Euren Bestand durch Trades bei Binance ändert, könnt Ihr die Auswirkungen sehen wie der Bot versucht die Balance wieder herzustellen.

Um Trading-Gebühren zu vermeiden könnt Ihr auch an dem Parameter „target_percentage“ in der config.php drehen um unterschiedliche Szenarien auszutesten.

 

3. mögliche Buy-Order löschen

Wenn der Bot nun feststellt, dass es sinnvoll ist eine SELL-Order anzulegen, dann macht das doch nur Sinn, dass er erstmal prüft ob auf der Gegenseite bereits eine BUY-Order vorhanden ist.

Sollte eine BUY-Order vorliegen, kann das Gleichgewicht auch durch dessen Löschung verbessert werden. Sollte doch eine SELL-Order nötig sein, kann er das im nächsten Durchlauf immer noch machen.

Wir erinnern uns also, dass wir in einer vorherigen Lektion das Array „$array_binance_openOrders“ mit allen offenen Order für jeden Coin angelegt hatten.

Dieses Array durchlaufen wir für unseren derzeit zu bearbeitenden Coin und suchen eine BUY-Order, die wir löschen können. Da wir je Durchlauf und je Coin nur eine Order löschen wollen setzen wir uns den Merker „$already_order_deleted“ falls wir eine Order erfolgreich gelöscht haben.

Der Rest ist easy ... die gefundene Order wird mit dem API-Call „cancel“ aus dem Orderbuch entfernt und wenn das Entfernen erfolgreich war, dann aktualisieren wir erstmal unseren Balances mit „update_accountinfo()“ (es gibt nun neue Werte für „locked“ und „free“).
Danach aktualisieren wir das Array für die offenen Order (es gibt nun eine weniger)
Und zum Schluss lassen wir unseren Gesamtstatus neu berechnen mit „update_status()“ damit wir für den nächsten Coindurchlauf wieder ordentliche Ausgangsdaten haben.


		// Abschnitt index.php 12.2.1.1.:
		// Bevor wir eine neue SELL-Order anlegen, suchen wir eine vorhandene BUY-order und löschen die einfach mal aus dem Orderbuch raus.
		// Dabei ist uns jetzt erstmal egal wie weit weg die Order vom aktuellen Kurs ist oder was für ein Trade-Volumen die hat.
		foreach ($array_binance_openOrders[$__balanceBot_coins[$key]['name']] as $array_openOrder){
			if ($array_openOrder['side'] == "BUY" AND $already_order_deleted == 0){

				$message = " ... Order zum Löschen gefunden!  ";

				$result_binance_cancel = $binance_api_handler->cancel($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name'], $array_openOrder["orderId"]);

				if ($result_binance_cancel['code']){
					$message .= "Binance-API-Call-ERROR ".$result_binance_cancel['code'].": ".$result_binance_cancel['msg']." ";
					update_messages($message); // Message in DB schreiben und ausgeben.
				} else {
					$message .= " ... gelöscht.";
					update_messages($message); // Message in DB schreiben und ausgeben.
					$already_order_deleted = 1; // Löschmerker auf 1 setzen damit ich nicht noch mehr Order weglösche

					// nachdem sich nun was an den offenen Order getan hat, aktualisieren wir unseren Status.
					// zuerst laden wir unsere neuen Accountinfo, dann alle offenen Order zu dem aktuell bearbeiteten Coin und dann aktualisieren wir den Status	
					update_accountinfo();			
					$array_binance_openOrders[$__balanceBot_coins[$key]['name']] = $binance_api_handler->openOrders($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']);
					update_status(); 

				}

			}
		}	

 

4. mögliche Sell-Order löschen
 

Dasselbe machen wir auch für offene SELL-Order wenn der Bot feststellt, dass eine BUY-Order ganz sinnvoll wäre:


		// Abschnitt index.php 12.2.2.1.:
		// Bevor wir eine neue SELL-Order anlegen, suchen wir eine vorhandene BUY-order und löschen die einfach mal aus dem Orderbuch raus.
		// Dabei ist uns jetzt erstmal egal wie weit weg die Order vom aktuellen Kurs ist oder was für ein Trade-Volumen die hat.
		foreach ($array_binance_openOrders[$__balanceBot_coins[$key]['name']] as $array_openOrder){
			if ($array_openOrder['side'] == "SELL" AND $already_order_deleted == 0){

				$message = " Order zum Löschen gefunden!  ";

				$result_binance_cancel = $binance_api_handler->cancel($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name'], $array_openOrder["orderId"]);

				if ($result_binance_cancel['code']){
					$message .= "Binance-API-Call-ERROR ".$result_binance_cancel['code'].": ".$result_binance_cancel['msg']." ";
					update_messages($message); // Message in DB schreiben und ausgeben.
				} else {
					$message .= " ... gelöscht.";
					update_messages($message); // Message in DB schreiben und ausgeben.
					$already_order_deleted = 1; // Löschmerker auf 1 setzen damit ich nicht noch mehr Order weglösche

					// nachdem sich nun was an den offenen Order getan hat, aktualisieren wir unseren Status.
					// zuerst laden wir unsere neuen Accountinfo, dann alle offenen Order zu dem aktuell bearbeiteten Coin und dann aktualisieren wir den Status	
					update_accountinfo();			
					$array_binance_openOrders[$__balanceBot_coins[$key]['name']] = $binance_api_handler->openOrders($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']);
					update_status(); 
				
				}

			}
		}	

5. Sell-Order anlegen

Sollten wir keine BUY-Order zum Löschen gefunden haben, dann legen wir eben eine SELL-Order an.

Wir stellen also erstmal fest ob der Merker „$already_order_deleted“ NICHT (das ist das Ausrufezeichen davor) gesetzt ist und dann geht’s los.

Wir beginnen damit den Verkaufspreis zu ermitteln, dazu sehe ich es als sinnvoll den Mittelwert aus aktuellem Preis und 24-Hoch zu nehmen. Bei „relativ“ niedrigem Kurs ist der SELL-Preis somit weit genug weg und bei „relativ“ hohem Kurs ist der SELL-Preis nah dran ... was hoch ist wird tendenziell eher fallen als weiter steigen.

Als Nächstes ermitteln wir die Menge, die wir verkaufen wollen. Dafür haben wir in der config.php den „$__trading_factor“ definiert (z.B. 0,1) Es wird also der Coin-Gesamtwert und der Wert der Basiswährung zum Gesamt-Portfoliowert addiert und davon werden 0,1% als Tradingvolumen (in USDT) getradet. Dieses Volumen teilen wir durch den eben ermittelten Preis um die Anzahl der Coins zu erhalten, die getradet werden sollen (und dann wird das noch gerundet)

Danach müssen wir feststellen ob die ermittelte Menge überhaupt den Tradingrules entspricht. Notfalls muss die Menge hochgesetzt werden auf das Mindesttrading-Volumen (bei Binance 10 USDT)

Nun nur noch das „$symbol“ aus Coin-Namen und dem Namen der Basiswährung zusammen setzen und sagen, dass es eine SELL-Order werden soll.

 


		// Abschnitt index.php 12.2.1.2.:
		// falls ich nix zum Löschen gefunden hab, muss ich eine neue Order anlegen
		if (!$already_order_deleted){


			// Der Preis kann auch aus dem Mittelwert von aktuellem Kurs und dem Min (buy) oder Max (sell) gebildet werden.
			// Das hat den Vorteil, dass Order, die nahe dem unteren Minimum sind nahe am aktuellen Kurs eingestellt werden und 
			// Order, die weit weg vom unteren Minimum mit entsprechend weit entferntem Kurs eingestellt werden, damit lässt sich der Ertrag
			// verbessern, denn das Ganze ist eh "langfristig".
			$price = round(($__balanceBot_coins[$key]['price']+$__balanceBot_coins[$key]['price_24_high'])/2,$__balanceBot_coins[$key]['tickSizePrecision']);
			
			// die Menge ergibt sich aus dem Gesamt-Portfoliowert und dem trading_factor
			$amount = round(($sum_coin_value + $__balanceBot_basecurrency['virtual_balance']) * $__trading_factor/100 / $price,$__balanceBot_coins[$key]['minQtyPrecision']);
			
			// Der Minimum-Betrag darf natürlich nicht unterschritten werden
			// das "+ $__balanceBot_coins[$key]['minQty']" ist dazu da um Abrundungen zu vermeiden
			$min_amount = round($__balanceBot_coins[$key]['minNotional'] / $price, $__balanceBot_coins[$key]['minQtyPrecision']) + $__balanceBot_coins[$key]['minQty'];
			if ($amount < $min_amount) $amount = $min_amount;			
			
			$symbol = $__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name'];
			$side = "SELL";
		
			// mit number_format stelle ich sicher, dass cih keine "2.4E-5" anstatt "0.00025" angezeigt bekomme
			$message = " ... Erstelle Order: $side ".number_format($amount, $__balanceBot_coins[$key]['minQtyPrecision'], '.', '')." @ $price $market (aktueller Kurs: ".$__balanceBot_coins[$key]['price'].") ";
			update_messages($message); // Message in DB schreiben und ausgeben.

			// Abschnitt index.php 12.2.1.2.1:
			// (Platzhalter)
		}

 

Das kann man sich schonmal wieder in der Ausgabe anschauen, denn der Bot gibt eindeutig aus wie er die Order anlegen würde. Es lohnt sich diese Werte selber nachzurechnen und zu überlegen ob er das tut was sinnvoll ist.

Bevor wir eine Order zu Binance senden obwohl wir nicht genug Coins zum Verkaufen haben ist nicht die feine Art – also fügen wir noch eine Prüfung durch ob überhaupt genug Coins da („free“) sind:


			// Abschnitt index.php 12.2.1.2.1:
			// prüfen ob ich überhaupt genug Coins zur Verfügung habe
			if ($__balanceBot_coins[$key]['free'] > $amount){
				// Im oberen Abschnitt haben wir die Funktion "create_order()" deklariert.
				create_order($side, $symbol, $amount, $price);

				// nachdem sich nun was an den offenen Order getan hat, aktualisieren wir unseren Status.
				// zuerst laden wir unsere neuen Accountinfo, dann alle offenen Order zu dem aktuell bearbeiteten Coin und dann aktualisieren wir den Status	
				update_accountinfo();			
				$array_binance_openOrders[$__balanceBot_coins[$key]['name']] = $binance_api_handler->openOrders($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']);
				update_status(); 

			} else {
				$message = " ... FEHLER: Nicht genug frei verfügbare ".$__balanceBot_coins[$key]['name']." vorhanden";
				update_messages($message); // Message in DB schreiben und ausgeben.
			}

 

Wenn wir genug Coins haben, legen wir die Order an und wir aktualisieren wieder unsere Balance, holen nun alle offenen Order ab und aktualisieren unseren Status.

That’s it 🙂


6. Buy-Order anlegen

Dasselbe Machen wir nun auch mit der BUY-Order, nur ein wenig auf „BUY“ angepasst.

 


		// Abschnitt index.php 12.2.2.2.:
		// falls ich nix zum Löschen gefunden hab, muss ich eine neue Order anlegen
		if (!$already_order_deleted){


			// Der Preis kann auch aus dem Mittelwert von aktuellem Kurs und dem Min (buy) oder Max (sell) gebildet werden.
			// Das hat den Vorteil, dass Order, die nahe dem unteren Minimum sind nahe am aktuellen Kurs eingestellt werden und 
			// Order, die weit weg vom unteren Minimum mit entsprechend weit entferntem Kurs eingestellt werden, damit lässt sich der Ertrag
			// verbessern, denn das Ganze ist eh "langfristig".
			$price = round(($__balanceBot_coins[$key]['price']+$__balanceBot_coins[$key]['price_24_low'])/2,$__balanceBot_coins[$key]['tickSizePrecision']);
			
			// die Menge ergibt sich aus dem Gesamt-Portfoliowert und dem trading_factor
			$amount = round(($sum_coin_value + $__balanceBot_basecurrency['virtual_balance']) * $__trading_factor/100 / $price,$__balanceBot_coins[$key]['minQtyPrecision']);
			
			// Der Minimum-Betrag darf natürlich nicht unterschritten werden
			// das "+ $__balanceBot_coins[$key]['minQty']" ist dazu da um Abrundungen zu vermeiden
			$min_amount = round($__balanceBot_coins[$key]['minNotional'] / $price, $__balanceBot_coins[$key]['minQtyPrecision']) + $__balanceBot_coins[$key]['minQty'];
			if ($amount < $min_amount) $amount = $min_amount;			

			$symbol = $__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name'];
			$side = "BUY";

			$message = " ... Erstelle Order: $side ".number_format($amount, $__balanceBot_coins[$key]['minQtyPrecision'], '.', '')." @ $price $market (aktueller Kurs: ".$__balanceBot_coins[$key]['price'].") ";
			update_messages($message); // Message in DB schreiben und ausgeben.

			// Abschnitt index.php 12.2.2.2.1.:
			// (Platzhalter)
		
		}			
	

 

Und noch die Prüfung ob wir genug Basiswährung zur Verfügung haben:


			// Abschnitt index.php 12.2.2.2.1.:
			// prüfen ob ich überhaupt genug Basiswährung zur Verfügung habe
			if ($__balanceBot_basecurrency['free'] > $price * $amount){
				// Im oberen Abschnitt haben wir die Funktion "create_order()" deklariert.
				create_order($side, $symbol, $amount, $price);


				// nachdem sich nun was an den offenen Order getan hat, aktualisieren wir unseren Status.
				// zuerst laden wir unsere neuen Accountinfo, dann alle offenen Order zu dem aktuell bearbeiteten Coin und dann aktualisieren wir den Status	
				update_accountinfo();			
				$array_binance_openOrders[$__balanceBot_coins[$key]['name']] = $binance_api_handler->openOrders($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']);
				update_status(); 

			} else {
				$message = "FEHLER: Nicht genug ".$__balanceBot_basecurrency['name']." vorhanden (benötigt: ".($price * $amount).") ";
				update_messages($message); // Message in DB schreiben und ausgeben.
			}

 

7. Veraltete Order löschen

Nun sind wir auch schon fast am Ende unseres Bots und müssen uns nur noch darum kümmern, dass zu alte unerfüllte Order wieder aus dem Orderbuch genommen werden
Man kann hier beliebig strategisch vorgehen, dass zuerst Order entfernt werden, die am Weitesten vom aktuellen Kurs entfernt sind, jedoch halten wir es für den Anfang sehr einfach und löschen Order, die älter als eine gewisse Anzahl an Stunden sind ($__max_orderAge)


// Abschnitt index.php 13: 
// wieder arbeiten wir jeden zu verwaltenden Coin ab:
foreach ($__balanceBot_coins as $key => $array_coin){

	// und für jeden Coin arbeiten wir dessen offene Order ab
	foreach ($array_binance_openOrders[$array_coin['name']] as $array_openOrder){
			
		// Der Zeitstempel wann die Order das letzte Mal aktualisiert wurde (z.B. durch Teilverkauf) is in Millisekuden angegeben.
		// 1 Millisekunde = 1 Stunde / 1000 / 60 / 60
		// Das Alter berechne ich aus dem aktuellen Zeitstempel
		$array_openOrder['ageInHours'] = (Time() - $array_openOrder['updateTime'] / 1000) / 60 / 60;
			
		if ($array_openOrder['ageInHours'] > $__max_orderAge){

			$message = " Veraltete Order zum Löschen gefunden!  ";

			$result_binance_cancel = $binance_api_handler->cancel($array_coin['name'].$__balanceBot_basecurrency['name'], $array_openOrder["orderId"]);

			if ($result_binance_cancel['code']){
				$message .= "Binance-API-Call-ERROR ".$result_binance_cancel['code'].": ".$result_binance_cancel['msg']." ";
			} else {
				$message .= " ... gelöscht.";
			}
			update_messages($message); // Message in DB schreiben und ausgeben.

		}
	}		

}

 

Ja, und das war’s dann auch schon fast – wir haben nun den gesamten Code des Bots fertig und der kann nun losrennen.

Er ist jedoch noch nicht scharf geschaltet, das werden wir dann in der Lektion 6 tun. Ich habe mich dafür entschieden die Scharfschaltung in einer eigenen Lektion unterzubringen damit jeder diese Scharfschaltung ganz bewusst mit einem zeitlichen Versatz vornimmt.

Diese Zwischenzeit solltet Ihr nutzen um mit manuellen Order zu experimentieren und die Ausgaben des Bots zu analysieren und nachzuvollziehen was der Bot macht und wie er ermittelt was zu tun ist.

Insbesondere die „vier Gedanken“ sind für viele erstmal schwer verdaulich. Es tut mir leid, einfacher schaffe ich es nicht zu erklären, eventuell kann jemand anders da nochmal unterstützen das rüber zu bringen.

Diese Strategie ist natürlich weit entfernt von der „perfekten Strategie“, aber sie ist noch weiter entfernt von der „dümmsten Strategie“ – also auf gutem Wege perfekt zu werden.

Für weitere Ideen bin ich gern offen und dieser Thread kann gern zur Diskussion der Strategie genutzt werden. Sollte es tolle Verbesserungen im Konsens geben, aktualisiere ich den Code gern nach eventuell notwendigen Tests.

 

Wirklich beeindruckend - Hut ab 👍

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb Theo Kojak:

Da fällt mir auf, dass Rot und Schwarz Verteilungen immer in Phasen kommen. Sprich, wenn ich es schaffe, diese Phasen einzuteilen, bin ich ein Schritt weiter. Ist das OK für Dich ? 

Szenario 1: "Alles Zufall"
Dem Zufall ist es vollkommen egal welche Farben in der Vergangenheit gekommen sind. Die Wahrscheinlichkeit für rot oder schwarz ist grundsätzlich mit jedem neuen Dreh dieselbe.
Somit bist Du überhaupt keinen Schritt weiter - DU kennst die Vergangenheit, aber sie nützt Dir nichts um Vorhersagen für die Zukunft zu treffen.

Szenario 2: "Magnet unterm Tisch"
Der Magnet mag dem Zufall Einhalt zu gebieten - aber glaub man nicht, dass Du daraus einen Vorteil ziehen kannst. Der Magnet ist nicht dazu da die Gewinne bei den Spielern zu maximieren, sondern die Gewinne der Bank. Und schon gar nicht werden Systemspieler begünstigt.

 

Sorry, aber der Vergleich mit dem Roulette ist zum Scheitern verurteilt.

Gleiches gilt übrigens für den Kryptomarkt. Niemand kann heute wissen in welche Richtung der morgige Markt läuft. Vielleicht kommen morgen Bad News und alles geht krachen - oder Good News und es geht rauf - oder ein FatFinger haut in ein Orderbuch rein.

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Also nehme ich die letzten 20 Würfe und teil die ein. Sprich es gibt ca. drei Phasen, ungefähr gleich verteilt, bedeutet, rot/schwarz ungefähr gleich, mehr rot als schwarz und mehr schwarz als rot. Stimmst Du mir da überein ? Diese Einteilung kann ich durch den z-Score bestimmen.

Solche Einteilungen sehe ich auf einen Blick. Dafür brauche ich natürlich keinen z-Score. Habe aber längst verstanden, dass man solche auch beim Trading mit z-Score finden kann, wo es vielleicht nicht so offensichtlich ist. Einen Blick in die Zukunft erlaubt das aber trotzdem nicht, behaupte ich mal. Als Anhaltspunkt wohin die Reise vielleicht geht, könnte es nützlich sein, mal sehen.

Aber ich denke, du hast genug erklärt. Mehr willst du ja eh nicht preisgeben, und was die Vergleiche mit Roulette angeht, da muss ich Jokin recht geben: Du hast davon keine Ahnung, beschäftige dich besser mit was anderem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich finde es schade, dass die Diskussion emotional wird. Wäre schön, wenn wir auf der sachlichen Ebene bleiben könnten.

Und Theo hat wirklich schon genügend erklärt, dass man eigene Experimente starten kann.

Nach den bisherigen Erläuterungen bin ich auch gerne bereit, Theo zu glauben, dass seine Methode funktioniert.

Die einzige ernsthafte Schwierigkeit, die man IMHO überwinden muss, ist, die Verluste beim Umschwung des Marktes klein genug zu halten, d.h. einen passenden Zwischenwert zwischen zu früh und zu spät auszuwählen. Dazu kann man aber Testreihen fahren.
Und im Gutfall vermutlich eine stärke Progression wählen als simples Martingale-Verdoppeln, denn egal, wieviele Verdoppelungsstufen man durchläuft, am Ende bekommt man beim Verdoppeln nur den einfachen Einsatz als Gewinn zurück. Aufgrund der Testreihen kann ich ja ausrechnen, welche Progressionsstärke mir einen vernünftigen Mittelwert zwischen Maximieren des Ertrags und Minimieren des Verlustes gibt.

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.