Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 4)


Empfohlene Beiträge

Hallo zusammen,

nach der dritten Lektion (https://coinforum.de/topic/16020-workshop-wir-basteln-uns-einen-tradingbot-lektion-3/) geht es heute weiter, diese Punkte stehen auf dem Programm: 

1. Offene Order von Binance holen
2. Die Coinwerte der einzelnen Coins ermitteln
3. Die virtuellen Coin-Balances und die virtuelle Basiswährungs-Balance ermitteln
4. Den Coin-Gesamtwert und die Coin-Einzelwerte ermitteln
5. Den prozentualen IST-Anteil ermitteln
6. Den ganzen Kram in die Datenbank schreiben
7. Die Abweichung zwischen Soll- und IST-Anteil ermitteln
8. Den Toleranzfaktor ermitteln

1. Offene Order von Binance holen

Zuerst fragen wir Binance mal je Coin welche offenen Order vorliegen, dazu durchlaufen wir unser Array mit den Coins und erzeugen ein neues Array mit den offenen Orders.

// Abschnitt index.php 10: 
// Offene Order von Binance holen
foreach ($__balanceBot_coins as $key => $array_coin){
	$array_binance_openOrders[$array_coin['name']] = $binance_api_handler->openOrders($array_coin['name'].$__balanceBot_basecurrency['name']);
}
echo "<pre> So sehen die offenen Order aus:";
print_r($array_binance_openOrders);
echo "</pre>";

Nun könnt Ihr  bei Binance eine neue Order anlegen - bitte darauf achten, dass die Order nicht gleich ausgeführt wird, also eine BUY-Order mit unglaublich niedrigem Preis anlegen oder eine SELL-Order mit unglaublich hohem Preis.

Generell müsst Ihr nicht alle  echo/print_r/echo-Blöcke dauerhaft im Code stehen lassen – einfach mit zwei Schrägstrichen vorneweg auskommentieren damit die Ausgabe wieder übersichtlicher wird.

2. Die Coinwerte der einzelnen Coins ermitteln

Nun müssen wir für jeden zu bearbeitenden Coin die Werte aus den Offenen Order berücksichtigen, das machen wir wieder in einer Funktion:

// Abschnitt index.php 6: 
// wann immer sich was im Orderbuch verändert, soll der Status aktualisiert werden, das machen wir auch am Besten in einer Funktion
function update_status(){

	global $__balanceBot_coins; 				// der Status steht in unserem "Master"-Array zusammen mit allen anderen Daten
	global $__balanceBot_basecurrency;			// und auch das Array mit der Basiswährung brauchen wir hier in der Funktion
	global $array_binance_openOrders; 			// auch die offenen Order müssen wir hier in der Funktion zugänglich machen
	global $sum_coin_value; 					// hier wird später der Coin-Gesamtwert drin stehen
	global $array_coins_sorted_by_deviation;	// Nach Abweichung abwärts sortiert entsteht später eine Priorität der Abarbeitung

	$sum_coin_value = 0;	// mit jedem Update ermitteln wir die Summe aller Coins auf's Neue
	$__balanceBot_basecurrency['virtual_balance'] = 0; // auch diese Summe ermitteln wir mit jedem Durchlauf auf's Neue.
												// Die "virtual_balance" ist die Balance, die nach Erfüllung aller offenen 
												// Order vorhanden wäre - darauf bauen wir unseren Status auf.
												// die gibt es für die Basiswährung und für jeden Coin.
	
	foreach ($__balanceBot_coins as $key => $array_coin){

		$__balanceBot_coins[$key]['virtual_balance'] = 0; // und auch je Coin mit jedem Funktions-Aufruf die Summe auf's Neue ermitteln.
	
		// Abschnitt index.php 6.1:
		// Platzhalter
	
		// nachdem für den Coin alle offenen Order abgearbeitet sind, assieren wir die "free"-Coins zur virtuellen Balance:
		$__balanceBot_coins[$key]['virtual_balance'] += $__balanceBot_coins[$key]['free'];
	}
	
	// nachdem nun alle offenen Order aller Coins abgearbeitet sind, addieren wir die "free"-Coins der Basis-Währung zur virtuellen Balance (Teil 4)
	$__balanceBot_basecurrency['virtual_balance'] += $__balanceBot_basecurrency['free'];

	// Abschnitt index.php 6.2:
	// Platzhalter

	// Abschnitt index.php 6.3:
	// Platzhalter

	// Abschnitt index.php 6.4:
	// Platzhalter

	// Abschnitt index.php 6.5:
	// Platzhalter

	// Abschnitt index.php 6.6:
	// Platzhalter
}

... in dieser Funktion fangen wir damit an, dass wir die „free“-Coins zu unserer „virtuellen Balance“ hinzurechnen, die gehören zweifelsfrei dazu.

Und auch diese Funktion müssen wir mal wieder aufrufen und am Ende anschauen wie das Ergebnis aussieht:

// Abschnitt index.php 12: 
// nachdem wir alle offenen Order geladen haben können wir den Status für jeden Coin aktualisieren
update_status(); 

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

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

Nun sehen wir die Werte für "free", "locked" und "virtual_balance". Ist eine SELL-Order vorhanden, dann sehen wir einen Wert für "locked". Die "virtual_balance" entspricht der Summe aus "free" und "locked".

3. Die virtuellen Coin-Balances und die virtuellen Basiswährungs-Balance ermitteln

Zu unserer virtuellen Balance wollen wir aber auch noch die Coins hinzurechnen, die nach Erfüllung der offenen Order unsere reale Balance verändern werden.

		// Abschnitt index.php 6.1:
		// nun müssen wir für jede Order entweder den Bestand der Basiswährung oder den Bestand der Coins erhöhen.
		// Dazu durchlaufen wir alle offenen Order mal wieder in einer foreach-Schleife:
		foreach ($array_binance_openOrders[$array_coin['name']] as $array_openOrder){
			if ($array_openOrder['side'] == "SELL"){
				// wenn SELL, dann Basis-Währung um den Wert der dann verkauften Coins erhöhen
				// "origQty" ist die ursprüngliche Ordermenge und "executedQty" ist das was bereits ausgeführt wurde, das ziehen wir ab, denn deren Verkauf passierte bereits.
				$__balanceBot_basecurrency['virtual_balance'] += ($array_openOrder['origQty'] - $array_openOrder['executedQty']) * $array_openOrder['price'];	
			}
		
			if ($array_openOrder['side'] == "BUY"){
				// wenn BUY, dann Basis-Währung um den Wert der dann verkauften Coins erhöhen
				// "origQty" ist die ursprüngliche Ordermenge und "executedQty" ist das was bereits ausgeführt wurde, das ziehen wir ab, denn deren Verkauf passierte bereits.
				$__balanceBot_coins[$key]['virtual_balance'] += ($array_openOrder['origQty'] - $array_openOrder['executedQty']);	
			}
		
			// Jede offene Order geben wir auch im MessageLog aus - wir wollen die ja stets im Blick haben
			$message = "OPENORDER: ".$array_openOrder['side']." ".$array_openOrder['symbol']." ".($array_openOrder['origQty'] - $array_openOrder['executedQty'])." @ ".$array_openOrder['price']."";
			update_messages($message); // Message in DB schreiben und ausgeben.
		}

Wenn für den Coin eine offene BUY-Order vorhanden ist, ist der Wert für die "virtual_balance" größer als die Summe aus "free" und "locked".

... wie schon in den Kommentaren aufgenommen:
Bei SELL-Order erhöhen wir die „virtual_balance“ der Basiswährung wie sie sich nach dem Verkauf eben erhöhen würde.
Die dann verkauften Coins sind schon von unserer „virtual_balance“ abgezogen, da sie im Wert „locked“ stehen und wir diesen hier ignorieren.

Bei BUY-Order erhöhen wir den Coin-Bestand wie er nach dem Kauf erhöht werden würde.

Dabei berücksichtigen wir stets die „origQty“, also die ursprüngliche Anzahl der zu tradenden Coins und die bereits ausgeführten Teil-Trades „executedQty“, da nicht jede Order immer vollständig erfüllt wird.

4. Den Coin-Gesamtwert und die Coin-Einzelwerte ermitteln

Um die Gesamt-„Werte“ zu ermitteln müssen wir unsere „virtuelle Balance“ lediglich mit den aktuellen Preisen multiplizieren:

	// Abschnitt index.php 6.2:
	// Und nun können wir aus der virtuellen Balance einen virtuellen Wert ermitteln um darauf aufbauend zu ermitteln ob das Portfolio korrekt ausbalanciert ist (Teil 4)
	// Wieder arbeiten wir in einer foreach-Schleife jeden Coin ab und ermitteln den Wert "virtual_value":
	foreach ($__balanceBot_coins as $key => $array_coin){
		$__balanceBot_coins[$key]['virtual_value'] = $__balanceBot_coins[$key]['virtual_balance'] * $__balanceBot_coins[$key]['price'];
	}

	// Nun möchten wir den Gesamtwert aller Coins ermitteln - auch das machen wir schon wieder in einer foreach-Schleife (Teil 4)
	foreach ($__balanceBot_coins as $key => $array_coin){
		$sum_coin_value += $__balanceBot_coins[$key]['virtual_value'];
	}

	echo "Der Gesamtwert aller Coins beträgt: ".round($sum_coin_value,2)." ".$__balanceBot_basecurrency['name']." - der Wert der Seitenlinie (Basiswährung) beträgt: ".round($__balanceBot_basecurrency['virtual_balance'],2)." ".$__balanceBot_basecurrency['name']." Gesamtportfoliowert: ".round($sum_coin_value + $__balanceBot_basecurrency['virtual_balance'],2)." ".$__balanceBot_basecurrency['name']."<br>";

	// wenn der Gesamt-Coinwert "0" beträgt, müssen wir an der Stelle nicht weitermachen, das ergibt zum Einen einen DIV/0-Fehler, andererseits 
	// macht dieses Skript überhaupt keinen Sinn mit leerem Bestand arbeiten zu lassen.
	if ($sum_coin_value == 0){
		$message = "FEHLER: Der Portfoliowert beträgt <1 - so macht der BalanceBot keinen Sinn, also bitte erstmal irgendwelche Coins aufladen, die der Bot auch verwalten soll.";
		update_messages($message); // Message in DB schreiben und ausgeben.
		exit; // Skript beenden ... macht ja nu echt keinen Sinn.
	}

 

... das machen wir für die Coin-Einzelwerte („virtual_value“) in der foreach-Schleife für jeden Coin (für den Basiscoin nicht nötig, die Multiplikation mit 1 schenken wir uns)
... wenn wir die Coin-Einzelwerte („virtual_value“) haben, summieren wir diese zum Coin-Gesamtwert ($sum_coin_value“) auf.
... das Ergebnis geben wir einmal direkt aus
... und falls der Gesamtwert 0 ist, können wir das Skript auch abbrechen – ohne Arme keine Kekse.


5. Den prozentualen IST-Anteil ermitteln

Prozentuale Anteile der Coins und der Basiswährung werden als „current_percentage“ gespeichert:

	// Abschnitt index.php 6.3:
	// Zur Bestandsaufnahme gehört es nun, dass wir sowohl für Basis-Währung als auch für jeden Coin den prozentualen Anteil am Gesamt-Coinwert ermitteln 
	foreach ($__balanceBot_coins as $key => $array_coin){
		$__balanceBot_coins[$key]['current_percentage'] = $__balanceBot_coins[$key]['virtual_value'] / $sum_coin_value * 100;
	}
	// bei der Basiswährung entspricht die Balance auch dem virtual_value - logisch ...
	$__balanceBot_basecurrency['current_percentage'] = $__balanceBot_basecurrency['virtual_balance'] / $sum_coin_value * 100;

6. Den ganzen Kram in die Datenbank schreiben

So viel Mühe gemacht, da wollen wir das Ergebnis gern in der Datenbank festhalten – und das auch gleich in CSV-Form damit wir später einfach Excel-Diagramme erstellen können.

	// Abschnitt index.php 6.4:
	// Den Bestand wollen wir nun noch in Kurzform in die Datenbank schreiben 
	// round( .... ,2) meint "runde auf 2 Stellen"
	$message = "Status: ";
	$message .= "Portfolio: ".round($__balanceBot_basecurrency['virtual_balance'] + $sum_coin_value,2)." ".$__balanceBot_basecurrency['name']."; ";
	$message .= $__balanceBot_basecurrency['name'].": ".round($__balanceBot_basecurrency['virtual_balance'],2)." Soll: ".round($__balanceBot_basecurrency['target_percentage'],2)."% Ist: ".round($__balanceBot_basecurrency['current_percentage'],2)."%; ";
	foreach ($__balanceBot_coins as $key => $array_coin){
		$message .= $__balanceBot_coins[$key]['name'].": ".round($__balanceBot_coins[$key]['virtual_value'],2)." ".$__balanceBot_basecurrency['name']." Soll: ".round($__balanceBot_coins[$key]['target_percentage'],2)."% Ist: ".round($__balanceBot_coins[$key]['current_percentage'],2)."%; ";
	}
	update_messages($message); // Message in DB schreiben und ausgeben.

	// Den Bestand wollen wir nun noch in CSV-Form in die Datenbank schreiben 
	// Das wird später nützlich sein um die Daten in Excel auszuwerten.
	$message = "; CSV; ";
	$message .= " ".round($__balanceBot_basecurrency['virtual_balance'] + $sum_coin_value,2)." ".$__balanceBot_basecurrency['name']."; ";
	$message .= $__balanceBot_basecurrency['name']."; ".round($__balanceBot_basecurrency['virtual_balance'],2)."; ".round($__balanceBot_basecurrency['target_percentage'],2)."%; ".round($__balanceBot_basecurrency['current_percentage'],2)."%; ";
	foreach ($__balanceBot_coins as $key => $array_coin){
		$message .= $__balanceBot_coins[$key]['name']."; ".round($__balanceBot_coins[$key]['virtual_value'],2)."; ".$__balanceBot_basecurrency['name']."; ".round($__balanceBot_coins[$key]['target_percentage'],2)."%; ".round($__balanceBot_coins[$key]['current_percentage'],2)."%; ";
	}
	update_messages($message); // Message in DB schreiben und ausgeben.

7. Die Abweichung zwischen prozentualem Soll- und IST-Anteil ermitteln

Wenn wir später jeden Coin durcharbeiten und entscheiden ob wir ihn verkaufen, ihn kaufen oder nix machen wollen, dann müssen wir wissen wie groß ist denn die Abweichung von IST zu SOLL.

Da jede einzelne neu erstellte Order sofort Auswirkungen auf den bestand unserer Basiswährung auf die prozentualen Verhältnisse aller Coins haben wird, kann es nur sinnvoll sein wenn wir den Coin zuerst bearbeiten, der die größte Abweichung vom Soll aufweist.

	// Abschnitt index.php 6.5:
	// Nun müssen wir mal ermitteln wie weit weg das IST vom Ziel ist, dazu bilden wir einfach einen Faktor aus SOLL (target_percentage) und IST (current_percentage)
	// Mit "deviation_percentage" führen wir einen Wert ein, der besagt:
	//   >1 -> Ich habe zu viel davon, das muss weniger werden! ... also SELL-Order erstellen oder BUY-Order löschen
	//   <1 -> Ich habe zu wenig davon, das muss mehr werden! ... also BUY-Order erstellen oder SELL-Order löschen
	foreach ($__balanceBot_coins as $key => $array_coin){
		$__balanceBot_coins[$key]['deviation_percentage'] = $__balanceBot_coins[$key]['current_percentage'] / $__balanceBot_coins[$key]['target_percentage'];
		// Hier bauen wir uns das Hilfsarray indem alle Coins absteigend nach ihrer Soll/Ist-Abweichung drin stehen werden.
		$array_coins_sorted_by_deviation[$key] = $__balanceBot_coins[$key]['deviation_percentage'];
	}
	// bei der Basiswährung machen wir das auch
	$__balanceBot_basecurrency['deviation_percentage'] = $__balanceBot_basecurrency['current_percentage'] / $__balanceBot_basecurrency['target_percentage'];

	// nun sortieren wir das Hilfsarray auch so, dass es brauchbar ist um den am heftigsten abweichenden Coin zuerst abzuarbeiten.
	arsort($array_coins_sorted_by_deviation); // siehe php manual "krsort()" .. behält den key assoziativer Arrays bei und sortiert absteigend.

	echo "<pre> Und das ist die Sortierung der Coins: <br>";
	print_r($array_coins_sorted_by_deviation);
	echo "</pre>";

8. Den Toleranzfaktor ermitteln

Der Toleranzfaktor bestimmt wie tolerant das System gegenüber einem Ungleichgewicht ist – je höher der Toleranzfaktor, desto größer muss der Kursunterschied werden damit ausbalanciert wird.

Diesen Faktor ermitteln wir dynamisch in Abhängigkeit des Coin-Gesamtwertes und der prozentualen Sollvorgaben je Coin.

	// Abschnitt index.php 6.6:
	// Der Toleranzfaktor verhindert das Schwingen des Gesamtsystems indem nicht jede 
	// kleinste Abweichung ausbalanciert wird sonder erst wenn die Abweichung groß 
	// genug ist um durch eine Order nicht sofort wieder aus der Balance zu geraten.
	foreach ($__balanceBot_coins as $key => $array_coin){
		// welchen USDT-Wert soll der Coin im ausbalancierten Zustand haben?
		$__balanceBot_coins[$key]['target_value'] = $sum_coin_value * $__balanceBot_coins[$key]['target_percentage'] / 100;
		
		// welcher Toleranz-Faktor ergibt sich daraus?
		$__balanceBot_coins[$key]['tolerance_factor'] = $__balanceBot_coins[$key]['minNotional'] / $__balanceBot_coins[$key]['target_value'] * 100;

		// eine Nachkommastelle soll genügen
		$__balanceBot_coins[$key]['tolerance_factor'] = round ($__balanceBot_coins[$key]['tolerance_factor'],1);

		if ($__balanceBot_coins[$key]['tolerance_factor'] > 50){
			$message = "WARNUNG: Toleranzfaktor für ".$__balanceBot_coins[$key]['name']." liegt über 50% bei ".$__balanceBot_coins[$key]['tolerance_factor']." ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren! ";
			update_messages($message); // Message in DB schreiben und ausgeben.		
		}
	}	
	

Zur Sicherheit geben wir eine Warnung aus, wenn ein Toleranzfaktor von über 40 ermittelt wird, das bedeutet, dass der Coin mit deutlich zu geringem Wert im Portfolio liegt und er sich mit 10-USDT-Order nicht ausbalancieren lässt.

Damit haben wir nun
- den Webserver am Laufen (Lektion 1)
- die Datenbank  am Laufen (Lektion 2)
- die Binance-API aufgesetzt und unsere Bestände ermittelt (Lektion 3)
- und wir haben unsere Parameter zu jedem Coin ermittelt (Lektion 4).

In der Lektion 5 werden anhand einer Strategie entscheiden ob und wieviele Coins wir zu welchem Preis kaufen oder verkaufen wollen damit das Gleichgewicht dichter an die Sollwert-Vorgaben kommt.

 

 

 

 

 

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

  • 2 Wochen später...
Am 10.1.2019 um 21:08 schrieb Jokin:

foreach ($__balanceBot_coins as $key => $array_coin){ /* ... */ }

 

Bin noch nicht dahinter gekommen, was es genau mit dem $key und $array_coin auf sich hat.

Ist $key vielleicht der Index 0 bis Anzahl Coins (als Zahl)?
Und $array_coin ist dann das konkrete Coin-Array bei $__balanceBot_coins[$key], also z.B. bei $__balanceBot_coins[0] der erste Coin?

Aber das scheint mir nicht logisch, denn manchmal erscheint $array_coin auch nur im Schleifenkopf und wird in der Schleife nicht mehr verwendet.
Aber wozu dient es dann?

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

1 hour ago, Herr Coiner said:

Bin noch nicht dahinter gekommen, was es genau mit dem $key und $array_coin auf sich hat.

Aus https://www.php-einfach.de/php-tutorial/php-array/foreach-schleife/

Die foreach-Schleife funktioniert ebenfalls bei assoziativen Arrays. Dort können wir sogar zusätzlich angeben, dass wir den Schlüssel des assoziativen Arrays ebenfalls als Variable abspeichern möchten:

<?php
$mitarbeiter = array("Klaus" => "Müller", "Bob" => "Baumeister");

foreach($mitarbeiter AS $vorname => $nachname) {
 echo "$vorname $nachname <br>";
}
?>

Statt foreach($array AS $value) können wir (müssen aber nicht) bei assoziativen Arrays die foreach-Schleife als foreach($array AS $key => $value) schreiben. In dem Fall wird der Schlüssel des assoziativem Arrays in der Variable $key  und der zugewiesene Wert in der Variable $value  im Schleifenrumpf hinterlegt. Im obigen Fall ist also in der Variable $vorname  der entsprechende Vorname, und in der Variable $nachname  der entsprechende Nachname hinterlegt.

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Herr Coiner:

Bin noch nicht dahinter gekommen, was es genau mit dem $key und $array_coin auf sich hat.

PeWi antwortete schon ... nur als Ergänzung:

Lass Dir mit

echo $key;

einfach den Inhalt der Variable ausgeben 🙂

Link zu diesem Kommentar
Auf anderen Seiten teilen

		update_messages($message); // Message in DB schreiben und ausgeben.
		exit; // Skript beenden ... macht ja nu echt keinen Sinn.

Oha, jetzt sind wir pleite ;).

