Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 6)


Empfohlene Beiträge

Hallo zusammen,

nach der fünften Lektion (https://coinforum.de/topic/16058-workshop-wir-basteln-uns-einen-tradingbot-lektion-5/) geht es heute weiter, das haben wir nun auf dem Programm. Es ist nun noch ein bisschen Drumherum damit diese Lektion nicht so leer ist.

 

Unsere Tagesziele für heute:

1. Bugfix
2. Zusätzliche Sicherheit gegen Preisstürze einbauen
3. Logeinträge filtern
4. Langfristig die Daten in der Datenbank sichern
5. Daten als CSV-Datei ausgeben
6. Bot scharf schalten

1. Bugfix

Erstmal ein kleiner Bugfix:

An zwei Stellen muss aus "$market" ....

			$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.

...  "$symbol" werden:

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

2. Zusätzliche Sicherheit gegen Preisstürze einbauen

Abschnitt 9 wird erweitert indem wir den Bot stoppen sobald wir einen Coin mit massivem Preissturz erkennen.
Dafür unterstellen wir, dass der maximale und der minimale Preis innerhalb von 24 Stunden ein guter Indikator ist – wenn diese Spanne halb so groß wie der aktuelle Kurs ist, dann scheint es einen massiven Kursverfall zu geben und der Bot sollte nicht nur diesen Coin nicht nachkaufen sondern seine Arbeit komplett einstellen und dem Admin die Gelegenheit geben selber einzugreifen und die config.php anzupassen.
Ich habe einen Platzhalter für „Abschnitt 9.1“ drin, hier wird noch eine Benachrichtigungsemail versendet werden.

// Abschnitt index.php 9: 
// Nachdem wir nun die Binance-API eingebunden haben, nutzen wir sie auch mal und fragen die Kurse ab (Teil 3)
foreach ($__balanceBot_coins as $key => $array_coin){
	// finde den Preis zum derzeit bearbeiteten Pair 
	$array_binance_prevDay = $binance_api_handler->prevDay($__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']);	

	// Hier machen wir eine Fehlerabfrage ob wir einen Preis für den Coin finden - wenn ein Coin gedelistet wird, gibt es keinen Preis mehr
	if ($array_binance_prevDay["lastPrice"]){
		$__balanceBot_coins[$key]["price"] = $array_binance_prevDay["lastPrice"];
		$__balanceBot_coins[$key]["price_24_high"] = $array_binance_prevDay["highPrice"];
		$__balanceBot_coins[$key]["price_24_low"] = $array_binance_prevDay["lowPrice"];
		$message = "Finde Preis für ".$__balanceBot_coins[$key]['name']."".$__balanceBot_basecurrency['name'].": ".$__balanceBot_coins[$key]["price"]." (24h high/low: ".$__balanceBot_coins[$key]["price_24_high"]." / ".$__balanceBot_coins[$key]["price_24_low"].") ";
		update_messages($message); // message in DB schreiben und ausgeben.
	} else {
		$message = "FEHLER: Keinen Preis für ".$__balanceBot_coins[$key]['name']."".$__balanceBot_basecurrency['name']." gefunden!";
		update_messages($message); // message in DB schreiben und ausgeben.
	}

	/* Hinzugefügt am 15.01.2019 - Beginn */
	if ($__balanceBot_coins[$key]["price_24_high"]-$__balanceBot_coins[$key]["price_24_low"] > $__balanceBot_coins[$key]["price"] * 0.5){
		// sollte die Spanne zwischen 24h-High und 24h-Low um $__maxPriceDrop % fallen,
		// gehen wir davon aus, dass der Kurs gerade mächtig in den Keller fällt.
		// wir wollen dann keine weitere Balancierung durchführen, geben einen Fehler aus und beenden den Bot.
		$message = "FEHLER: Spanne zwischen 24High und 24Low beträgt mehr als der halbe Kurswert bei ".$__balanceBot_coins[$key]['name']."".$__balanceBot_basecurrency['name']." - Breche das Rebalancing ab.";
		update_messages($message); // message in DB schreiben und ausgeben.
		
		// Abschnitt Index.php 9.1
		// (Platzhalter)
		
		exit;
	}
	/* Hinzugefügt am 15.01.2019 - Ende */

}

 

3. Logeinträge filtern

Mit der Zeit wird es recht unübersichtlich durch die Logeinträge durchzuschauen. Insbesondere wenn man nur alle paar Tage mal nachschaut, wird es müßig den Überblick zu behalten.

Somit überarbeiten wir nun die Datei „show_messages.php“ indem wir eine Linkliste einfügen, die auf dieselbe Datei (PHP_SELF) verweisen und einen Suchstring enthalten.
Zusätzlich fügen wir ein „limit“ ein, dass max. 600 Datensätze angezeigt werden (vollkommen egal wieviel – nicht zu wenig und nicht zu viele).

// Abschnitt show_messages.php 3:
// Die Linkliste zu Beginn der Seite einbinden
// mit <?php ... lässt sich PHP-Code innerhalb von HTML-Code einfügen.
?>
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600">alle Messages</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=Creat">Create</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=Order">Order</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=Status">Status</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=Error">Error</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=Fehler">Fehler</a> |
<a href="<?php echo $_SERVER["PHP_SELF"] ?>?limit=600&search=csv">csv</a> |
<hr>
<?php

Sobald mit der URL diese Parameter übergeben wurden, müssen wir sie auch im Skript „auffangen“ und zur Sicherheit prüfen wir sie auf Gültigkeit oder setzen Standardwerte:

// Abschnitt show_messages.php 4:
// Daten, die mit der URL übergeben werden, nehmen wir hier in das Skript auf
$limit = $_GET["limit"];
$search = $_GET["search"];

// falls keine Werte übermittelt worden sind, setzen wir hier Standardwerte
if (!$limit or !is_numeric($limit)) $limit = 600; // falls "limit" nicht numerisch ist, dann wird das hier abgefangen.
if (!$search) $search = ''; // "$search" kann beliebige Suchwerte beinhalten - individuelle Auswertungen werden so möglich

Und die Datenbankabfrage werden wir auch nochmal anpassen:

// Abschnitt show_messages.php 5:
// Nun wollen wir auslesen was in der Datenbank drin steht.
// Dazu wollen wir die DB abfragen und die Ergebnisse sollen nach der ID absteigend sortiert werden (Datum ginge auch)
$sql_query="SELECT * FROM `tblMessages` WHERE `message` like '%".$mysqli->real_escape_string($search)."%' ORDER BY  `id` DESC LIMIT 0, ".$mysqli->real_escape_string($limit)." ";

$result_tblMessages = $mysqli->query($sql_query);

// in einer while-Schleife durchlaufen wir jeden Datensatz, den wir von der Datenbank zurück erhalten.
while($entry_tblMessages = $result_tblMessages->fetch_array(MYSQLI_BOTH)) {
	// ... und geben diesen einfach über einen echo-Befehl im Browser aus
    echo " ".$entry_tblMessages['date_created'].": ".$entry_tblMessages['message']." <br>";
}

Damit ist es nun möglich nach Fehlern zu filtern oder die Status-Ausgaben gefiltert zu sehen.
Das hat mir bei der Entwicklung und dem Debugging im Vorfeld massiv geholfen.

4. Langfristig die Daten in der Datenbank sichern

Natürlich wollen wir auch langfristig sehen ob der Bot korrekt gearbeitet hat und dazu werden wir eine grafische Auswertung benötigen.

Diese grafische Auswertung kann nur funktionieren, wenn entsprechend gute Datenquellen zur Verfügung stehen.

Und das führt uns direkt wieder zur Datenbank.

Wir legen uns nun eine neue Tabelle in der Datenbank an in der wir alle wichtigen Daten der Vergangenheit aufheben wollen.

Über  Via phpmyadmin Tabelle, Priämarschlüssel, auto_increment anlegen:

CREATE TABLE `tblBalances` (
  `id` int(11) NOT NULL,
  `coin_name` varchar(10) NOT NULL,
  `pair_name` varchar(10) NOT NULL,
  `date_created` datetime NOT NULL,
  `current_balance` double NOT NULL,
  `current_price` double NOT NULL,
  `target_percentage` double NOT NULL,
  `virtual_percentage` double NOT NULL,
  `virtual_balance` double NOT NULL

);

ALTER TABLE `tblBalances`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tblBalances`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Diese Tabelle soll auch entsprechend mit Daten gefüllt werden, das soll unser Bot in der Funktion update_status() gleich mit übernehmen, dazu bereiten wir Abschnitt 6.4 entsprechend vor indem wir weitere Abschnitts-Titel einfügen:

	// 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.

	// Abschnitt index.php 6.4.1:
	// 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.

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

Und nun füllen wir in gewohnter Weise den neuen Abschnitt indem wir erstmal das aktuelle Datem festhalten und dann für die Basiswährung und alle Coins die Daten in die neue Tabelle schreiben:

 


	// Abschnitt index.php 6.4.2:
	// Den Bestand wollen wir nun in die Tabelle tblBalances schreiben damit wir später die Daten bequem auswerten können.
	global $mysqli; // diese Zeile gehört eigentlich an den Anfang der Funktion nach oben

	$current_date = date("Y-m-d H:i:s"); // damit wir in diesem Duchlauf dieselbe Zeit für jeden Datensatz haben.

	// Alle Daten für die Basiswährung in die Datenbank werfen.
    $sql_query = "INSERT INTO `tblBalances` (`coin_name`, `pair_name`, `date_created`, `current_balance`, 
				`current_price`, `target_percentage`, `virtual_percentage`, `virtual_balance`) 
        VALUES (
				'".$__balanceBot_basecurrency['name']."',
				'base',
				'".$current_date."',
				".($__balanceBot_basecurrency['free'] + $__balanceBot_basecurrency['locked']).",
				1,
				".$__balanceBot_basecurrency['target_percentage'].",
				".$__balanceBot_basecurrency['current_percentage'].",
				".$__balanceBot_basecurrency['virtual_balance']."
			)";

    // Minimales Fehlerhandling
   	if (!$mysqli->query($sql_query)) {
   	    echo $mysqli->error;
    }
	foreach ($__balanceBot_coins as $key => $array_coin){
		// Alle Daten für die Coins in die Datenbank werfen.
    	$sql_query = "INSERT INTO `tblBalances` (`coin_name`, `pair_name`, `date_created`, `current_balance`, 
						`current_price`, `target_percentage`, `virtual_percentage`, `virtual_balance`) 
        	VALUES (
 	       			'".$__balanceBot_coins[$key]['name']."',
					'".$__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']."',
					'".$current_date."',
					".($__balanceBot_coins[$key]['free'] + $__balanceBot_coins[$key]['locked']).",
					".$__balanceBot_coins[$key]['price'].",
					".$__balanceBot_coins[$key]['target_percentage'].",
					".$__balanceBot_coins[$key]['current_percentage'].",
					".$__balanceBot_coins[$key]['virtual_balance']."
				)";

	    // Minimales Fehlerhandling
    	if (!$mysqli->query($sql_query)) {
    	    echo $mysqli->error;
	    }
	}

5. Daten als CSV-Datei ausgeben

Nun wollen wir die Daten aber auch als CSV-Datei ausgeben. Dazu legen wir eine neue Datei „show_csv.php“ an.

<?php
/***
*
* Via phpmyadmin Tabelle, Priämarschlüssel, auto_increment anlegen

CREATE TABLE `tblBalances` (
  `id` int(11) NOT NULL,
  `coin_name` varchar(10) NOT NULL,
  `pair_name` varchar(10) NOT NULL,
  `date_created` datetime NOT NULL,
  `current_balance` double NOT NULL,
  `current_price` double NOT NULL,
  `target_percentage` double NOT NULL,
  `virtual_percentage` double NOT NULL,
  `virtual_balance` double NOT NULL

);

ALTER TABLE `tblBalances`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tblBalances`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
*/

require_once 'config.php'; // Config-Datei einbinden

// Abschnitt show_csv.php 1:
// (Platzhalter)

// Abschnitt show_csv.php 2:
// (Platzhalter)

// Abschnitt show_csv.php 3:
// (Platzhalter)

// Abschnitt show_csv.php 4:
// (Platzhalter)


?>

Zuerst bauen wir die DB-Verbindung auf und lesen die Daten aus der Datenbank aus:

// Abschnitt show_csv.php 1:
// Datenbankverbindung aufbauen und einen DB-Handler erzeugen
$mysqli = new mysqli($__db_server, $__db_user, $__db_passwort, $__db);

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    exit(); // Skript beenden, wenn keine DB-Verbindung zustande kommt.
}

// Abschnitt show_csv.php 2:
// Daten aus der Datenbank auslesen
$sql_query="SELECT * FROM `tblBalances` ";
$result_tblBalances = $mysqli->query($sql_query);

Danach müssen wir alle Daten eines Zeitstempels zusammenfassen:

// Abschnitt show_csv.php 3:
// Daten aufbereiten
// Alle Einträge einer Zeile sollen einem Zeitpunkt zugeordnet werden
while($entry_tblBalances = $result_tblBalances->fetch_array(MYSQLI_BOTH)) {
	$array_csv[$entry_tblBalances['date_created']][$entry_tblBalances['coin_name']] = $entry_tblBalances;
}

// Abschnitt show_csv.php 4:
// Daten sortieren
arsort($array_csv); // Array nach Datum absteigend sortieren


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

Im Browser wird nun das Array ausgegeben mit allen Daten, die nach Zeitstempel zusammengefasst worden sind. Diese Ausgabe am Besten wieder auskommentieren, die brauchen wir nicht mehr:

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

Wir brauchen jedoch die korrekte Zeilenweise Ausgabe der Daten im CSV-Format. In Abschnitt 4.1 geben wir die Titelzeile aus, das machen wir einmal für die Basiswährung und danach mit jedem Coin in einer foreach-Schleife.
Wir geben nur das aus, was derzeit konfiguriert ist. Nach einer Veränderung des Portfolios gibt es nachvollziehbarerweise Lücken in der CSV-Datei. Diese zu schließen bedarf mehr Aufwand zum Programmieren als es tatsächlich nützt.

In Abschnitt 4.2 geben wir dann die Daten aus indem wir uns aus dem Unterarray des Datums jeweils die Werte zum aktuell anzuzeigenden Coins herauspicken.

// Abschnitt show_csv.php 4:
// Daten ausgeben
// Hier geben wir nicht alles aus, was in der Datenbank steht sondern nur das, 
// was derzeit in der Config.php definiert ist.
// Nach Anpassung der Coins in der config.php führt das zu Auswertungsfehler, 
// die aufgrund der Einfachheit in Kauf genommen werden.

// Abschnitt show_csv.php 4.1:
// Titel der CSV-Datei ausgeben

// Abschnitt show_csv.php 4.1.1:
echo "Datum;";
echo "virtual ".$__balanceBot_basecurrency['name']." in %;";
echo "virtual ".$__balanceBot_basecurrency['name']." in Stück;";
echo "current ".$__balanceBot_basecurrency['name']." in Stück;";

// Abschnitt show_csv.php 4.1.2:
foreach ($__balanceBot_coins as $key => $array_coin){
	echo "virtual ".$__balanceBot_coins[$key]['name']." in %;";
	echo "virtual ".$__balanceBot_coins[$key]['name']." in Stück;";
	echo "virtual ".$__balanceBot_coins[$key]['name']." in ".$__balanceBot_basecurrency['name'].";";
	echo "current ".$__balanceBot_coins[$key]['name']." in Stück;";
	echo "current ".$__balanceBot_coins[$key]['name']." in ".$__balanceBot_basecurrency['name'].";";
}
echo "<br>";

// Abschnitt show_csv.php 4.2:
// Daten der CSV-Datei ausgeben
foreach ($array_csv as $key => $entry_csv){

	// Abschnitt show_csv.php 4.2.1:
	echo $key.";";
	echo $entry_csv[$__balanceBot_basecurrency['name']]['virtual_percentage'].";";
	echo $entry_csv[$__balanceBot_basecurrency['name']]['virtual_balance'].";";
	echo $entry_csv[$__balanceBot_basecurrency['name']]['current_balance'].";";

	// Abschnitt show_csv.php 4.2.2:
	foreach ($__balanceBot_coins as $key => $array_coin){
		echo $entry_csv[$__balanceBot_coins[$key]['name']]['virtual_percentage'].";";
		echo $entry_csv[$__balanceBot_coins[$key]['name']]['virtual_balance'].";";
		echo $entry_csv[$__balanceBot_coins[$key]['name']]['virtual_balance'] * $entry_csv[$__balanceBot_coins[$key]['name']]['current_price'].";";
		echo $entry_csv[$__balanceBot_coins[$key]['name']]['current_balance'].";";
		echo $entry_csv[$__balanceBot_coins[$key]['name']]['current_balance'] * $entry_csv[$__balanceBot_coins[$key]['name']]['current_price'].";";
	}
	echo "<br>";
}

Und schon haben wir eine CSV-Datei, die sich mit Excel mit wenigen Schritten in Diagramme umformatieren lässt.

Dazu dann später nochmal mehr, wenn ausreichend Datten vorhanden sind.

6. Bot scharf schalten

Bevor der Bot scharf geschaltet wird müsst Ihr Euch sicher sein, dass die Order, die der Bot erstellt auch in Eurem Sinne sind.
Der Quellcode dieses Bots auf GitHub entspricht exakt dem Code, den Ihr nach den Lektionen selbst vorliegen haben solltet.
Aus Sicherheitsgründen wird je Order max. 0,1% des Portfoliowertes als Ordervolumen eingestellt und minimal das Mindestordervolumen.
Dennoch rate ich zu Beginn dem Bot max. 100 USDT zur Verfügung zu stellen bis Ihr Euch sicher seid, dass Euer Porrtfoliowert nicht vernichtet wird.

Um den Bot scharf zu schalten ändern wir lediglich im Abschnitt 7 diese beiden Einträge indem „Test“ aus dem Funktionsaufruf entfernt wird.

Von:

	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);

