Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 3)


Empfohlene Beiträge

Hallo zusammen,

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

1. Binance-Account einrichten
2. Google-Auth und Binance-API auf Binance einrichten
3. Binance-API-Programmcode laden und ihn in unseren Webspace schieben
4. Binance-API ansprechen und eigene Balance laden
5. Array-Struktur
6. Basiswährung und Coins inkl. Parameter definieren
7. Kurse zu unseren Coins ermitteln
8. Trading-Rules ermitteln

1. Binance-Account einrichten

Zuerst braucht jeder einen Binance-Account. Da ich hier eine Menge Zeit (heute 3 Stunden für diesen Post) und Arbeit (Fluchen über Windows-Notebook) investiere bitte ich Euch meinen Ref-Link zu benutzen um Euch einen neuen Binanceaccount anzulegen: https://www.binance.com/?ref=28506673  - auch wenn Ihr bereits einen Binance-Account habt, so rate ich Euch dazu niemals einem Bot den Zugriff auf Euer gesamtes Binance-Vermögen zu gewähren. Auch nicht, wenn Ihr ihn selbst programmiert. Teilt ihm "Spielgeld" zu welches der Bot verwalten darf. In Bot-verwalteten Accounts sollte auch nicht manuell getradet werden - der Bot wird Euch in Eure Tradingstrategie schießen.

Es gibt kein Verbot mehrere Accounts bei Binance zu besitzen. Diese Accounts sollten nur nicht von anderen eigenen Accounts referred werden und sie müssen unterschiedliche eMail-Adressen haben.

2. Google-Auth und Binance-API auf Binance einrichten

Zuerst aktiviert Ihr bei Binance, dass Ihr Gebühren immer mit BNB bezahlt, damit erhaltet Ihr vergünstigte Gebührensätze. Ihr solltet dafür auch BNB besitzen, also könnt Ihr gleich mal einee Buy-Order für BNB anlegen und damit ein wenig üben.

Um eine Buy-Order anzulegen braucht Ihr natürlich irgendwelche Coins bei Binance, in BNB kann fast alles getauscht werden, ich empfehle ETH, BSV oder BCH bei Bitcoin.de (oder sonstwo) zu kaufen und das dann zu Binance zu schicken - (für BTC sind die Transaktionsgebühren höher als bei den anderen dreien)

Als Nächstes aktiviert Ihr 2FA. Ich empfehle GoogleAuth, denn das könnt Ihr auf beliebigen Smartphones einrichten (16-Zeichen-Code nie verlieren!). SMS-Authentifizierung macht Euch abhängig von der SIM-Karte. Ist die weg, geht die Rennerei richtig los.

Der dritte Schritt ist die Einrichtung der API.

01-binance.thumb.png.362eeeb226ea4464f75752033d52a669.png

Ihr werdet aufgefordert eiinen Namen für den API-Key zu vergeben. Karl, Gustav oder Balancebot oder sowas ...

... nun müsst Ihr Euren Google-Auth-Key eingeben und dann erhaltet ihr eine eMail mit einem Bestätigungslink.

Erst wenn Ihr den anklickt erhaltet Ihr zwei Zeichenfolgen:

"API Key" und "Secret Key" - damit kann ein externes Programm auf Euren Binance-Account zugreifen, was wir im weiteren Verlauf auch tun werden. Sendet Euren Key niemals an andere - auch nicht Teile davon. Den Key im Beispiel habe ich nur für Screenshot und Codeschnippsel angelegt. Ich habe ihn danach wieder entfernt.

02-binance.thumb.png.b867b10dcc745c78d34fada27c8e0593.png

Fügt nun diesen Codeschnipsel in Eure config.php ein und tragt Eure beiden Keys dort ein - denkt daran, dass die Datei auch nicht in fremde Hände kommen sollte. also nicht in Cloud-Backups und nicht auf unverschlüsselte Backup-Datenträger.

// Abschnitt config.php 2: Binance-API 
$__binance_APIkey = "he5JIjiJL4QVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwzhuguNFIJXIlAoNc";
$__binance_APIsecret = "QrrtlQiErtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoCIfkiuZUb3128L";

3. Binance-API-Programmcode laden und ihn in Euren Webspace schieben

Über Google "binance api github php" gelangt Ihr zum Download des Binance-API-PHP-Codes:
https://github.com/jaggedsoft/php-binance-api

Ladet dort einfach nur die Datei "php-binance-api.php" runter oder legt selbst eine Datei mit diesem Namen an und kopiert den Code dort hinein.

Diese Datei gehört auch in Euren Webspacce, also in das htdocs-Verzeichnis wo auch config.php, index.php und so liegen.

4. Binance-API ansprechen und eigene Balance laden

Nun haben wir alle Vorbereitungen getroffen um uns der index.php zu widmen und das erste Mal Daten über die API zu erhalten. Mittlerweile sollte auf Eurem Account auch schon irgendwas an Bestand angekommen sein und Ihr habt vielleicht auch schon einen BNB erfolgreich gekauft.

Abschnitt 4.1 brauchen wwir nicht mehr - also auskommentieren oder gleich ganz raussschmeißen:

// Abschnitt index.php 4.1: 
// Nun benutzen wir die Funktion um eine Nachricht in die Datenbank zu schreiben. 
// update_messages("Hallo Welt!"); 

Nun geht's endlich mal richtig los

Wir fügen nun den Abschnitt 8 ein und machen mal einen Platzhalter für Abschnitt 8.1
require_once: Damit laden wir den API-Code (wie bei der config.php auch schon)
Dann erzeugen wir uns eineen Handler (einen "Anfasser" um mit Binance zu kommunizieren)
Und wir prüfen mal kurz ob die API ansprechbar ist.

// Abschnitt index.php 8: 
// Binance-API anbinden
require_once ("php-binance-api.php"); // Binance-API Code laden
$binance_api_handler = new Binance\API($__binance_APIkey ,$__binance_APIsecret);
// prüfen ob die Binance-API tatsächlich angesprochen werden kann
if (!$binance_api_handler){
    update_messages ("FEHLER: 'binance_api_handler' nicht vorhanden");
}

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

Dies nun speichern (und eventuell mal wieder auf den Webserver hochladen, wer nicht XAMPP nutzt) und im Browser wie üblich aufrufen: http://localhost/BalanceBot/

Keine Fehlermeldung -> Prima, Ihr seid mit der API verbunden.

Nun lesen wir mal unsere Account-Balance aus und lassen uns die ausgeben.