Meine Standfunktion für fatales Fehlerhandling ist "ShitHappend(reason){...}" :lol:

 

@Jokin: Es gibt noch einen kleinen Copy/Paste-Fehler: Im Kommentar dürfte es wohl nicht "Basis-Währung" heißen. Es wird ja die 'virtual_balance' vom Coin erhöht:

Am 10.1.2019 um 21:08 schrieb Jokin:

 

 


		// Abschnitt index.php 6.1:
		
			if ($array_openOrder['side'] == "BUY"){
				// wenn BUY, dann Basis-Währung um den Wert der dann verkauften Coins erhöhen [...]
				$__balanceBot_coins[$key]['virtual_balance'] += ($array_openOrder['origQty'] - $array_openOrder['executedQty']);	
			}

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 35 Minuten schrieb Jokin:

PeWi antwortete schon ... nur als Ergänzung:

Lass Dir mit

echo $key;

einfach den Inhalt der Variable ausgeben 🙂

Ja, Dank PeWi ist es jetzt klar. Ausgeben lassen geht aber nicht, ich hab' kein PHP auf dem Rechner, bin nur in Go unterwegs und muss halt den PHP-Code soweit verstehen, dass ich ihn in nachprogrammieren kann.

Gut, das du alles so ausführlich notiert hast :). Da kommen wenig Zweifel auf, nur das mit dem $key hatte mich etwas verwirrt.

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Minuten schrieb Herr Coiner:

@Jokin: Es gibt noch einen kleinen Copy/Paste-Fehler: Im Kommentar dürfte es wohl nicht "Basis-Währung" heißen. Es wird ja die 'virtual_balance' vom Coin erhöht:

Ja, da hast Du absolut recht - das ist ein Copy-Paste-Fehler im Kommentar 😞

Hab mir den Code nochmal angeschaut - der passt jedoch. Auch, dass lediglich addiert wird. Das Abziehen macht Binance für uns über den Split "free" und "locked".

... diese Eigenart von Binance hat natürlich zur Folge, dass das auf andere Exchanges nicht einfach übertragbar ist, sondern da muss man jede offene Order durchlaufen und beim verkauften UND beim gekauften Teil hinzuaddieren oder abziehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Jokin:

Ja, da hast Du absolut recht - das ist ein Copy-Paste-Fehler im Kommentar 😞

Hab mir den Code nochmal angeschaut - der passt jedoch. Auch, dass lediglich addiert wird. Das Abziehen macht Binance für uns über den Split "free" und "locked".

... diese Eigenart von Binance hat natürlich zur Folge, dass das auf andere Exchanges nicht einfach übertragbar ist, sondern da muss man jede offene Order durchlaufen und beim verkauften UND beim gekauften Teil hinzuaddieren oder abziehen.