Zu:

	if ($side == "SELL") $result_binance_create = $binance_api_handler->sell($symbol,$amount,$price);
	if ($side == "BUY") $result_binance_create = $binance_api_handler->buy($symbol,$amount,$price);

Damit legt der Bot nun aktiv Order an.

Viel Spaß!

... in der nächsten Lektion werden wir dann den Bot auch noch automatisieren – damit steigt das Risiko weiter an. Auch dies ist ein Grund wieso ich zwischen den Lektionen immer ein paar Tage verstreichen lasse.

Nebenbei teste ich den Code an zwei Realportfolios und mit dieser Lektion wird der Bot auf ein 10-ETH-Portfolio losgelassen um auch größere Portfoliowerte auszubalancieren. Ich erwarte dort mehr Bewegung da kleinere Ungleichgewichte ausgeglichen werden können.

Mittlerweile habe ich einen Raspberry Pi laufen auf dem ich diesen BalanceBot in meinem lokalen Netzwerk laufen lassen. Mit der nächsten Lektion werde ich einen öffentlichen Cron-Dienst empfehlen, der dann sinnvoll ist wenn Ihr einen Webspace ohne Crondienst nutzt.

Ich werde dann auch beschreiben wie man einen Raspberry Pi komplett neu out oft the Box lauffähig macht.

