Zum Inhalt springen

VisualBasic

Mitglied
  • Gesamte Inhalte

    13
  • Benutzer seit

  • Letzter Besuch

Beiträge von VisualBasic

  1. vor 2 Stunden schrieb adatainment:

    Danke für dein Feedback. Also Alternativen gäbe es mit Infinito Wallet, Ada Lite und Atomic Wallet noch weitere, wollte allerdings Yoroi hier vorstellen, da er von Emurgo ist und wie oben erwähnt auf der Referenzimplementierung von IOHK basiert.

    Super genial, vielen Dank.  Bereits umgesetzt  👌👌👌 Fullnode Wallet ist einfach zu schwerfällig. Habe nicht gewusst, dass etwas leichteres auch für ADA gibt.

    • Like 1
  2. vor 33 Minuten schrieb Amsi:

    Windows?
    Meine 1. Idee wäre den Unterordner in C:\Users\*DEIN-BENUTZERNAME*\AppData\Roaming zu löschen.

    Ich danke Dir vielmals - Problem gelöst 👍

    Nach deiner Anweisung bin ich zum Schluss gekommen, dass mir Windows nicht alles zeigt. Windwos 10 ist als Standard so eingestellt, dass man nur nach der Aktivierung des Kästchen "Ausgeblendete Elemente" deinen Pfad überhaupt finden kann. Natürlich springt diese mögliche Einstellung einem nicht ins Auge, sondern man muss es suchen - Windows verliert immer mehr Boden zu Apple in der Anwenderfreundlichkeit.

    • Like 1
  3. Es ist mir fast peinlich, aber bringe es nicht fertig sauber die Deadalus Wallet definitiv zu löschen. Habe alles gelöscht, aber bei der erneuten Installation war die alte Wallet wieder da. Ich will eine neue Wallet mit den 12 neuen Wörter erstellen. Die alte Wallet will ich endgültig löschen, sie ist auch inzwischen leer.

  4. vor 7 Minuten schrieb battlecore:

    Das ist immer schwer als Anfänger weil es eben doch sehr komplex ist wenn man mehr tut als irgendwo Coins zu kaufen und die zu hodeln.

    Aber andersrum muss derjenige der Provision bekommt ja auch nachweisen können woher die Coins stammen, wegen der Steuer. Sonst macht das ja auch keinen Sinn.

    Thema unsauberes Geld, Geld ist nicht Coins. Wenn man Coins kauft, egal wo, dann kann der Coinhändler, Marktplatz, Exchange oder wer auch immer nicht feststellen ob das Geld sauber ist oder nicht. Und unsaubere Coins kann man auch kaum feststellen, spätestens wenn jemand z.b. gestohlene Coins zu einer Exchange schickt und in andere Coins umtauscht, dann sind die Coins die er erhält plötzlich sauber. Die Exchange hat dann das Problem. Wenn nicht bekannt ist welche Adresse bestohlen wurde (meinetwegen 5 BTC von Ließchen Müllers Wallet) kann die Exchange da nix machen. Die coins sind sofort wieder weg sobald jemand BTC kauft, dann werden auch die gestohlenen natürlich mit weggeben.

    Man kann das zwar nachvollziehen, aber wer will bestimmen das z.b. Opa Karl seine 2,3 BTC aus den gestohlenen 5 BTC stammen? Niemand. Denn die gestohlenen 5 fließen in einen großen Pool von Coins die alle auf derselben Adresse sind.

    interessant, habe nicht soweit gedacht - danke für die Infos 👍

    • Like 1
  5. Am 19.12.2018 um 09:09 schrieb adatainment:

    Guten Morgen,

    da ich unter dem Begriff "Yoroi" noch nichts im Forum gefunden habe, dafür einige Beiträge mit Daedalusproblemen möchte ich euch hier kurz den Yoroi-Wallet als Alternative zu Daedalus vorstellen. 

    Es handelt sich dabei um eine Chrome Extensions die man unter https://yoroi-wallet.com laden kann. Screenshots sind unter https://chrome.google.com/webstore/detail/yoroi/ffnbelfdoeiohenkjibnmadjiehjhajb zu sehen. 

    Der Wallet ist im Gegensatz zu Daedalus keine Fullnode und muss deshalb nicht die ganze Blockchain laden. Für ältere Rechner, langsame Internetverbindungen oder bei Speicherplatzproblemen also optimal mit dem Nachteil, dass man sich auf ein fremdes Back-End verlässt. (Yoroi wird von Emurgo betrieben und basiert auf "Icarus", einer Referenzimplementierung von IOHK: https://github.com/input-output-hk/project-icarus)

    Kleiner Funfact dazu: nach der griechischen Mythologie war Daedalus der Vater von Icarus. Die Namen sind also nicht zufällig gewählt.

    Es ist außerdem erwähnenswert, dass der Backup-Seed von Daedalus nicht kompatibel mit Yoroi ist. D.h. man kann nicht einfach seinen Seed importieren sondern muss einen neuen Wallet anlegen und dann seine ADA auf eine neue Adresse von Yoroi schicken oder aber Yoroi bietet einen Import an, wenn Daedalus noch installiert ist. Dabei werden die ADA auch an eine neue Adresse geschickt. Die Adressen sehen auch etwas anders aus, sind deutlich kürzer als die Daedalus-Adressen.

    Yoroi wird (mit ziemlicher Sicherheit) der erste Wallet sein der Unterstützung für den Ledger Nano S haben wird. Natürlich wird man damit auch staken können.

    Super interessant, habe bis jetzt gedacht, dass keine Alternative möglich wäre - voll cool und danke 👍

  6. 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 👍

  7. vor 20 Minuten schrieb battlecore:

    Ja richtig. Ich hatte das nur so anmerken wollen weil es sich so laß als wärst du der Meinung das es quasi sowas wie ein Bankgeheimnis gäbe wo niemand weiß auf welcher Adresse (analog zu Kontonummer) wieviel drauf ist.

    Klar hast Du Recht, dass man immer selber Schuld ist und man informiert sein muss. Aber als Anfänger kommt man nicht sofort auf den Gedanken, dass mit einem Reflink Binance quasi die Tatsache in Kauf nimmt, dass sodann jeder Vermittler (Influencer und vor allem Freunde) über deine Trades bestens informiert ist und das mit dem kleinsten Aufwand. Ich bin auch von Binance begeistert, Binance ist bestimmt inzwischen mit Abstand die beste und komfortabelste Exchange. 

    Ich glaube, obwohl der Kryptokosmos sehr in Verruf steht, hat es nicht die geringste Chance mit unsauberem Geld in geschützten zentralisierten Konten :D 
     

    • Thanks 1
  8. vor 4 Minuten schrieb Jokin:

    Das sind die Daten, die der Werber erhält:

    Unbenannt.png.d07d3c4ab722c6358c0ae1af3ef5e890.png

    Binance liefert nur die ersten 2 Zeichen und die Toplevel-Domain der e-Mail-Adressen. Der Rest ist durch drei Sternchen ersetzt.
    (ich hab zusätzlich auch noch die ersten beiden Zeichen geändert, damit sich niemand wiederfindet).

    Wenn Dein Kollege nun weiß, dass Deine Adresse  visualbasic@web.de lautet, und er nur einen Geworbenen hat, dessen Mail-Adresse mit "vi***@***.de" abgekürzt wird, kann er alle zugehörigen Refferal-Eingänge eben dieser eMail-Adresse zuordnen.

    Erst im zweiten Schritt erfolgt die Hochrechnung auf die getradete Menge.

     

     

    Danke, habe wirklich dazugelernt 👍

    • Like 2
  9. vor 4 Stunden schrieb Jokin:

    Du bist auch der Meinung, dass Binance Deine Daten weitergibt.

    Falsch! Der Werber sieht nur ein paar Zeichen Deiner eMail-Adresse. Hättest DU Deinem Kollen nicht Deine eMailadresse gegeben, könnte er Deine Transaktionen nicht auswerten.

    Auch Falsch: Nicht Binance wertet Deine Transaktionen aus, sondern Dein Kollege wertet Deine personenbezogenen Daten aus. So ein Arschloch!

    Und Du selbst trägst nicht dafür Sorge, dass er möglichst wenig Daten erhält. Kaufe ein paar BNB und aktiviere dass Du Gebühren in BNB bezahlst. Er sieht dann nur noch Provisionszahlungen in BNB und kann keine Rückschlüsse auf Deine Trades ziehen.

     

    Also hack nicht auf Binance rum, solange Du die Sachlage nicht verstanden hast und erkannt hast, wer exakt Deine Daten auswertet und damit hausieren geht.

    Jokin danke für deinen Beitrag.

    Leider hast du Recht. Ich kenne ihn seit der Schulzeit. Leider hat er einen schlechten Charakter verpackt in vordergründiger Höflichkeit und Freundlichkeit.

    Das war ein toller Tipp, ich habe jetzt einen neuen Binance-Account mit einer neuen E-Mail kreiert. Er kann die Adressen meiner Coins/Token jetzt nicht mehr wissen im neuen Account. 

    Ausser dem kann man doch über Monero alles reinwaschen, was die Zurückverfolgbarkeit betrifft. Soweit will ich aber nicht gehen, aber sicher einen Gedanken wert. 

    Wieso ist die E-Mail Adresse so wichtig, um die Trade zu berechnen. Es genügt doch, wenn man weiss, wie hoch der prozentuale Anteil der Tradekosten ist, die man von Binance erhält von der getradeten Währung - einfacher Dreisatz. Das mit dem Kauf von BNB und die Gebühren davon abzuziehen ist sicher auch eine gute Idee - Schadenminderung.

    Bin froh, dass ich jetzt davon befreit bin. Wenn die Beträge im Kryptokosmos grösser werden und jemand alles mitverfolgen kann, ist das zwar nicht extrem dramatisch, aber dennoch unangenehm.

    • Thanks 1
    • Like 1
  10. vor 5 Stunden schrieb battlecore:

    Du weißt aber das jede Transaktion, egal welche, immer öffentlich für jedermann in der Blockchain zu sehen ist?

    Ja schon, aber vorher muss jemand doch die Adresse kennen und das kann man nicht mit einem Reflink herausfinden. Man kann lediglich die Trades herausfinden. Denke das zumindest.

  11. Ich habe eine Frage, bei der ich nirgends eine Antwort bekomme.

    Ich bin vor längerer Zeit von einem Kollegen in den Kryptokosmos eingeführt worden. Damals hatte ich von nichts eine Ahnung. 

    Er hat mir damals bei der Anmeldung an den verschiedenen Exchanges geholfen, wofür er sodann von der Exchange 10 bis 15 Dollar bekam, was mich natürlich überhaupt nicht gestört hat.

    ABER SO NACH EINEM JAHR war ich extrem erstaunt, als er wusste, welche Transaktionen ich ausgeführt habe. Ich konnte es einfach nicht glauben. Die Lösung war dann einfach, denn bei jeder Transaktion bekommt der Vermittler einen geringen Prozentsatz der Transaktionskosten. Es braucht keine grosse Rechenkunst, um dann den Gesamtbetrag der TA zu errechnen.

    Es ist schon unglaublich, wie Binance die Privatsphäre überhaupt nicht schützt. Ich wollte diesen Umstand ändern, aber finde nirgends eine Möglichkeit diesen Umstand zu deaktivieren.

    Kann mir bitte jemand helfen, der viel versierter ist als ich selber. Macht Coinbase etwas das Gleiche?

    • Love it 1
    • Haha 2
    • Like 1
×
×
  • 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.