Ah, interessant, danke für die Info. Mir ist das im Code nämlich auch aufgefallen und ich hatte insgeheim gehofft, dass du dir den Code an Stelle auch nochmal anschaust. Hat also geklappt und ist absichtlich so, alles klar :)

Übrigens habe ich auch noch keinen Binance-Account angelegt... will erst mit dem Code soweit durch sein dass ich denke, er könnte laufen. Es kann ja noch ne ganze Weile dauern, bis es soweit ist, und will vermeiden dass die Coins inzwischen nur untätig rumliegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Minuten schrieb Herr Coiner:

Übrigens habe ich auch noch keinen Binance-Account angelegt... will erst mit dem Code soweit durch sein dass ich denke, er könnte laufen. Es kann ja noch ne ganze Weile dauern, bis es soweit ist, und will vermeiden dass die Coins inzwischen nur untätig rumliegen.

Denk da nochmal drüber nach 😉

Lege Dir einen Account an und schmeiß da irgendwas um die 10 Euro in ETH rein - mehr brauchst Du nicht um Deinen Code mit API-Anbindung zu testen und daran zu lernen.

Mach es wirklich Stück für Stück und lerne was die API zurück meldet.

 

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 19.1.2019 um 15:17 schrieb Jokin:

Denk da nochmal drüber nach 😉

 