Dazu benötigt Ihr:
1x Raspberrry Pi (ich rate zum aktuellen 3B+)
1x Netzteil (Micro-USB-Ladekabel)
1x 32GB-Micro-SD-Karte (besser gleich 2 Micro-SD-Karten kaufen)
1x passende Adapter um an Eurem Computer die Micro-SD-Karten zu beschreiben.
1x Gehäuse
1x Kühlerset

Das gibt es als Bundle für ca. 80 Euro im Internet. Klingt nach viel Geld, jedoch lohnt sich die Anschaffung durchaus. Wenn Ihr heute bestellt, könnte das Zeug bis zum Wochenende schon da sein. Für das Zusammenstecken und Aufsetzen der ganzen Software sind zwei Stunden ausreichend.

1x Tastatur (nicht zwingend nötig)
1x Maus (nicht zwingend nötig)
1x HDMI-fähiger Bildschirm (Fernseher tut’s in der Regel)

Sind absolut sinnvoll, wenn das Standardsystem Raspian installiert wird – (für Ubuntu-Server wäre das nicht nötig, aber die Standard-Installation soll erstmal ausreichen und dafür macht Maus und Tastatur schon Sinn)

  • Thanks 7
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich bin neu hier im Foum und möchte als erstes ein freundliches "Hallo Welt" ;-) an die Community schicken.

Ich habe bislang "nur" gelesen. Aber nun muss ich Dir als erstes zu Deiner tollen Leistung gratulieren.

Super Programm soweit auch lauffähig. Allerdings habe ich einen kleinen Fehler und ich komme einfach nicht hinter das Problem.

Meine show_messages.php zeigt folgenden Fehler

Notice: Undefined index: search in C:\xampp\htdocs\BalanceBot\show_messages.php on line 33

Unter Line 33 findet sich bei mir

30  // Abschnitt show_messages.php 4:
31  // Daten, die mit der URL übergeben werden, nehmen wir hier in das Skript auf
32  $limit = $_GET["limit"];
33  $search = $_GET["search"];

-------------------------------------------------------

Meine index.php zeigt diesen Fehler

Notice: Undefined index: code in C:\xampp\htdocs\BalanceBot\index.php on line 345

341   if ($side == "SELL") $result_binance_create = $binance_api_handler->sell($symbol,$amount,$price);
342    if ($side == "BUY") $result_binance_create = $binance_api_handler->buy($symbol,$amount,$price);

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

-----------------------------------------------------

Ich hoffe Du kannst hiermit etwas anfangen

bin schon auf die Automation gespannt...

Gruss

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ja - das ist mir vorhin auch aufgefallen 🙂

Diese "Notice"-Meldungen kann man ignorieren, auf Produktivsystemen sind die normalerweise unterdrückt.

Die Meldung besagt nur, dass auf eine Variable zugegriffen wurde, die nicht vorab deklariert wurde. Bei PHP muss man nicht so penibel Variablen deklarieren, daher ist das auch nur eine "Notice", nichtmal eine "Warning" und erst recht kein "Error" 🙂

Um diese "Notice" zu unterdrüccken, macht man Folgendes:

1. c:\xampp\php\php.ini bearbeiten
... nach "& ~E_NOTICE" suchen
... die Zeile "error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT" ändern in "error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT  & ~E_NOTICE"
... speichern
2. Apache stoppen und neuu starten

 