in Abschnitt 5 fügen wir eine Funktion "update_accountinfo()" ein, die werden wir noch etwas erweitern, denn damit erhält der Bot die aktuellen Balances, also die Anzahl der Coins.
Oben stehen drei Zeilen mit "global". Damit  machen wir in der Funktion Variablen des Hauptprogramms zugänglich.
Den API-Handler brauchen wir natürlich in der Funktion.
Zu den anderen beiden Variablen kommen wir im nächsten Agenda-Punkt mit deren Erklärung, damit wir etwas Zeit sparen: einfach mit reinkopieren.

// Abschnitt index.php 5: 
function update_accountinfo(){

	global $__balanceBot_coins; // der Status steht in unserem "Master"-Array zusammen mit allen anderen Daten
	global $__balanceBot_basecurrency;
	global $binance_api_handler; // den Binance-API-Handler brauchen wir in unserer Funktion.

	// Nun wollen wir wissen wieviel Coins wir insgesamt in unserem Portfolio haben (Teil 4)
	// Dazu senden wir eine entsprechende Anfrage an Binance und schauen uns an was da zurück kommt.
	$array_binance_account = $binance_api_handler->account();

	echo "<pre> Das sind unsere Account-Daten, die Binance zurück gibt<br>";
	print_r($array_binance_account);
	echo "</pre>";

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

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

Natürlich müssen wir die Funktion auch im Hauptprogramm aufrufen:

// Abschnitt index.php 8.1: 
// nun aktualisieren wir all unsere Account-Infos ... siehe oben bei der Funktionsdeklarierung
update_accountinfo();

Nun könnt Ihr das wieder im Browser aufrufen.

(Ich habe eben mit XAMPP einen Fehler erhalten, dass meine lokale Zeit 1000ms vor der Binance-Serverzeit ist. Lösung: Apache in XAMPP stoppen und erneut starten)


5. Array-Struktur

Ihr seht nun so eine Ausgabe:

Array
(
    [makerCommission] => 10
    [takerCommission] => 10
    [buyerCommission] => 0
    [sellerCommission] => 0
    [canTrade] => 1
    [canWithdraw] => 1
    [canDeposit] => 1
    [updateTime] => 1546852554642
    [balances] => Array
        (
            [0] => Array
                (
                    [asset] => BTC
                    [free] => 0.00558100
                    [locked] => 0.00000000
                )

            [1] => Array
                (
                    [asset] => LTC
                    [free] => 0.00000000
                    [locked] => 0.00000000

                )

[...]

            [158] => Array
                (
                    [asset] => REN
                    [free] => 0.00000000
                    [locked] => 0.00000000
                )

        )

)

Herzlichen Glückwunsch: Ihr könnt schonmal Euren Bestand abfragen ohne Euch auf Binance einloggen zu müssen.

Die Daten sind jedoch noch etwas kryptisch. Besonders spannend: Sie liegen in einer Array-Struktur vor.
Das Unterarray mit dem Namen "balances" enthält duchnummeriert jeweils den Namen des Coins, die Anzahl der Coins die nicht in offenen Orders gebunden sind und die, die eben derzeit in SELL-Order gebunden sind.

Diese Array-Struktur wird uns ab jetzt das ganze weitere Leben verfolgen - mein Rat: Lernt Arrays zu lieben, denn sie lieben auch Euch :D

6. Basiswährung und Coins inkl. Parameter definieren

Denn nun fangen wir an unsere Coins und Vorgaben zu definieren - natürlich in Array-Form! Denn wir lieben Arrays :D

Parameter und Konfigurationen schreiben wir in die config.php:

// 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" => "USDT",
					// "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" => "BTC",
						// "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" => "ETH",
						"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!
					);

Das Array "$__balanceBot_basecurrency" enthält unseren Basiscoin - ich empfehle erstmal die Einstellungen so zu übernehmen, die passen für einen 100-USDT-Portfoliowert und alles was da drüber liegt.

Das Array "$__balanceBot_coins" enthält weitere Unterarrays mit allen vom Bot verwalteten Coins. Hier wieder mein Beispiel mit BTC, ETH und ADA.
In den Kommentaren des Codes habe ich noch weitere Infos eingefügt.
Zum einen, dass das letzte Array-Alement kein Komma bekommt, da hat sich schon jeder Programmierer mal die Haare raufen dürfen.
Und zum anderen was die Werte bedeuten.

Diese Werte gehören schon zur Strategie, die ich in Lektion 5 nochmal aufgreife. Ich plane auch noch ein paar Grafiken zu erstellen, denn in Lehrbüchern habe ich diese Strategie noch nicht finden können, denn das ist nicht mehr nur reines Re-Balancen sondern Re-Balancen mit Seitenlinie zur Absicherung des Portfolios durch einen Stablecoin.

Natürlich lassen sich als Basiswert auch BTC, ETH oder BNB benutzen, ich rate  Euch erstmal mit USDT zu testen und erst Wochen später das Risiko bei Bedarf zu erhöhen. Natürlich steigen die Chancen auch mit dem Risiko. Ziel des Workshops ist jedoch erstmal ein risikoarmes automatisiertes Re-Balancen.

So, mit dem vorstehenden Codeschnipsel erklären sich auch die weiteren beiden "global"-Zeilen in dem vorherigen Agenda-Punkt.

Diese Arrays wollen wir nun mit den Werten aus der API auffüllen damit wir alle wichtigen Daten beisammen haben, denn der Bot muss darauf direkt und schnell zugreifen können.

Wir erweitern nun unsere Funktion "account_info()":

	// Abschnitt index.php 5.1: 
	// ok, nun wissen wir, dass in dem Array unter "balances" je Asset unser Bestand steht
	// Also können wir in einer foreach-Schleife die zurückgegebenen Daten durchsuchen ob wir unsere Basiswährung finden
	foreach ($array_binance_account['balances'] as $key => $array_account_coin){

		// wenn das Asset dem Namen unserer Basis-Währung entspricht, haben wir unseren Basis-Coin gefunden
		if ($array_account_coin['asset'] == $__balanceBot_basecurrency['name']){
			// "locked" sind die Coins, für die gerade offene Order angelegt sind, "free" sind die noch verfügbaren Coins für neue Order
			$message = "Bestand: ".($array_account_coin['free'] + $array_account_coin['locked'])." ".$array_account_coin['asset'] ." ";
			update_messages($message); // Message in DB schreiben und ausgeben.
		
			// wenn wir den Bestand gefunden haben, können wir den auch gleich in unser Array zum basiscoin aufnehmen:
			$__balanceBot_basecurrency['free'] = $array_account_coin['free'];
			$__balanceBot_basecurrency['locked'] = $array_account_coin['locked'];
		}

	}