Hab' ich gemacht und jetzt ist es vollbracht... zumal sich gerade auf meinem Abreißkalender ein gewisser Buddha aus dem 6. Jh. v. Chr. zu Wort meldete mit dem Spruch "Wer über jeden Schritt lange nachdenkt, der steht sein Leben lang auf einem Bein." 

Und ja, es debuggt sich besser mit den echten Zahlen von der API. 

  • Love it 1
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 10.1.2019 um 21:08 schrieb Jokin:

5. Den prozentualen IST-Anteil ermitteln

Prozentuale Anteile der Coins und der Basiswährung werden als „current_percentage“ gespeichert:


	// Nun möchten wir den Gesamtwert aller Coins ermitteln - auch das machen wir schon wieder in einer foreach-Schleife (Teil 4)
	foreach ($__balanceBot_coins as $key => $array_coin){
		$sum_coin_value += $__balanceBot_coins[$key]['virtual_value'];
	}
[...]
	// Abschnitt index.php 6.3:
	// Zur Bestandsaufnahme gehört es nun, dass wir sowohl für Basis-Währung als auch für jeden Coin den prozentualen Anteil am Gesamt-Coinwert ermitteln 
	foreach ($__balanceBot_coins as $key => $array_coin){
		$__balanceBot_coins[$key]['current_percentage'] = $__balanceBot_coins[$key]['virtual_value'] / $sum_coin_value * 100;
	}
	// bei der Basiswährung entspricht die Balance auch dem virtual_value - logisch ...
	$__balanceBot_basecurrency['current_percentage'] = $__balanceBot_basecurrency['virtual_balance'] / $sum_coin_value * 100;

 