... hab gerade mal bei Windows geschaut, da gibt es das Programm "Aufgabenplanung". Das ist wohl in der Lage stündlich den Balancebot anzustarten. Aber natürlich nur  wenn der Computer läuft. Da ist eine erste Notlösung ....

 

Bearbeitet von Jokin
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah danke. Gut zu wissen,dass das kein"fehler" ist.

Ja das mit der Aufgabenplanung klappt ganz gut.

Eine kleine Verständnisfrage hätte ich allerdings doch noch.

So wie ich es verstehe benutzen wir in unserem Code zum verkaufen und kaufen den jewiligen Mittelwert zwischen aktuellem Preis und 24high/24low-Preis.

High+preis/2 und low+preis/2

Bei dem aktuellen z.b.ETH-Kurs fallen die z.b. BUY calls ja recht niedrig aus

24StdLow sehr tief zum aktuellen Kurs.

Gibt es eine Möglichkeit einen 12 oder 6std low oder high als Referenz zu nehmen?

Oder dass man gleich sagt z.b. kaufe bei 20% unter aktuellen oder verkaufe bei 20% überaktuellem wert?

Wie gesagt Top Arbeit..freue mich auf Fortsetzung  

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Minuten schrieb creader:

Bei dem aktuellen z.b.ETH-Kurs fallen die z.b. BUY calls ja recht niedrig aus

24StdLow sehr tief zum aktuellen Kurs.

Gibt es eine Möglichkeit einen 12 oder 6std low oder high als Referenz zu nehmen?

Ja, diese Möglichkeiten gibt es.

12-Stunden-Low oder 6-stunden-Low müsste man sich aus den Candle-Stick-Daten selbst errechnen. Den Aufwand kann man durchaus betreiben, aber ob das nun wirklich langfristig nennenswerte Auswirkungen hat? ... najaaa ...

Dabei darfst Du auch nicht vergessen, dass ETH die Basiswährung ist, der "ETH-Kurs" ist immer bei "1" - ein ETH ist immer ein ETH wert. Die anderen Kurse "BNBETH" verhalten sich dementsprechend:

Wenn BNBUSDT fällt und ETHUSDT genauso fällt, dann ist der Kurs BNBETH gleichbleibend. Sollte BNBUSDT weniger schnell fallen als ETHUSDT, dann steigt der BNBETH-Kurs.

Aus diesem Grund empfehle ich den Aufwand für kürzere Intervalle zurück zu stellen - 24h später sieht die Welt ohnehin schon wieder ganz anders aus. Es besteht auch keine Notwendigkeit jetzt und sofort zu kaufen - diese Eile und Hast braucht es beim Ausbalancieren nicht.

vor 21 Minuten schrieb creader:

Oder dass man gleich sagt z.b. kaufe bei 20% unter aktuellen oder verkaufe bei 20% überaktuellem wert? 

Ja, das hatte ich anfangs umgesetzt. Dafür setzt Du einfach
if (sell) $price = current_price * (1+0.20)
if (buy) $price = current_price * (1-0.20)

... natürlich nicht 1:1 übernehmen, das soll nur die Systematik erläutern.

Aber genau das ist, was ich erreichen wollte - jeder soll in der Lage sein seine eigene Strategie auszutüfteln und umzusetzen ... sehr gut!!!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Stunden schrieb creader:

Bei dem aktuellen z.b.ETH-Kurs fallen die z.b. BUY calls ja recht niedrig aus

Ich hab dazu nochmal in meinem Hirn gekramt warum ich das genauso haben wollte:

In Zeiten mit hoch volatilen Kursen kann dies passieren: Trotz steigendem Kurs kann es im "Gesamtbild" sinnvoll sein einen Coin zu kaufen. Bereits im nächsten Lauf eine Stunde später kann es im "Gesamtbild" schon wieder sinnvoll sein den eben gekauften Coin zu verkaufen trotz bis dahin gefallenem Kurs. 

Das kommt weil oberstes Ziel ein ausbalanciertes Portfolio ist und nicht mit jedem Trade Gewinne zu machen.

Aus dem Grund soll bei niedrigem Kurs eine Sell-Order weiter weg sein als eine Buy-Order.

Da ich mit "virtuellem" Bestand rechne, also auch unerfüllte Order einbeziehe entsteht eine Mischung aus realem Trading und gebührenfreiem Papertrading. Eine interessante Mischung, die sich an anderer Stelle bei mir breits bewährte.

... wohlgemerkt: Perfekt ist das auch nicht, aber auch nicht allzu dumm 🙂

Bearbeitet von Jokin
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja das mit dem Gesamtbild stimmt schon...hab mich gestern nochmals genauer mit befasst und mal ein wenig rum gespielt.....hatte vorgestern den bot  das erstemal gestartet mit annähernd leerem portfolio und hatte mich erst nur gewundert warum er nicht kauft....war mal wieder zu hibbelig:-)...kommt Zeit kommt call:-)...

 

kleiner hinweis: es war für mich am Anfang aus Deiner Beschreibung nicht gleich erkennbar, dass ich nicht jeden coin als tradingpaar nutzen kann...jetzt nachdem ich bei binance selbst geschaut habe was geht und was nicht natürlich absolut verständlich...

Nutzt du Ada aus speziellen Gründen oder einfach nur so?

Hab mich erstmal auf Basis ETH dann xrp bnb und zec festgelegt. Mal schaun...

Hast du Tipps an Coins die besonders "tradingfreundlich" sind ? Wollte mich da mal etwas genauer mit beschäftigen...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Minuten schrieb creader:

kleiner hinweis: es war für mich am Anfang aus Deiner Beschreibung nicht gleich erkennbar, dass ich nicht jeden coin als tradingpaar nutzen kann...jetzt nachdem ich bei binance selbst geschaut habe was geht und was nicht natürlich absolut verständlich...

Stimmt, das hab ich nicht genau genug beschrieben.

Man muss sich zuerst für eine Basiswährung entscheiden (USDT, BTC, ETH, BNB oder XRP) und dann bei Binance schauen welche Coins  sich dort gegen diese basiswährung traden lassen.

Mit entsprechendem zusätzlichen Aufwand lässt sich das Programm auch so umprogrammieren, dass jede Währung gegen jede andere Währung handelbar wäre. Das Hauptproblem wird dann sein, dass die Basiswährung mal vor dem Coin steht (ETHBTC), mal hinter dem Coin (XRPETH) oder gar nicht (BTCUSDT) und das Programm auf jeden Fall anders reagieren muss. Das macht den Code kompliziert, unübersichtlich und Fehler sind schwerer zu analysieren.

Das Verhältnis von Aufwand und Nutzen erscheint mir nicht sonderlich günstig :-)

vor 27 Minuten schrieb creader:

Nutzt du Ada aus speziellen Gründen oder einfach nur so?

Ada habe ich drin, weil der nominelle Wert sehr gering ist und ich damit prüfen kann ob das Programm nicht bei kleinen Zahlen in Fehler reinläuft.

vor 28 Minuten schrieb creader:

Hast du Tipps an Coins die besonders "tradingfreundlich" sind ? Wollte mich da mal etwas genauer mit beschäftigen...

Ich bezeichne als "tradingfreundlich" was bei Coinmarketcap in den oberen Rängen steht, dadurch verringert sich die Gefahr des Delistings. Denn Coins, die bei Binance rausfliegen sind die größte Gefahr einer Re-Balancing-Strategie, denn in dann (schlagartig) fallende Kurse wieder fleißig reingekauft und das Portfolio wird irgendwann auf Null gesetzt.