Wir sehen nun das erste Mal eine "foreach"-Schleife. Diese dient dazu ein Array zu durchlaufen und den Code innerhalb der Schleife auf jedes Element des Arrays anzuwenden.

Wir durchlaufen also das Rückgabeergebnis von Binance und mit der "if"-Funktion prüfen wir ob der Name des aktuellen Elements dem Name dem Namen unserer Basiswährung entspricht.

Haben wir einen Treffer, dann geben wir erstmal eine Nachricht aus damit wir das später in unseren Log-Einträgen sehen und wir übernehmen die "free"- und "locked"-Werte i unser Array der Basiswährung.

Den Spaß müssen wir auch nochmal mit den Coins machen:

	// Abschnitt index.php 5.2: 

	// ... und ob wir unsere Coins finden, die der BalanceBot verwalten soll
	// Da wir jedoch mehr als nur einen Coin von unserem Bot verwalten lassen, müssen wir für jeden Coin, der von Binance zurück kommt
	// in einer weiteren foreach-Schleife die zu verwaltenden Coins gegenchecken, also eine Stufe schwerer als für die Basis-Währung.
	foreach ($array_binance_account['balances'] as $key => $array_account_coin){

		foreach ($__balanceBot_coins as $key => $array_coin){
			// wenn das Asset dem Namen unseres Coins entspricht, haben wir unseren Coin gefunden
			if ($array_account_coin['asset'] == $array_coin['name']){
				// "locked" sind die Coins, für die gerade offene Order angelegt sind, "free" sind die noch verfügbaren Coins für neue Order
				$message = "Bestand: ".($array_account_coin['free'] + $array_account_coin['locked'])." ".$array_account_coin['asset'] ." ";
				update_messages($message); // Message in DB schreiben und ausgeben.
		
				// wenn wir den Bestand gefunden haben, können wir den auch gleich in unser Array zum Coin aufnehmen:
				$__balanceBot_coins[$key]['free'] = $array_account_coin['free'];
				$__balanceBot_coins[$key]['locked'] = $array_account_coin['locked'];
			}
		}
	}

Eigentlich wie vorher, nur durchlaufen wir nun alle unsere Coins, die wir alls Unterarray in "$__balanceBot_coins" definiert haben und fügen zu jedem Coin seine free- und locked-Werte hinzu.

Wir wollen nun sehen wie unsere Arrays aussehen, die wir in config.php anlegten und um die Werte von Binance erweitert haben, das machen wir mit "print_r" und dem HTML-Tag "<pre>" welches das Ergebnis genauso auf dem Bildschirm ausgibt wie es von PHP kommt.

// Abschnitt index.php 8.1: 
// nun aktualisieren wir all unsere Account-Infos ... siehe oben bei der Funktionsdeklarierung
update_accountinfo();

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

Das Ganze speichern und im Browser anschauen.


7. Kurse zu unseren Coins ermitteln

Wenn wir nun unseren Bestand kennen, was liegt da näher als auch die Kurse zu den Coins zu ermitteln?

Los geht's!

// Abschnitt index.php 9: 
// Nachdem wir nun die Binance-API eingebunden haben, nutzen wir sie auch mal und fragen die Kurse ab
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']);	

	// echo "<pre> Dieses Array array_binance_prevDay gibt uns Binance zurück: <br>";
	// print_r($array_binance_prevDay);
	// echo "</pre>";
	
	// 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.
	}
}

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

Wir durchlaufen wieder unser vordefiniertes Array "$__balanceBot_coins" - das mit der Basiswährung müssen wir nicht durchlaufen, der Kurs von 1 USDT beträgt immer 1 USDT, wie praktisch!

Wir fragen Binance nach den Daten "prevDay" - wer in die Datei "php-binance-api.php" schaut, wird sehen, dass damit die "24hr"-Werte abgerufen werden. Darin sind die High- und Low-Kurse der letzten 24 Stunden enthalten, die brauchen wir für unsere Basisstrategie.
Wichtig: Wir fragen die API nicht nur nach "BTC" sondern nach "BTCUSDT" indem wir die Zeichenketten mit einem Punkt verbinden: "$__balanceBot_coins[$key]['name'].$__balanceBot_basecurrency['name']"

Nach dem Binance-API-Aufruf fragen wir ab ob wir einen Wert in "lastPrice" haben - wenn nicht, gibt es einen entsprechenden Fehler-Eintrag im Log.

Und wenn wir einen "lastPrice" haben, dann übernehmen wir den als "price" und die high- und low-Werte übernehmen wir auch gleich.

Mit den "print_r"-Zeilen lassen wir uns die Arrays wieder ausgeben damit wir sehen was der Bot da reingeschrieben hat.

Speichern und im Browser angucken. Nun müssen die neuen Werte korrekt im Array stehen.


8. Trading-Rules ermitteln

Und wenn wir schonmal dabei sind, dann befassen wir uns auch gleich mit den "Trading-Rules".

Jede Exchange hat gewisse Vorgaben mit wieviel Nachkommastellen die Order gesetzt werden dürfen, welches minimale Tradingvolumen in einer Order platziert werden muss und und ein bisschen mehr.

Das stellt Binance natürlich auch über die API zur Verfügung, wir müssen nur die wesentlichen Werte in unser Array übernehmen.

// Abschnitt index.php 11: 
// Bevor wir überhaupt irgendwelche Order erstellen müssen wir die Regeln kennen wie Order erstellt werden dürfen.
// Zum Beispiel mit wieviel Dezimalstellen Preise und Coinanzahl übermittelt werden dürfen.
$array_binance_exchangeInfo = $binance_api_handler->exchangeInfo();

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

In diesem Array stehen irre viele Daten (besser gleich wieder auskommentieren) -  für uns wichtig sind PRICE_FILTER, LOT_SIZE und MIN_NOTIONAL:

// Abschnitt index.php 11: 
// Bevor wir überhaupt irgendwelche Order erstellen müssen wir die Regeln kennen wie Order erstellt werden dürfen.
// Zum Beispiel mit wieviel Dezimalstellen Preise und Coinanzahl übermittelt werden dürfen.
$array_binance_exchangeInfo = $binance_api_handler->exchangeInfo();

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