@Jokin: Irgendwas scheint da nicht zu stimmen in meinem Programm... Ich habe z.B. ohne offene Order:

Basis: 0,9 ETH
NEO: 0,0 ETH
BNB: 0,1 ETH
ADA: 0,0 ETH

Damit ergibt sich $sum_coin_value zu NEO + BNB + ADA = 0 + 0,1 + 0 = 0,1 ETH.

Für den prozentualen Anteil bekomme ich dann

NEO: 0 / 0,1 * 100 = 0%
BNB: 0,1 / 0,1 * 100 = 100%
ADA: 0 / 0,1 * 100 = 0%
Und für die Basiswährung (letzte Zeile im Zitat) dann der Hammer:
0,9 / 0,1 * 100 = 900%

Wahrscheinlich hab' ich das falsch verstanden irgendwie falsch programmiert, den die 900% stimmen ja wohl sicher nicht.

Das mit der Seitenlinie verstehe ich jedenfalls so:  Konfiguriert sind 40% vom Gesamtkapital in Basiswährung, und die restlichen 60% soll der Bot dann möglichst ins Verhältnis 40% + 30% + 30% balancieren, richtig?
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb Herr Coiner:

Das mit der Seitenlinie verstehe ich jedenfalls so:  Konfiguriert sind 40% vom Gesamtkapital in Basiswährung, und die restlichen 60% soll der Bot dann möglichst ins Verhältnis 40% + 30% + 30% balancieren, richtig?