Weiterhin für "tradingfreundlich" halte ich Coins, deren Kurse sich vollkommen unabhängig zueinander verhalten auch wenn es keine News gibt.

Und ich rate von Hype-Coins ab. Die kann man mal mit dazu packen aber davon sollten es nicht zu viele sein.

Ansonsten kann man leider nicht wissen wie die Zukunft aussieht - vielleicht muss ich in ein paar Monaten auch bei diesem Projekt sagen: "war schön, aber gebracht hat's nix ... immerhin nur minimale Verluste" - so wie beim Profittrailer-Projekt wo mir die Delistings zu schaffen machten und der immense Wertverfall des Marktes und die daraus entstandenen "Bags", also Coins, deren Kurs nach dem Kauf immer weiter fiel und es sich nie für Verkäufe im Gewinnbereich lohnte. Auch da hatte ich schon schmerzlich vermisst einen Coin gegen einen anderen zu tauschen oder zumindest eine Balance zu halten.

Im Hintergrund hab ich ja noch ein deutlich größeres nicht öffentliches Projekt laufen über das ist mein Spielgeld für solche Späße wie hier generiere. Auch dort halte ich meine Balance mit einem BalanceBot ausgeglichen ... daraus ist dieses Projekt hier ja abgeleitet :-)

vor 40 Minuten schrieb creader:

hatte vorgestern den bot  das erstemal gestartet mit annähernd leerem portfolio und hatte mich erst nur gewundert warum er nicht kauft....war mal wieder zu hibbelig:-)...kommt Zeit kommt call:-)...

Was ich gestern noch feststellte: Mindestens einer der zu bearbeitenden Coins sollte einen Bestand aufweisen. Ansonsten bricht der Bot ab, weil es eine Div/0 geben würde bei einem Gesamt-Coin-Bestand von "0". Da reicht es nicht, wenn bei der Basiswährung bisschen was eingezahlt ist.

Auch hier: Um dieses Tool für den allerersten Start benutzerfreundlicher zu machen wäre ein bisschen mehr Aufwand nötig, daher belasse ich es einfach und man sollte zumindest einen manuellen Trade mal gemacht haben.

(müsste auch irgendwo nochmal niedergeschrieben werden ... ich schreib's die Tage mal bei Github rein)

Zumindest dann solltest Du sehr schnell sehen, dass der Bot BUY-Order bei Binance setzt. Bis diese Order erfüllt werden muss sich der Kurs erstmal nach unten bewegen und zwar bis auf die Hälfte zum 24h-Minimum hinunter.
Innerhalb der 12 Stunden, die eine order stehen bleibt kommt es in der Regel schon vor, dass der Kurs erstmal in Richtung Maximum wandert und genau zu dem zeitpunkt eine Buy-Order erstellt wird. Der Kurs kommt dann innerhalb der Zeit wieder zurück und nimmt die Buy-order mit.
Oftmals gibt es in den Kerzen auch Ausbrüche, die dann das neue Minimum definieren und genau dabei werden die Buy-Order eingesammelt.

Der BalanceBot versucht also mit einer sehr simplen Strategie möglichst günstige Käufe zu machen und möglcihst teure Verkäufe. ihm ist es aber auch egal, wenn die Order nach 12 Stunden auslaufen - dann wird eben einfach eine neue Order gesetzt und da Spiel beginnt von Neuem.

Ob nun 12, 24 oder 48 Stunden richtig sind ... ich hab keine Ahnung, wer Backtests durchführt kommt je nach betrachtetem Zeitraum auf unterschiedliche "richtige" Zahlen, somit ist es fast egal wann die Order gelöscht wird ... es ist lediglich klar, dass sie "lang genug" und "nicht zu lange" stehen bleiben muss/darf. (diese Erkenntnis ergibt sich aus der Grenzwertbetrachtung)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für Deine ausführliche Erläuterung.

 

Sorry aber ich komme schon wieder nicht weiter.

Bot 1 läuft erstmal.

Nun wollte ich mal mit verschiedenen coins probieren und ich steh vor einer Wand.

Folgendes "problem" zeigt sich mir seit stunden und ich komm nicht dahinter 

2019-01-17 22:11:34: WARNUNG: Toleranzfaktor für LTC liegt über 50% bei 1189.1 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:11:34: WARNUNG: Toleranzfaktor für ADA liegt über 50% bei 1189.1 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:11:34: WARNUNG: Toleranzfaktor für XRP liegt über 50% bei 891.8 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:11:34: ; CSV; 1.81 BNB; BNB; 1.53; 40%; 545.69%; XRP; 0.28; BNB; 40%; 99.49%; ADA; 0; BNB; 30%; 0.51%; LTC; 0; BNB; 30%; 0%;
2019-01-17 22:11:34: Status: Portfolio: 1.81 BNB; BNB: 1.53 Soll: 40% Ist: 545.69%; XRP: 0.28 BNB Soll: 40% Ist: 99.49%; ADA: 0 BNB Soll: 30% Ist: 0.51%; LTC: 0 BNB Soll: 30% Ist: 0%;
2019-01-17 22:11:33: Bestand: 0.2 ADA
2019-01-17 22:11:33: Bestand: 5.3 XRP
2019-01-17 22:11:33: Bestand: 0 LTC
2019-01-17 22:11:33: Bestand: 1.52967586 BNB

---------------------------------------

name] => BNB
    [target_percentage] => 40
    [free] => 1.52967586
    [locked] => 0.00000000
    [virtual_balance] => 1.52967586
    [current_percentage] => 545.69305574383
    [deviation_percentage] => 13.642326393596
)
 So sieht nun unser Array __balanceBot_coins aus: 