// Für jeden meiner Coins ermittle ich nun die minimale handelbare Coin-Anzahl und die Minimum-Beträge, die es zum Traden braucht
foreach ($__balanceBot_coins as $key => $array_coin){
	// Und je Coin muss ich den Kram durchwühlen, den ich von Binance bekommen habe
	foreach ($array_binance_exchangeInfo['symbols'] as $entry){
		if ($entry['symbol'] == $array_coin['name'].$__balanceBot_basecurrency['name']){

			foreach ($entry['filters'] as $filters){
				// Mindestanzahl an Coins, die getradet werden dürfen, bzw. die Anzahl der Nachkommastellen
				if ($filters['filterType'] == "LOT_SIZE"){
					$__balanceBot_coins[$key]['minQty'] = $filters['minQty'];
					// nun wird es besonders knifflig.
					// Binance gibt die Min-Quantity als "0.00000100" an, das bedeutet, ich muss später auf 6 Stellen genau runden.
					// Nun muss die "0.00000100" zur "6" werden .. das ist der Absolutwert der abgerundeten Ganzzahl des Log10 (fragt mich nicht, wie ich drauf kam ...)
					$__balanceBot_coins[$key]['minQtyPrecision'] = abs(floor(log10($__balanceBot_coins[$key]['minQty'])));
				}
				// Mindestbetrag, der getradet werden darf. (In der Regel 10.00000000)
				if ($filters['filterType'] == "MIN_NOTIONAL"){
					$__balanceBot_coins[$key]['minNotional'] = $filters['minNotional'];
				}
				// Mindestbetrag je Coin, bzw. die Rundungsgenauigkeit für Preise
				if ($filters['filterType'] == "PRICE_FILTER"){
					$__balanceBot_coins[$key]['tickSize'] = $filters['tickSize'];
					$__balanceBot_coins[$key]['tickSizePrecision'] = abs(floor(log10($__balanceBot_coins[$key]['tickSize'])));
				}
			}
		}
	}
}

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

Speichern und nochmal im Browser angucken, dass jeder Coin nun nochmal 5 weitere Werte bekommen hat - diese brauchen wir später um Order zu erstellen, die von Binancee nicht abgewiesen werden.

.. der aufmerksame Leser bemerkt dieses Konstrukt: "abs(floor(log10($__balanceBot_coins[$key]['minQty'])))" ... ich sehe keine einfachere Möglichkeit zuverlässig von "0,001" auf "3" zu kommen, denn später wird mit "3" gerundet um eine Zahl mit nur 3 Nackommastellen zu erhalten.
In der Funktion nehme ich erst den Logarithmus zur Basis 10, da kommt 3 raus - davon schneide ich mit "floor" zur Sicherheit die Nachkommastellen ab und mit "abs" nehme ich den Absolutwert, denn log10 liefert negative Werte für Werte unter 1. (nur aus dem Gedächtnisprotokoll, ich hab's nicht nachgerechnet)

So, und das reicht für diese 3. Lektion.

Die fertigen Dateien liegen auch bei https://github.com/Jokin-BalanceBot/BalanceBot  zum Download falls Ihr Euch verheddert. Ich rate jedoch dazu, dass Ihr euch mit den Codezeilen mal beschäftigt und versteht was sie tun. Insbesondere wie die Werte von Arrays angesprochen werden, was das "$key" dort macht  und so. Im weiteren Verlauf wird es immer wieder um Arrays gehen.

 

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

Am 9.1.2019 um 01:39 schrieb Jokin:

// Abschnitt index.php 5:
function update_accountinfo() {
[...]
// Nun wollen wir wissen wieviel Coins wir insgesamt in unserem Portfolio haben (Teil 4)
// Dazu senden wir eine entsprechende Anfrage an Binance und schauen uns an was da zurück kommt.
$array_binance_account = $binance_api_handler->account();

echo "<pre> Das sind unsere Account-Daten, die Binance zurück gibt<br>";
print_r($array_binance_account);
echo "</pre>";
[...]
}

Frage zu echo-print hier:
Brauchen wir diese Ausgabe unbedingt oder ist das hier nur anfänglich zur Kontrolle und fällt später evtl. wieder raus?

In Go habe ich nämlich das Problem, dass mir die Client-API kein Array zurückgibt, das man einfach echo-print-ähnlich zum Browser rausschicken kann, sondern ich bekomme eine Go-Stuktur, die ich zur Ausgabe extra wieder ins ursprüngliche JSON-Format konvertieren muss.

Wenn diese Ausgabe im weiteren Verlauf nicht wirklich noch gebraucht wird, würde ich an dieser Stelle lieber darauf verzichten. Im Debug-Modus kann ich bei Bedarf auch genau sehen, was da zurückgekommen ist.

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

vor 38 Minuten schrieb Herr Coiner:

Brauchen wir diese Ausgabe unbedingt oder ist das hier nur anfänglich zur Kontrolle und fällt später evtl. wieder raus?

Das ist nur zur Kontrolle, dass die Daten so verarbeitet werden wie es erwartet wird. Das kann später wieder raus und wird dann auch mit "/* ... */" als Block oder mit "//" zeilenweise auskommentiert, so kann man den Code zum Debuggen später nochmal erneut verwenden.

vor 40 Minuten schrieb Herr Coiner:

In Go habe ich nämlich das Problem, dass mir die Client-API kein Array zurückgibt, das man einfach echo-print-ähnlich zum Browser rausschicken kann, sondern ich bekomme eine Go-Stuktur, die ich zur Ausgabe extra wieder ins ursprüngliche JSON-Format konvertieren muss.

Ah, gut zu wissen - ja, in der Tat ist dieses "print_r()" in PHP super komfortabel, was auch ein Grund dafür ist, dass ich gern möglichst viel in eine Array-Struktur stopfe noch bevor ich das JSON-Format kennen lernte.

vor 41 Minuten schrieb Herr Coiner:

Wenn diese Ausgabe im weiteren Verlauf nicht wirklich noch gebraucht wird, würde ich an dieser Stelle lieber darauf verzichten. Im Debug-Modus kann ich bei Bedarf auch genau sehen, was da zurückgekommen ist.

Ich rate auch dazu nicht zuviel Aufwand in die Anzeige von Debug-Informationen aufzuwenden.

Im weiteren Verlauf landen eh alle relevanten Informationen in der Datenbank :-)

... und einen wirklich einfachen Debug-Mode kenne ich bei PHP nicht, wenn das bei Go einfacher ist - nur zu :-)

  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah gut :) Dann lass' ich die Ausgabe hier mal weg.

vor 8 Stunden schrieb Jokin:

... und einen wirklich einfachen Debug-Mode kenne ich bei PHP nicht, wenn das bei Go einfacher ist - nur zu 🙂