Nein, nicht richtig.

Der Gesamt-Portfoliowert setzt sich aus Basiswährungwert und Gesamt-Coinwert zusammen.

In der Config wird definiert welchen Anteil jeder Coin innerhalb des Gesamt-Coinwerts haben.
=> In Deinem Beispiel beträgt der Gesamt-Coinwert "0,1"

Die Basiswährung ist dabei außen vor, denn das ist die "Seitenlinie" und die wird separat betrachtet.
=> In Deinem Beispiel beträgt der Basiswährungswert "0,9"

Dein Basiswährungswert beträgt 900% des Gesamt-Coinwertes. Das passt also schon mit der Berechnung.

... ja, es ist etwas "umständlich" die Seitenlinie separat zu betrachten - von der Logik her sollte man die Seitenlinie mit reinnehmen und den Gesamt-Portfoliowert ausbalancieren.

Bei der Umsetzung in ein Programm jedoch stellt die Basiswährung immer wieder ein Problem dar, da sie als Coin mit dem Kurs "1" behandelt werden müsste.
Bei jeder Abfrage der Kurse müsste ich sie ausklammern und auch an anderen Stellen müsste ich immer wieder Sonder-Code für die Basiswährung einführen.

Daher hab ich mich dafür entschieden die Basiswährung getrennt von den Coins zu behandeln, was eben zu der augenscheinlich "unlogischen" Berechnung führt.

Die Basiswährung dient mir auch immer als "Bezugspunkt", daher will ich die nicht einfach so mit den Coins gleichsetzen.

Auf einer Exchange, die es erlaubt jede Währung gegen jede andere zu tauschen würde das auf jeden Fall anders aussehen.

Sobald bitcoin.de den Schritt gegangen ist und Crypto-gegen-Crypto-Tausch ermöglicht werde ich das nochmal komplett umschreiben und dann wird das auch dort möglich sein. So lässt sich dann auch jederzeit ein gewisser Gewinn auscashen, den man z.B. als monatliches passives Einkommen ansehen kann.
(ein kleiner Ausblick meiner Vision)

 

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 35 Minuten schrieb Jokin:

Der Gesamt-Portfoliowert setzt sich aus Basiswährungwert und Gesamt-Coinwert zusammen.

In der Config wird definiert welchen Anteil jeder Coin innerhalb des Gesamt-Coinwerts haben.
=> In Deinem Beispiel beträgt der Gesamt-Coinwert "0,1"

Die Basiswährung ist dabei außen vor, denn das ist die "Seitenlinie" und die wird separat betrachtet.
=> In Deinem Beispiel beträgt der Basiswährungswert "0,9"

Dein Basiswährungswert beträgt 900% des Gesamt-Coinwertes. Das passt also schon mit der Berechnung.

Schöne Zahl eigentlich, die 900%, nur etwas deplatziert. Man müsste es so hinbiegen können, dass sie schließlich als Reingewinn dasteht. :lol:

An diese Logik mit mit Gesamt-Portfoliowert und Gesamt-Coinwert muss ich mich aber erst gewöhnen. Bin jedenfalls froh, dass die Berechnung soweit stimmt, vielen Dank für die Erklärung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab auch mehrmals hin und herüberlegt, denn gerade zu Beginn ergeben sich Werte von "unendlich" wenn noch nix in Coins getauscht wurde.

Vom Alorithmus gab's da auch noch einen Zwang wieso ich das so machen musste - hab ich aber schon wieder vergessen 😞

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Abschnitt 6.5 enthält einen Fehler, dort ermitteln wir die Reihenfolge in der die Coins später abgearbeitet werden - der Coin mit der größten Abweichung soll zuerst bearbeitet werden.

Die Ermittlung ist schlichtweg falsch.

Jedoch ist die Auswirkung auf die Strategie nicht schlimm - ob nun der eine Coin zuerst oder der andere zuerst bearbeitet wird, ist nicht wirklich kriegsentscheidend.

Dennoch vorab hier die Korrektur des Abschnitts 6.5:

	// Abschnitt index.php 6.5:
	// Nun müssen wir mal ermitteln wie weit weg das IST vom Ziel ist, dazu bilden wir einfach einen Faktor aus SOLL (target_percentage) und IST (current_percentage)
	// Mit "deviation_percentage" führen wir einen Wert ein, der besagt:
	//   >1 -> Ich habe zu viel davon, das muss weniger werden! ... also SELL-Order erstellen oder BUY-Order löschen
	//   <1 -> Ich habe zu wenig davon, das muss mehr werden! ... also BUY-Order erstellen oder SELL-Order löschen
	// bei der Basiswährung machen wir das auch
	$__balanceBot_basecurrency['deviation_percentage'] = $__balanceBot_basecurrency['current_percentage'] / $__balanceBot_basecurrency['target_percentage'];
	// und für jeden Coin ...
	foreach ($__balanceBot_coins as $key => $array_coin){
		$__balanceBot_coins[$key]['deviation_percentage'] = $__balanceBot_coins[$key]['current_percentage'] / $__balanceBot_coins[$key]['target_percentage'];

		// Hier bauen wir uns das Hilfsarray indem alle Coins absteigend nach ihrer Soll/Ist-Abweichung drin stehen werden.
		// Update 25.01.2019: "Korrektur Sortierung der Coins zum Abarbeiten":
		$array_coins_sorted_by_deviation[$key] = abs($__balanceBot_basecurrency['deviation_percentage'] - $__balanceBot_coins[$key]['deviation_percentage']);
	}

	// nun sortieren wir das Hilfsarray auch so, dass es brauchbar ist um den am heftigsten abweichenden Coin zuerst abzuarbeiten.
	arsort($array_coins_sorted_by_deviation); // siehe php manual "krsort()" .. behält den key assoziativer Arrays bei und sortiert absteigend.

	// echo "<pre> Und das ist die Sortierung der Coins: <br>";
	// print_r($array_coins_sorted_by_deviation);
	// echo "</pre>";

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Jahre später...
Am 10.1.2019 um 21:08 schrieb Jokin:

Nun könnt Ihr  bei Binance eine neue Order anlegen - bitte darauf achten, dass die Order nicht gleich ausgeführt wird, also eine BUY-Order mit unglaublich niedrigem Preis anlegen oder eine SELL-Order mit unglaublich hohem Preis.

Jetzt häng eich hier gerade fest. Kann mir einer de alten Hasen erklären, was für eine Order ich da setzen soll?

Ich habe links P2p Order, Margin Orders etc …

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.