Array
(
    [0] => Array
        (
            [name] => XRP
            [target_percentage] => 40
            [free] => 5.30000000
            [locked] => 0.00000000
            [price] => 0.05262000
            [price_24_high] => 0.05431000
            [price_24_low] => 0.05199000
            [tickSize] => 0.00001000
            [tickSizePrecision] => 5
            [minQty] => 0.10000000
            [minQtyPrecision] => 1
            [minNotional] => 1.00000000
            [virtual_balance] => 5.3
            [virtual_value] => 0.278886
            [current_percentage] => 99.48915160639
            [deviation_percentage] => 2.4872287901597
            [target_value] => 0.1121272
            [tolerance_factor] => 891.8
        )

wieso, weshalb, warum? Mein Basis coin wird mit unglaublichen 545% bewertet... somit fliegen alle anderen Coins ebenfalls mit hohen Prozentzahlen raus. Ich raff es einfach nicht..

wenn ich meine Basis BNB cointechnisch erhöhe...

2019-01-17 22:19:21: WARNUNG: Toleranzfaktor für LTC liegt über 50% bei 1187.3 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:19:21: WARNUNG: Toleranzfaktor für ADA liegt über 50% bei 1187.3 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:19:21: WARNUNG: Toleranzfaktor für XRP liegt über 50% bei 890.5 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:19:21: ; CSV; 4.1 BNB; BNB; 3.82; 40%; 1359.95%; XRP; 0.28; BNB; 40%; 99.49%; ADA; 0; BNB; 30%; 0.51%; LTC; 0; BNB; 30%; 0%;
2019-01-17 22:19:21: Status: Portfolio: 4.1 BNB; BNB: 3.82 Soll: 40% Ist: 1359.95%; XRP: 0.28 BNB Soll: 40% Ist: 99.49%; ADA: 0 BNB Soll: 30% Ist: 0.51%; LTC: 0 BNB Soll: 30% Ist: 0%;
2019-01-17 22:19:20: Bestand: 0.2 ADA
2019-01-17 22:19:20: Bestand: 5.3 XRP
2019-01-17 22:19:20: Bestand: 0 LTC
2019-01-17 22:19:20: Bestand: 3.81795836 BNB

oder reduziere.....

2019-01-17 22:24:54: WARNUNG: Toleranzfaktor für LTC liegt über 50% bei 1196.4 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:24:54: WARNUNG: Toleranzfaktor für ADA liegt über 50% bei 1196.4 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:24:54: WARNUNG: Toleranzfaktor für XRP liegt über 50% bei 897.3 ... prozentuale Aufteilung der Coins überarbeiten oder Seitenlinie reduzieren!
2019-01-17 22:24:53: ; CSV; 0.28 BNB; BNB; 0.01; 40%; 1.83%; XRP; 0.28; BNB; 40%; 99.49%; ADA; 0; BNB; 30%; 0.51%; LTC; 0; BNB; 30%; 0%;
2019-01-17 22:24:53: Status: Portfolio: 0.28 BNB; BNB: 0.01 Soll: 40% Ist: 1.83%; XRP: 0.28 BNB Soll: 40% Ist: 99.49%; ADA: 0 BNB Soll: 30% Ist: 0.51%; LTC: 0 BNB Soll: 30% Ist: 0%;
2019-01-17 22:24:51: Finde Preis für LTCBNB: 5.00000000 (24h high/low: 5.23000000 / 4.91000000)
2019-01-17 22:24:51: Finde Preis für ADABNB: 0.00715000 (24h high/low: 0.00760000 / 0.00702000)
2019-01-17 22:24:50: Finde Preis für XRPBNB: 0.05230000 (24h high/low: 0.05431000 / 0.05199000)
2019-01-17 22:24:50: Bestand: 0.2 ADA
2019-01-17 22:24:50: Bestand: 5.3 XRP
2019-01-17 22:24:50: Bestand: 0 LTC
2019-01-17 22:24:50: Bestand: 0.00510279 BNB

...der Bot läuft grad noch im TEST Modus....Ich glaub ich brauch da mal nen Tip. 😉

Wie gesagt Bot 1 funktioniert

Danke.....hab mal den bot aktiv gestellt und etwas am basis prozenten nach unten korrigiert...jetzt fängt er sich an einzupendeln.....ganz verstehen tu ichs aber dennoch nicht...nun gut funzt erstma....n8

 

Bearbeitet von creader
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

So, jetzt habe ich den Bot einmalig scharfgeschaltet, mit tradingfactor 40.

Das soll mich auf einen Schlag in die Nähe der 40-30-30-Verteilung bringen, ausgehend von 100-0-0... will ja nicht warten, bis sich der Bot mit 300-400 einzelnen Trades dahin geschaukelt hat. Schaumer mal...

Edit: Und schon ist teilweise gekauft worden. @Jokin: Als Toleranzfaktoren werden mir jetzt zweimal 4,1 und einmal 5,5 angezeigt,  CurrentPercentage um 67, 21 und 11. Ist das plausibel?

Sieht mir bis jetzt unverdächtig aus... aber es könnte natürlich schon sein, dass ich da einen falschen Fehler reinprogrammiert habe.

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

vor 3 Stunden schrieb Herr Coiner:

Edit: Und schon ist teilweise gekauft worden. @Jokin: Als Toleranzfaktoren werden mir jetzt zweimal 4,1 und einmal 5,5 angezeigt,  CurrentPercentage um 67, 21 und 11. Ist das plausibel?

Auf den ersten Blick kann das schon sein.

So sieht das bei mir gerade im Durchlauf aus:

Zitat

2019-02-05 13:00:56: BALANCE: ADA 0.988-0.082 = 0.906 < 1.012 < 1.07 = 0.988+0.082 => do nothing
2019-02-05 13:00:56: BALANCE: BNB 1.039-0.082 = 0.957 < 1.012 < 1.121 = 1.039+0.082 => do nothing
2019-02-05 13:00:56: BALANCE: NEO 0.98-0.062 = 0.918 < 1.012 < 1.042 = 0.98+0.062 => do nothing
2019-02-05 13:00:56: ; CSV; 0.57 ETH; ETH; 0.16; 40%; 40.47%; NEO; 0.16; ETH; 40%; 39.18%; BNB; 0.13; ETH; 30%; 31.16%; ADA; 0.12; ETH; 30%; 29.65%;
2019-02-05 13:00:56: Status: Portfolio: 0.57 ETH; ETH: 0.16 Soll: 40% Ist: 40.47%; NEO: 0.16 ETH Soll: 40% Ist: 39.18%; BNB: 0.13 ETH Soll: 30% Ist: 31.16%; ADA: 0.12 ETH Soll: 30% Ist: 29.65%;
2019-02-05 13:00:53: Finde Preis für ADAETH: 0.00035435 (24h high/low: 0.00035900 / 0.00035080)
2019-02-05 13:00:53: Finde Preis für BNBETH: 0.06639400 (24h high/low: 0.06663800 / 0.06447600)
2019-02-05 13:00:53: Finde Preis für NEOETH: 0.06562400 (24h high/low: 0.06661200 / 0.06500000)
2019-02-05 13:00:53: Bestand: 338.6 ADA
2019-02-05 13:00:53: Bestand: 1.89929161 BNB
2019-02-05 13:00:53: Bestand: 2.416 NEO
2019-02-05 13:00:52: Bestand: 0.16375129 ETH

Von unten nach oben:

Die Bestandsermittlung, da sollten keine Auffälligkeiten sein.

Dann die Preisermittlung, auch da sollte es keine Auffälligkeiten geben.

Dann der SOLL-IST-Abgeleich als Status-Ausgabe, da solltest Du Deine Prozent-Werte wiederfinden und erkennen wo der Bot gerade steht.

In meinem Fall hab ich derzeit etwas zu viel ETH, zu wenig NEO, zu viel BNB und zu wenig ADA.

Die Balance-Zeilen sind etwas kryptisch und wirklich schwer verständlich, ich hab noch keine Ahnung wie ich das vereinfachen soll ...

... bei NEO: "1.012 < 1.042" ... das ist schon knapp am Kauf dran ... wenn da "1.012 < 1.011" stehen würde, dann würde der Kauf getriggert werden.
... bei BNB: "0.957 < 1.012" ... ist noch etwas weit weg vom Verkauf, dauert noch bis der Verkauf getriggert wird.

Da kann man aber mal davon ausgehen sobald NEO gekauft wird, gerät das Gleichgewicht so weit in Schieflage, dass BNB verkauft wird, das macht ja angesichts der Kursentwicklung der beiden Coins auch Sinn.

Hier nochmal die Grafik dazu:

Unbenannt.png.fa59c67602cb90ffcb061cd648ce238a.png

Da sieht man auch ganz gut wie am 29.01.2019 BNB gekauft wurde und der ETH-Bestand nach unten gerauscht ist, der BNB-Wert bleibt scheinbar stabil.

Das hat mich gerade ein paar Minuten Analyse gekostet, da das so merkwürdig aussieht. Die Auflösung findet sich in den Detaildaten und die Bestätigung bei Coinmarketcap:

Unbenannt2.png.95508aaaeba4f7c20d1f47616736991f.png

Der BalanceBot hat diesen krassen Absturz von BNB mitgenommen indem er BNB nachgekauft hatte.

Später um den 2.2. herum hat der Balancebot dann BNB wieder verkauft als der Kurs stieg.

Damit hat er sich exakt so verhalten wie ich mir das vorgestellt habe - günstig kaufen und teuer verkaufen.

Derzeit sieht man wieder wie der BNB-Kurs weiter steigt und ein zu großes Gewicht im Portfolio erlangt - gleichzeitig ist Neo "untergewichtet" obwohl der NEO-Kurs nicht wirklich gefallen ist.

Daher wird als nächstes Neo gekauft und BNB verkauft (oder in umgekehrter Reihenfolge).

Der Vollständigkeit halber auch nochmal Statusmeldung zu den anderen Bots:

Der 10-ETH-Bot steht gerade bei 9,92 ETH
Der 20-ETH-Bot steht gerade bei 19,88 ETH
... beide quält der Absturz von XLM, das muss irgendwie erstmal wieder reingeholt werden. Nicht besonders förderlich ist zudem der Kursverlust von XRP. Auch das gilt es erstmal wieder reinzuarbeiten. Hier ist schon der Anspruch, dass er das aus eigener Kraft schafft.

Der 1,3x-ETH-Nachwuchs-Sparschwein-Bot läuft außer Konkurrenz, da er nun von mir ordentlich Referral-Boni bekommt.

 

 

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Jokin

ich bekomme seit heute Nacht folgende Fehlermeldung

signedRequest error: {"code":-1021,"msg":"Timestamp for this request was 1000ms ahead of the server's time."}

Und im folgenden Ablauf des Scriptes kommen alle möglichen Warnmeldungen.

Zitat

Warning: Illegal string offset 'side' in D:\xampp\htdocs\BalanceBot\index.php on line 117

Warning: Illegal string offset 'side' in D:\xampp\htdocs\BalanceBot\index.php on line 123

Warning: Illegal string offset 'side' in D:\xampp\htdocs\BalanceBot\index.php on line 130

Warning: Illegal string offset 'symbol' in D:\xampp\htdocs\BalanceBot\index.php on line 130

Warning: Illegal string offset 'origQty' in D:\xampp\htdocs\BalanceBot\index.php on line 130

Kannst du mir da weiterhelfen. Oder hat jemand anders eine Idee?

Wo muss ich ansetzen oder ist das ein Binance Problem?

Danke dir und schönen Tag noch

 

Bearbeitet von creader
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb creader:

Wo muss ich ansetzen oder ist das ein Binance Problem?

ich hatte das Problem auch mit dem Windows-Computer und XAMP, da lief die Zeit nicht mehr synchron.

Ich hab dann die Uhrzeit manuell umgestellt, da gab's dann nochmal andere Fehler von der Binance-API und dann wieder auf automatische Aktualisierung zurück, dann passte das.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Problem mit der Zeitsynchronisation hatte ich anfangs auch. Unter Windows habe ich dann NetTime installiert. Seither ist alles gut. Das Programm synchronisiert in regelmäßigen Abständen die Systemzeit mit einem Zeit-Server im Web.

@creader: Hast du ein Windows-System?

Möglicherweise braucht man NetTime gar nicht. Es gibt nämlich in der "Aufgabenplanung" (Systemsteuerung) den Service "Time Synchronization", der bei mir anscheinend nur einmal pro Woche läuft. Wenn man den Trigger ändert auf täglich, dann sollte es ja auch gehen.

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

@Jokin und @Herr Coiner

super... danke für die Tipps.. werd ich mal heute wenn etwas Zeit zwischen der Arbeit ist in Angrif nehmen.

Juhuu das wars...hat geklappt..

 

Und ja hab den Server auf einem Windowssystem laufen...vorerst...möchte mich in naher Zukunft aber auf das rasperry Projekt werfen....

 

Danke

 

 

Bearbeitet von creader
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 20 Stunden schrieb Jokin:

Daher wird als nächstes Neo gekauft und BNB verkauft (oder in umgekehrter Reihenfolge).

Exakt wie vorhergesagt, ist es auch passiert. Gestern abend wurden BNB verkauft und NEO gekauft. Heute früh wurden nochmal BNB verkauft und es wurden ADA gekauft.

Unbenannt.thumb.png.1c0a2f5b8bfbfe7cc99dc19ae14e7c19.png

Für den roten Gesamtportfoliowert muss ich die Skala bald verlängern :-)