Vielleicht ist ja das ja was brauchbaresPHP Debugging mit Visual Studio Code und Xampp - YouTube

Du müsstest dazu auf den Open Source Editor Visual Studio Code umsteigen. Den kann ich sehr empfehlen. Man kann mit GitHub kommunizieren, Betriebssystem-Befehle absetzen, Code-Highlighting, Syntaxprüfung, Debugging uvm. sind dabei... Und er kommt mit allen möglichen Sprachen klar: Python, JavaScript, PHP, Go, C# und und und. Einfach die gewünschten Plugins  runterladen (werden zur Auswahl angeboten) und schon kann man loslegen.

Anfangs etwas gewöhnungsbedürftig, z.B. weil man immer erst ein Verzeichnis auswählen muss, in dem man dann den Quellcode für's Projekt erstellt bzw. lädt. Am besten zuerst ins Verzeichnis wechseln und einfach den Editor mit dem Befehl "Code" von der OS-Kommandozeile starten. Will man ein anderes Verzeichnis haben, dann muss man den Editor erst schliessen. Es gibt auch ein Erklär-Video irgendwo, nur finde ich es gerade nicht. Für den Anfang ist sowas aber gut für den ersten Überblick, dann muss man nicht alles selber rausfinden durch Versuch und Irrtum. Man kommt aber schnell rein.

 

Bearbeitet von Herr Coiner
Link auf Video in deutsch ergänzt
  • Thanks 2
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 9.1.2019 um 01:39 schrieb Jokin:

// Und je Coin muss ich den Kram durchwühlen, den ich von Binance bekommen habe 
foreach ($array_binance_exchangeInfo['symbols'] as $entry){ 
	if ($entry['symbol'] == $array_coin['name'].$__balanceBot_basecurrency['name']){
[...]

 

Also sowas geht viel eleganter. Such' mal nach Linq für PHP, z.B. hier.

Linq kommt aus der MS .Net Welt und ich möchte es nicht mehr missen. Es ist eine Art Abfragesprache ähnlich wie für Datenbanken, z.B. wenn man aus eine langen Liste etwas bestimmtes raussuchen möchte.

Das passende "symbol" aus der Liste bekommt man etwa so (C# Syntax):

var mySymbol = array_binance_exchangeInfo["symbols"].FirstOrDefault(entry => entry["symbol"] == balanceBot_basecurrency['name']);

Danach hat man schon das "symbol", wenn es existiert, sonst null.

Und das ist längst nicht alles. Linq ist ziemlich mächtig. Für PHP gibt's das anscheinend auch. Man erspart sich viele verschachtelte Schleifen.
Hab's für Go auch importiert.

EDIT: Sorry, falscher Thread. Wollte das hier nicht zumüllen mit Programmiervorschlägen :blink:

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

  • 3 Monate später...

Hmm,

das scheint mir ein Konfigurationsproblem auf Deinem Server zu sein.

Der Balance-Bot nutzt die Original-Binance-PHP-Implementierung
... die nutzt Curl, also eine Standarderweiterung
... und Curl nutzt SSL
... SSL braucht gültige Zertifikate
... und diese sind auf Deinem Server offenbar nicht gültig.

@skunk könnte da vielleicht einen Tipp geben.

Auf was für einem Server hast Du das laufen? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist nicht die Programmierung sondern Deine Umgebung.

Dein WAMP hat ein Problem mit dem SSL-Zertifikat. 

Wie hast Du Dein WAMP aufgesetzt? Welche Software hast Du dazu benutzt?

(ich bin zwar kein Windows-User, versuch's aber dennoch mal mit Dir hinzubekommen)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm, auf die Schnelle finde ich da nichts im Internet.

Hast Du die Change eine andere WAMP-Installation zu nutzen? (das wäre einfacher als wenn ich meinen alten Windows-Rechner durchupdate und dann da dann diese Installation draufpacke) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zuerst versuch mal in der config.php Deinen API-Key zu "verfälschen", also z.B. ein Zeichen anhängen.

Danach sollte es eine Fehlermeldung von der Binance-API geben, dass der Key nicht stimmt.

Wahrscheinlich erhältst Du jedoch wieder einen CURL-Fehler?

... ich hab mir gerade mal die Binance-API-Datei "php-binance-api.php" angeschaut:

 

Zeile 2167ff: 

/**
* Due to ongoing issues with out of date wamp CA bundles
* This function downloads ca bundle for curl website
* and uses it as part of the curl options
*/

... aha ... da scheint die Binance-API schon an solche Fehler angepasst zu sein?

Der Kommentar gehört zur Funktion "downloadCurlCaBundle" und diese wird weiter oben aufgerufen wenn die Variable " $caOverride" auf "true" steht.

Somit schau mal hier:

Zeile 45: protected $caOverride = false; // /< set this if you donnot wish to use CA bundle auto download feature

Und ändere "false" zu "true".

Sollte es dann vielleicht gehen?

vor 2 Stunden schrieb btc-me:

Ich habe auch einen Server (Linux) bei Hetzner, da ist Curl aktiviert. Dort habe ich identisches Problem.

Das jedoch macht mich mehr als stutzig, denn bisher hab ich noch keine Rückmeldung zu so einem Problem bekommen und Du hast das gleich auf zwei Servern - das ist komisch.

Vielleicht lädst Du mal diese Dateien hier runter:

https://github.com/Jokin-BalanceBot/BalanceBot/tree/master/Lektion 3

Und spielst zumindest "index.php" und die  "php-binance-api.php" testweise bei Dir ein?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, ich hätte im ersten Ansatz auch auf XAMP gesetzt, aber Du hast ja schon ein Linux-System benutzt und dort dasselbe Problem - ich bekomme das überhaupt nicht eingeordnet wo eine Lösung zu finden sein kann.

Bearbeitet von Jokin
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 Monate später...

Hallo Jokin,

mittlerweile bin ich bei Lektion 3 angekommen. Da ich mich über dein Ref-Link angemeldet habe und es ab jetzt um sensible Daten geht habe ich ein paar Fragen:

Kannst Du über den Ref-Link sehen wieviel ich mit dem Bot trade? Da Du soweit ich das verstanden habe einen Anteil der Provision an den Tradinggebühren bekommst könntest Du auch nachvollziehen wieviel ich mit dem erstellten Account trade?

 

Zitat

Fügt nun diesen Codeschnipsel in Eure config.php ein und tragt Eure beiden Keys dort ein - denkt daran, dass die Datei auch nicht in fremde Hände kommen sollte. also nicht in Cloud-Backups und nicht auf unverschlüsselte Backup-Datenträger.


// Abschnitt config.php 2: Binance-API 
$__binance_APIkey = "he5JIjiJL4QVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwzhuguNFIJXIlAoNc";
$__binance_APIsecret = "QrrtlQiErtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoCIfkiuZUb3128L";

Spätestens jetzt ist es notwendig ein eigenes Passwort für den Webserver von WAMPP zu erstellen, ansonsten hättest Du oder auch andere Benutzer Zugang zu meinem erstellten Bot, richtig? Wie kann ich mich denn am Besten absichern? Da mein Webserver nach der Konfiguration mit der API auch Zugang zu meinem Binance Account ermöglicht, ist es ja unbedingt notwendig auch diesen Zugang bestmöglich zu sichern.

 

Natürlich ist das ganze nur ein Testprojekt und der Account wird nicht viel Geld verwalten. Doch um dann später einen solideren Bot zu bauen, brauche ich das ganze Verständnis dahinter und vorallem das Wissen wie auch die API möglichst sicher erstellt wird.

 

Ich bin dir sehr dankbar für die ganzen Informationen die Du hier im Forum bereitstellst und hoffe Du kannst mir weiterhelfen 🙂

Btw: Ne kurze Antwort würde schon ausreichen 😁

Bearbeitet von E_001
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 34 Minuten schrieb E_001:

Spätestens jetzt ist es notwendig ein eigenes Passwort für den Webserver von WAMPP zu erstellen

Wenn Dein Server in Deinem eigenen lokalen Netzwerk ist und eine 192...-IP hat, kann überhaupt niemand von außen drauf zugreifen ohne dass Du an Deinem Router irgendwelche Ports aufmachst.

Wenn Dein Server im Internet steht und Dein Bot in einem Unterverzeichnis liegt, kann da zwar jeder drauf zugreifen, aber niemand weiß davon. Im Hauptverzeichnis legste das natürlich nicht ab - IPs durchscannen ist sehr schnell gemacht. Aber alle möglichen Zeichenkombinationen für Unterverzeichnisse durchzuprobieren macht in der Regel niemand.

Da Du beim Zugriff auf Deinen Bot Spuren hinterlässt (Proxyserver, Router, etc.) ist das Unterverzeichnis auch nicht gänzlich unbekannt, daher empfiehlt sich ein Minimalzugriffsschutz:

https://www.redim.de/wissen/passwortschutz-mit-htaccess-einrichten

Mal als Beispiel für eine Standard-Installation:

/var/opt/www/html/BalanceBot/.htaccess

/var/opt/www/.htpasswd

Die Passwd muss in einem Verzeichnis liegen, das vom Internet aus nicht erreichbar ist. Erst ab "html" ist alles offen und dort kommt dann auch die ".htaccess" rein.

Hilfreicher Tipp: Auf Unixsystemen stellt man ein "." vor den Dateinamen um Dateien unsichtbar zu machen. Daher wird die ".htaccess" auch mit einem normalen FTP-Programm nicht angezeigt ohne die entsprechende Option zu setzen.

Auf diese Weise schützt Du Deine Verzeichnisse "minimal" - besser wäre  natürlich auch noch ein Usermanagementsystem welches beliebig sicher sein kann und dann auch mit SSL und dem ganzen Quark ... aber für so ein kleines Projekt ist das absoluter Overkill.

vor 42 Minuten schrieb E_001:

ansonsten hättest Du oder auch andere Benutzer Zugang zu meinem erstellten Bot, richtig?

Solange niemand weiß wo Dein Bot ist, hast Du schonmal eine kleine Sicherheit.

Und wenn jemand Zugriff darauf hätte, dann könnte er den Bot in extrem kurzer Folge mehrfach starten was zu viele API-Calls auf Binance auslöst. Dann wird Deine IP-Adresse gebannt ... aber Deinen API-Key bekommt keiner in die Hände und auszahlen lassen kann sich auch niemand was solange Du nichtmal das Recht vergeben hast (bei der APIKEY-Erstellung)

vor 45 Minuten schrieb E_001:

Wie kann ich mich denn am Besten absichern? Da mein Webserver nach der Konfiguration mit der API auch Zugang zu meinem Binance Account ermöglicht, ist es ja unbedingt notwendig auch diesen Zugang bestmöglich zu sichern.

"bestmöglich" ist mit enormem Aufwand verbunden, dann brauchst Du auch noch eine Firewall vor dem Server und eine IP-Zugriffskontrolle, dann müsstest Du jede neue zugreifende IP-Adresse per eMail bestätigen, dass die darauf zugreifen darf, und, und, und ... das kann man beliebig sicher machen.

... ich halte es für nicht nötig. Mein Webserver steht im Internet und da laufen eine Menge Bots drauf - bisher kein Fremdzugriff da die IP-Adresse nicht bekannt ist ... würde ich die hier ins Forum schreiben, würde ich da durchaus massiv Aktivität sehen - da will ja jeder an meine API-Keys ran ... nö, nö ... da ist ein htaccess-Schutz drauf und das war's.

Daneben läuft auch noch ein Server mit meinem Dashnode, der ist jedoch deutlich sicherer ausgeführt, denn dessen Adresse ist öffentlich in der Dashnode-Liste ... da ist aber auch kein Webserver drauf und sonst kein Service drauf - nur der Dash-Kram. Sicherheit durch Funktionstrennung 🙂
Aber selbst wenn da jemand drauf einbricht. Da liegt zwar ein Dash-Fullnode aber keinerlei Guthaben - das ist schön an anderer Stelle geparkt ... auch hier "Sicherheit durch Funktionstrennung".

  • Thanks 1
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin gerade bei Abschnitt 4 wieder hängen geblieben als ich die Balance checken wollte 😕

Es erscheint die Meldung:

DB-Verbindung hat offenbar geklappt
/opt/lampp/htdocs/BalanceBot folder is not writeable, plese check your permissions

Ich habe alle stack services gestoppt und neu gestartet und auch das ganze XAMPP Programm, hat sich leider nichts geändert.

Ich dachte es könnte vielleicht an der IP-Adresse liegen, da ich nur meiner IP-Adresse den Zugang zur API erlaubt habe. Dann habe ich auf Binance uneingeschränkten IP-Zugang gegeben und es hat sich trotzdem nichts geändert. Was könnte denn der Fehler sein?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb E_001:

Bin gerade bei Abschnitt 4 wieder hängen geblieben als ich die Balance checken wollte 😕

Es erscheint die Meldung:

DB-Verbindung hat offenbar geklappt
/opt/lampp/htdocs/BalanceBot folder is not writeable, plese check your permissions

Ich habe alle stack services gestoppt und neu gestartet und auch das ganze XAMPP Programm, hat sich leider nichts geändert.

Ich dachte es könnte vielleicht an der IP-Adresse liegen, da ich nur meiner IP-Adresse den Zugang zur API erlaubt habe. Dann habe ich auf Binance uneingeschränkten IP-Zugang gegeben und es hat sich trotzdem nichts geändert. Was könnte denn der Fehler sein?

Ähm, hä?

Also ganz allgemein solltest Du zügig lernen Fehler einzugrenzen um so zu analysieren.

Was soll die Binance-API-IP-Einschränkung mit einer Schreibberechtigung auf dem lokalen Datenspeicher zu tun haben?!?

Schau Dir also an wo der Fehler entsteht.

Dazu kannst Du in den PHP-Code einfach mal ein 

echo "huhu";

vor und nach dem einzugrenzenden Codeabschnitt schreiben oder Dir auch mal Variablen ausgeben lassen.

Du siehst, dass der Fehler beim Einbinden der Binance-API entsteht (ok, das wusstest Du auch schon vorher).

Google mal nach der Fehlermeldung 

"folder is not writeable, plese check your permissions" 

... Du siehst, dass die irgendwie mit der Binance-API zu tun hat. Also schaust Du mal in die PHP-Datei der Binance-API und suchst dort nach "writeable".

Du siehst nun, dass er Daten vom Server https://curl.haxx.se/ca/cacert.pem irgendwas nachladen will (das ist SSL-Zertifkatkram).
Du siehst in Zeile 2174, dass er die Datei "ca.pem" anlegen will.
Google nach "ca.pem" um zu erfahren wozu das gut sein soll.

Und nunja, das kann er nicht, weil der Webserver keine Schreibrechte im Verzeichnis "BalanceBot" hat.

Ruf mal auf der Kommandozeile 

ls -la /opt/lampp/htdocs/BalanceBot

auf. Du siehst dann "-rw-r--r--  e_001user e_001group " oder so ähnlich, was soviel bedeutet, dass nur Du Schreibrechte hast, der Webserver darf nix.

Im einfachsten Fall machst Du ein

chmod 777 /opt/lampp/htdocs/BalanceBot

Damit darf dann jeder eingeloggte User auf Deinem Server diese Dateien ändern, daher ist das nur eine Art "Notlösung". Wenn Du es richtig machen willst, weist Du natürlich den Daten den richtigen User und Gruppe zu und hast auch Deinen User in der richtigen Gruppe - aber das führt hier nun zu weit. Mach einfach "chmod 777" und gut is solange Du der einzige User auf diesem Server bist. Auf einem 1&1-Server oder so würde ich das nicht unbedingt machen, aber da wirst Du das Problem nicht haben, da die User und Daten schon korrekt zugeordnet werden.

Grundsätzlich gilt es "sorgsam" mit Berechtigungen umzugehen - nur der Vollständigkeit halber ...

 

 

  • Thanks 1
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Stunden schrieb Adriana Monk:

Ich glaube, das Projekt ist zu gross für, weil ein Fundament fehlt. Ich würde empfehlen, dass er mit kleineren Sachen anfängt, etwas mehr Erfahrung sammelt und dann weitermacht.

AM

Hab mich die letzten Tage mal etwas eingelesen um ne etwas solidere Basis zu bekommen. Ich bleib auf jeden Fall noch an dem Projekt dran..

 

Zitat

Ruf mal auf der Kommandozeile 

ls -la /opt/lampp/htdocs/BalanceBot

auf. Du siehst dann "-rw-r--r--  e_001user e_001group " oder so ähnlich, was soviel bedeutet, dass nur Du Schreibrechte hast, der Webserver darf nix.

Im einfachsten Fall machst Du ein

chmod 777 /opt/lampp/htdocs/BalanceBot

Das war ne ganz gute Beschreibung, hab das soweit auch einigermaßen verstanden. Nur habe ich über die Kommandozeile (das Terminal von XAMPP?) diesen Pfad "ls -la /opt/lampp/htdocs/BalanceBot" nicht gefunden bzw es hat mir nichts angezeigt was mit "-rw-r--r--  e_001user e_001group " vergleichbar ist.

Welche Kommandozeile meinst Du denn genau?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb E_001:

Hab mich die letzten Tage mal etwas eingelesen um ne etwas solidere Basis zu bekommen. Ich bleib auf jeden Fall noch an dem Projekt dran..

 

Das war ne ganz gute Beschreibung, hab das soweit auch einigermaßen verstanden. Nur habe ich über die Kommandozeile (das Terminal von XAMPP?) diesen Pfad "ls -la /opt/lampp/htdocs/BalanceBot" nicht gefunden bzw es hat mir nichts angezeigt was mit "-rw-r--r--  e_001user e_001group " vergleichbar ist.

Welche Kommandozeile meinst Du denn genau?

Erstmal wäre auf jeden Fall interessant, welches Betriebssystem du überhaupt nutzt. Da du mit diesen Pfad-Angaben nichts anfangen kannst, nehme ich an, dass du Windows-User bist. Dann gibt es kein "/opt/lampp/htdocs/BalanceBot" für dich (er heißt dann wahrscheinlich sowas wie "C:/xampp/htdocs/BalanceBot"). Falls du doch Linux oder macOS nutzt, solltest du mal prüfen, ob deine php-Dateien überhaupt im Ordner "/opt/lampp/htdocs/BalanceBot" liegen, bzw. ob du den Ordner, wo die php-Dateien liegen, wirklich "BalanceBot" genannt hast. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb E_001:

Welche Kommandozeile meinst Du denn genau?

Das ist die Kommandozeile Deines Servers.

Ich glaube, Du hast das auf Deinem lokalen Mac laufen - schau mal bei Anwendungen -> Dienstprogramme -> Terminal ... das ist Deine Kommandozeile.

Auch damit solltest Du Dich ein bisschen beschäftigen.

mit "ls" kannst Du Dir Verzeichnisinhalte anschauen.
mit "chmod" kannst Du Berechtigungen ändern
mit "cd" das Verzeichnis wechseln

... mehr brauchste erstmal nicht.

Google kann Dir mehr aus dieser Welt zeigen - einfachste Grundlagen reichen schon.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 7 Monate später...
Am 18.5.2019 um 01:09 schrieb Jokin:

Hmm,

das scheint mir ein Konfigurationsproblem auf Deinem Server zu sein.

Der Balance-Bot nutzt die Original-Binance-PHP-Implementierung
... die nutzt Curl, also eine Standarderweiterung
... und Curl nutzt SSL
... SSL braucht gültige Zertifikate
... und diese sind auf Deinem Server offenbar nicht gültig.

@skunk könnte da vielleicht einen Tipp geben.

Auf was für einem Server hast Du das laufen? 

hallo zusammen,

erst einmal @Jokin herzlichen dank für die extrem gute arbeit.
ich bin neu und habe in den letzten tagen so viel neues gelernt 
sehr cool

nun habe ich aber ein problem wo ich nicht weiter komme.
ich habe die lektionen bis zur 6 in einer windows umgebung durchgearbeitet und es lief

in lektion 7, die umstellung auf „linux“ mit einem pi.
ich habe mich für ein debian (10.4) entschieden und installiert.
soweit sah alles gut aus.
die php dateien, zum neuen system übertragen, die index.php aufgerufen.
leider wird nix angezeigt. (gesucht, gesucht..)
da ich anfänger bin hab ich gedacht, dann baust du es noch mal 

jetzt konnte ich den fehler eingrenzen, bin mir aber nicht sicher.
bin in lektion 3
// Abschnitt index.php 8:
// Binance-API anbinden
require_once scheint zu funktionieren
ich kann mir die key’s mit einem echo anzeigen lassen
ich bekomme aber keine weitere fehlermeldung
ich habe den key schon einmal verändert , nix
nun habe ich danach noch ein echo eingebaut, dieses wird mir angezeigt
meine vermutung es liegt an dem zertifikat.
dieses habe ich von windows mit kopiert, ich hab es auch schon mal umbenannt „nix“
die einstellung -> protected $caOverride = false habe ich auch schon mal auf true gesetzt, wie weiter unten beschrieben

der code:
// Abschnitt index.php 8:
// Binance-API anbinden
echo "Abschnitt index.php 8<br>";
require_once ("php-binance-api.php"); // Binance-API Code laden
echo "Abschnitt index.php 8 api code laden<br>";
echo "Variable __APIkey enthaelt ".$__binance_APIkey." <br>";
echo "Variable __APIkey enthaelt ".$__binance_APIsecret." <br>";
$binance_api_handler = new Binance\API($__binance_APIkey ,$__binance_APIsecret);
// prüfen ob die Binance-API tatsächlich angesprochen werden kann
if (!$binance_api_handler){
    update_messages ("FEHLER: 'binance_api_handler' nicht vorhanden");
}
echo "Abschnitt index.php 8.1<br>";
// Abschnitt index.php 8.1:
// nun aktualisieren wir all unsere Account-Infos ... siehe oben bei der Funktionsdeklarierung
update_accountinfo();

echo "Abschnitt index.php 8.1 nach update_accountinfo(); <br>";

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

die ausgabe:
Hallo Welt
DB-Verbindung hat offenbar geklappt
Abschnitt index.php 8
Abschnitt index.php 8 api code laden
Variable __APIkey enthaelt „hier steht…“
Variable __APIsec enthaelt „…..“
Abschnitt index.php 8.1

kann mir jemand helfen?

herzlichen dank im voraus

grüße sascha

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb fbueller76:

kann mir jemand helfen?

Wenn nach der Ausgabe "Abschnitt index.php 8.1" nix mehr ausgegeben wird, dann muss irgendwas in der Funktion "update_accountinfo()" krumm sein.

Auch da kannst Du einfach mal 

function update_accountinf() {
echo "huhu";
/*
... hier der restliche Code, der nun auskommentiert ist
*/
}

einsetzen um zu schauen ob das Programm in diese Funktion geht und wieder rauskommt.

Danach kannste zeilenweise schauen ob was geht oder nicht.

vor 2 Stunden schrieb fbueller76:

meine vermutung es liegt an dem zertifikat.

Eigentlich braucht es doch gar kein Zertifikat?!?

Erst wenn man die Verbindung später absichern will, dann kommt das mit hinzu.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Jokin:

Wenn nach der Ausgabe "Abschnitt index.php 8.1" nix mehr ausgegeben wird, dann muss irgendwas in der Funktion "update_accountinfo()" krumm sein.

Auch da kannst Du einfach mal 

function update_accountinf() {
echo "huhu";
/*
... hier der restliche Code, der nun auskommentiert ist
*/
}

einsetzen um zu schauen ob das Programm in diese Funktion geht und wieder rauskommt.

Danach kannste zeilenweise schauen ob was geht oder nicht.

Eigentlich braucht es doch gar kein Zertifikat?!?

Erst wenn man die Verbindung später absichern will, dann kommt das mit hinzu.

ich komm bis zur zeile
$array_binance_account = $binance_api_handler->account();

in den ordner lag eine "ca.pem" daher der gedanke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb fbueller76:

ich komm bis zur zeile
$array_binance_account = $binance_api_handler->account();

Hmm, dann passt mit der API-Datei etwas nicht. 

Sind die Berechtigungen richtig gesetzt, dass PHP in das Verzeichnis schreiben kann?

vor 16 Minuten schrieb fbueller76:

in den ordner lag eine "ca.pem" daher der gedanke.

Ähm, ja - stimmt ... hab ich auch. Hab ich so noch gar nicht drauf geachtet gehabt :D 

Daher also nochmal Berechtigungen prüfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Jokin:

Hmm, dann passt mit der API-Datei etwas nicht. 

Sind die Berechtigungen richtig gesetzt, dass PHP in das Verzeichnis schreiben kann?

Ähm, ja - stimmt ... hab ich auch. Hab ich so noch gar nicht drauf geachtet gehabt :D 

Daher also nochmal Berechtigungen prüfen.

drwxrwsrwx 3 www-data www-data 4,0K Jun 23 20:06 .
drwxr-xr-x 3 www-data www-data 4,0K Jun 22 21:17 ..
-rwxrwxrwx 1 www-data www-data  488 Jun 23 08:46 config.php
-rwxrwxrwx 1 www-data www-data 3,7K Jun 23 20:20 index.php
drwxr-sr-x 2 www-data www-data 4,0K Jun 23 17:54 old
-rwxrwxrwx 1 www-data www-data  81K Jun 23 10:14 php-binance-api.php
-rwxrwxrwx 1 www-data www-data 1,3K Jun 23 07:10 show_messages.php

ich hab den besitzt auf "www-data" und zum testen "sudo chmod 777"
habe ich noch etwas übersehen?

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.