Für die weitere Vorhersage wird es schwierig, denn ich glaube nicht, dass BNB noch weiter so krass ansteigt, daher sind zwei Szenarien möglich:
... derzeit ist der %-Wert der Basiswährung deutlich unter dem Soll, also sollte irgendetwas bald verkauft werden - da alle Coins auf ihrem Soll-Wert liegen wird es der Coin sein, der als nächstes "nach oben aus der Rolle fällt".
... sollte BNB jedoch wieder rapide fallen, dann wird das dazu führen, dass NEO oder ADA verkauft werden - je nachdem welcher Coin "langsamer fällt" oder "schneller steigt".

Das "langsamere Fallen" kann dazu führen, dass NEO oder ADA, die eben gerade gekauft wurden, mit Verlust wieder abgestoßen werden um die Balance wieder herzustellen.
... an der Stelle will ich natürlich genau wissen "wie schlimm" dieser Verlustverkauf sein wird, daher beobachte ich das hier ganz genau.

vor 20 Stunden schrieb Jokin:

Der Vollständigkeit halber auch nochmal Statusmeldung zu den anderen Bots:

Der 10-ETH-Bot steht gerade bei 9,92 ETH
Der 20-ETH-Bot steht gerade bei 19,88 ETH

Die beiden anderen relevanten Bots stehen nun bei 10,17 ETH und 20,14 ETH ... derzeit ist viel zu viel Bewegung im Markt um verlässliche Trendaussagen zu erzeugen, das kann morgen schon wieder bei 9,93 und 19,89 ETH stehen - wichtig ist für mich nur, dass es tendenziell nach oben geht - trotz eines sinkenden Gesamtmarktes.

Diagramme von den anderen beiden Bots lohnen sich nicht, die Bewegungen der Trades sind kaum sichtbar und verschwimmen in den Kursschwankungen.

... derzeit fehlen mir noch entscheidende Analysetools für Detailanalysen, immerhin sehe ich, dass im 20-ETH-Bot pro Tag ca. 120 Order erstellt werden von denen ca. 50 Order erfüllt werden - der Rest wird wieder entfernt, weil die Kurse drehten. Das zeigt mir, dass die Strategie der Preisermittlung für Order halbwegs passt.
Im 10-ETH-Bot sind es 40 erstellte und 10 gelöschte Order je Tag. Die Quote der erfüllten Order ist dort deutlich höher (warum auch immer ..)

Und dass ETH mit dem derzeitigen Kursverlust auch keine Freude bereitet steht nochmal auf einem ganz anderen Blatt.

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Cool. Mein Bot hat heute Nacht leider nichts gemacht, obwohl ich ihn zum ersten mal stündlich laufen lassen wollte. Liegt wohl daran, dass sich der Computer schlafen gelegt hat. Ziel ist natürlich auch, dass der Bot er am Ende auf einem Raspi läuft, dann kann Windows schlafen, solange es will :).

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 50 Minuten schrieb Jokin:

Für den roten Gesamtportfoliowert muss ich die Skala bald verlängern :-)

:lol: richtig gut wird's, wenn du eine logarithmische Skala brauchst.

Zitat

... derzeit fehlen mir noch entscheidende Analysetools für Detailanalysen

@JokinIch habe noch gar keine Tools dafür. Wie erstellst du eigentlich diese Grafiken? Irgendwie mit Excel, denke ich mal. Aber in Excel hab' ich leider eine Bildungslücke... besitze privat nicht mal das Office-Paket, nur OpenOffice. Würde trotzdem helfen, wenn ich wüsste, wie es ungefähr in Excel geht.

EDIT: Das mit den Grafiken hat sich schon erledigt: Ich werde wohl ChartJS einbauen. Damit sollte der Bot die Kurven direkt im Browser ausgeben können.

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

vor 43 Minuten schrieb Herr Coiner:

EDIT: Das mit den Grafiken hat sich schon erledigt: Ich werde wohl ChartJS einbauen. Damit sollte der Bot die Kurven direkt im Browser ausgeben können.

Oh, sehr cool!

Hab's mir gerade mal angeschaut. Das sieht ganz brauchbar aus für meine Zwecke, ich brauche ja ein einfaches xy-Punkt-Chart um die Linien darzustellen.

Da sollen dann noch jeweiligen Order rein (sell, buy) und mit deren Parametern als Tooltip und die Info ob erfüllt oder nicht. Auf einen blick sehe ich dann ob das sinnvoll war oder nicht. Und ich will reinzoomen können.

Derzeit nehme ich die "show_csv.php" (siehe github) und kopiere die Ausgabe in Excel, formatiere den Kram mit ein paar Klicks um und hab dann mein Diagramm. Das ist aber zu umständlich und bei meinem 20-ETH-Bot sind das auch jetzt schon zu große Datenmengen, da muss ich noch einiges optimieren.

Aber der Ansatz ist prima :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Jokin:

Und ich will reinzoomen können.

Ob man damit ohne weiteres zoomen kann weiss ich nicht.
EDIT: CanvasJS kann es auf jeden Fall (wird z.B. bei Kraken verwendet), aber es kostet Geld ($400) und wäre für wohl auch mit Kanonen auf Spatzen geschossen.

Zitat

Aber der Ansatz ist prima 🙂

Ja, dank Open Source muss man heutzutage nicht mehr jedes Detail selber programmieren.
Es ist eher wie bei Lego: Einfach die gewünschten Bausteine raussuchen und zusammenkleben 😎.
Das Finden der besten Bausteine ist da oft schwieriger als eigentliche der Einbau.

 

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

vor 11 Stunden schrieb Herr Coiner:

 

EDIT: Das mit den Grafiken hat sich schon erledigt: Ich werde wohl ChartJS einbauen. Damit sollte der Bot die Kurven direkt im Browser ausgeben können.

Chart.js tut's ganz gut - hab gerade mal auf die Schnelle die Daten aus der Datenbank anzeigen lassen. Mit noch etwas Bastelei und Feintuning ist das durchaus brauchbar 🙂

Nächste Woche hab ich hoffentlich etwas mehr Zeit, dann bastel ich da mal weiter dran rum. Auch wie man da saubere Datumswerte reinbringt und nicht nur Timestamps ... das wird wohl etwas kniffliger.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Prozent-Chart

Am 6.2.2019 um 22:26 schrieb Jokin:

Chart.js tut's ganz gut - hab gerade mal auf die Schnelle die Daten aus der Datenbank anzeigen lassen. Mit noch etwas Bastelei und Feintuning ist das durchaus brauchbar 🙂

Ja, klappt: Mein Bot kann jetzt die Charts zeigen... aber man will es nicht immer sehen ;). Da sind wohl wegen des Bitcoin-Anstiegs einige in den Keller gegangen... hab's nicht wirklich verfolgt.

Verlinkt ist der Verlauf vom 11.2.19 mittags bis jetzt (18.2.19 11 Uhr).
Die Skala für die rote Linie ist links (Gesamt-Portfoliowert in ETH), für die anderen rechts (virtueller Wert in ETH).

EDIT: Und hier noch der Prozent-Chart. Die Skala für ETH und NEO ist links, für die anderen rechts. Man kann schön sehen, wie sie jeweils um ihren Soll-Wert tanzen.


 

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

 

vor 2 Stunden schrieb Herr Coiner:

Mein Bot kann jetzt die Charts zeigen...

Das sieht prima aus!

Willste da nicht mal posten wie Du das gemacht hast? Ich hab nur meine kurzfristige Bastelei damit mal gemacht und mich dann aufgrund des Wetters meinem Garten gewidmet damit der mal wieder schön wird :-)

vor 2 Stunden schrieb Herr Coiner:

EDIT: Und hier noch der Prozent-Chart. Die Skala für ETH und NEO ist links, für die anderen rechts. Man kann schön sehen, wie sie jeweils um ihren Soll-Wert tanzen.

Prima, dann funktioniert das so wie geplant :-)

vor 2 Stunden schrieb Herr Coiner:

aber man will es nicht immer sehen

Hihi - ja, das erlebe ich auch gerade. Ich handel ja gegen ETH und da ETH gerade massiv gestiegen ist, sind die anderen "relativ" zu ETH massiv gefallen.

Da ging ETH ja von unter 90 Euro auf über 120 Euro rauf - eigentlich klar, dass da die anderen Coins nicht so schnell hinterher kommen.

Was jedoch sicher sehenswert wäre, wäre der "Durchschnitts-Ankaufpreis" - ich hab mir dazu auf die Schnelle ein Miniskript gebaut, welches mir mit jedem durchgeführten Trade den durchschnittlichen Kurs ermittelt. Da der Bot "in der Regel" höhere SELL-Order und niedrigere BUY-Order erstellt sollte sich zeigen, dass der durchschnittliche Kurs stetig fällt.
Derzeit schaue ich mir wöchentlich die aktuellen Durchschnittskurse an, schreibe sie auf und schaue dann ob die Verbesserung da ist und wenn nicht, wieso nicht - 90% der Kurse verbessern sich und die anderen 10% sind mit Ausreißern oder veränderndem Bestand zu erklären. So grob über den Daumen gepeilt passt das schon. :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb Jokin:

Das sieht prima aus!

Willste da nicht mal posten wie Du das gemacht hast? Ich hab nur meine kurzfristige Bastelei damit mal gemacht und mich dann aufgrund des Wetters meinem Garten gewidmet damit der mal wieder schön wird 🙂

Mal sehen ob ich diese Woche noch Zeit finde etwas zusammenzustellen. Es passiert paktisch alles im Browser. Serverseitig kann ich nicht viel helfen, weil mein Bot ja in Go programmiert ist, nicht in PHP . Aber der Server muss ja nur die Daten etwas vorkauen, d.h. im JSON-Format

  1. die DB-Tabelle rausschreiben (in ein HTML-Tag)
  2. die Chart-Konfiguration rausschreiben (in ein weiteres HTML-Tag)

Den Rest macht der Browser mit Hilfe von paar zusamengeklaubten Scripts und etwas eigenem Code als jQuery-Widget, damit man gleich mehrere Charts mit dem gleichen Code anzeigen kann. Die beiden Charts, die ich oben verlinkt habe, haben dieselben Datensätze als Grundlage und werden gleich hintereinander weg dargestellt. Es gibt halt zwei verchiedene Chart-Konfigurationen, die der Server rausschreibt, d.h. welche Tabellenspalten mit welchen Farben auf welchen vertikalen Achsen auszugeben sind.
 

Zitat

Prima, dann funktioniert das so wie geplant 🙂

Ja, funktioniert einwandfrei... ich habe schon richtig Vertrauen in deine Strategie gefasst :). Eigentlich kann da kaum was schiefgehen, wenn man nicht gerade ein Vermögen investiert. Für den Anfang zum Rumspielen mit einem Bot ist es jedenfalls perfekt.

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

vor 51 Minuten schrieb Herr Coiner:

Für den Anfang zum Rumspielen mit einem Bot ist es jedenfalls perfekt.

Genau dafür ist es ja auch gedacht 🙂

Der nächste Hype kommt bestimmt und die Zeit bis dahin nutze ich selber um meine Strategien zu optimieren und auch zu streuen um nicht alles auf eine Karte zu setzen.

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.