Zum Inhalt springen

Workshop: Wir basteln uns einen Tradingbot (Lektion 3)


Empfohlene Beiträge

vor 26 Minuten schrieb 24unix:

Ich werde mir jetzt keine Google Konto anlegen und den GA installieren, um das direkt zu belegen.

Hatte ich erwartet dass du dich so davor drückst. Billige ausrede, und das als Entwickler 😅 

 

vor 23 Minuten schrieb 24unix:

Lass gut sein, ja? Du hast Recht

Gerne. Schön dass du es endlich eingesehen hast 👍 

Bearbeitet von o0dy
Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe Lektion 3 jetzt komplett durch, konnte die Schleifen deutlich reduzieren, ob es lesbarer ist liegt im Auge des Betrachters …

	function updateAccountInfo($botID)
	{
		try {
			$this->binanceAccount = $this->binanceAPI->account();
		} catch (Exception $e) {
			echo 'Error: ' . $e->getMessage();
		}
		
		$exchangeInfo = [];
		try {
			$exchangeInfo = $this->binanceAPI->exchangeInfo();
		} catch (Exception $e) {
			echo $e->getMessage();
		}
		
		$botBaseCurrency = $this->bot->getBaseCurrency($botID);

		$base = array_search($botBaseCurrency, array_column($this->binanceAccount['balances'], 'asset'));
		$baseCurrency = $this->binanceAccount['balances'][$base];
		
		$coins = $this->bot->getCoins($botID);
		
		$coinValues = [];
		foreach ($coins as $coin) {
			$coinID = array_search($coin->name, array_column($this->binanceAccount['balances'], 'asset'));
			// get rates
			$prevDay = [];
			try {
				echo("search: $coin->name");
				// get base currency from Bot class
				if ($prevDayRaw = $this->binanceAPI->prevDay($coin->name . $botBaseCurrency)) {
					//print_r($prevDay);
					$prevDay['price'] = $prevDayRaw['lastPrice'];
					$prevDay['price24High'] = $prevDayRaw['highPrice'];
					$prevDay['price24Low'] = $prevDayRaw['lowPrice'];
					$this->storeMessage("fetched: " . $coin->name . $botBaseCurrency);
				} else {
					$this->storeMessage("error fetching: " . $coin->name . $botBaseCurrency);
				}
				
			} catch (Exception $e) {
				echo $e->getMessage();
			}
			
			$rules = [];
			
			$filters = $exchangeInfo['symbols'][$coin->name . 'USDT']['filters'];

			$lotSizeID = array_search('LOT_SIZE', array_column($filters, 'filterType'));
			$rules['minQty'] = $exchangeInfo['symbols'][$coin->name . 'USDT']['filters'][$lotSizeID]['minQty'];
			$rules['minQtyPrecision'] = abs(floor(log10($rules['minQty'])));
			
			$minNotionalID = array_search('MIN_NOTIONAL', array_column($filters, 'filterType'));
			$rules['minNotional'] = $exchangeInfo['symbols'][$coin->name . 'USDT']['filters'][$minNotionalID]['minNotional'];
			
			$priceFilterID = array_search('PRICE_FILTER', array_column($filters, 'filterType'));
			$rules['tickSize'] = $exchangeInfo['symbols'][$coin->name . 'USDT']['filters'][$priceFilterID]['tickSize'];
			$rules['tickSizePrecision'] = abs(floor(log10($rules['tickSize'])));
			
			$balance = $this->binanceAccount['balances'][$coinID];

			$coinValues[] = array_merge($prevDay, $balance, $rules);
			
			try {
				$binanceOpenOrder[$coin->name] = $this->binanceAPI->openOrders($coin->name . $botBaseCurrency);
			} catch(Exception $e) {
				echo $e->getMessage();
			}
		}
		print_r($coinValues);
		
		// get all open orders
	}
	

Edit: Etwas die Optik angepasst.

https://y.24unix.net/v5e93

Bearbeitet von 24unix
Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Tutorial Reihe @Jokin

Aktuell probiere ich mich auch an der Binance API und komme gerade bei den Exchange Limits nicht weiter.

Ich verstehe nicht genau was mit LOT_SIZE, MIN_NOTIONAL und PRICE_FILTER gemeint sind.

In Klammern ein Beispiel Symbol auf das ich mich beziehe, in dem Fall ETH:

- LOT_SIZE (maxQty = 100000.00000000, minQty = 0.00100000, stepSize = 0.00100000):

Es müssen mindestens 0.001 Coins gehandelt werden und es dürfen maximal 100000 Coins getraded werden. Außerdem muss die Coin Anzahl in 0.001 Schritten angegeben werden (= max 3 Nachkommastellen)

- MIN_NOTIONAL (minNotional = 0.00010000)

Hier habe ich das so verstanden das dieser Wert auch die Mindestanzahl an Coins im Trade wiedergibt. Aber das wäre ein Widerspruch zu minQty in LOT_SIZE. Irgendwas verstehe ich hier also falsch.

 - PRICE_FILTER(maxPrice = 100000.00000000, minPrice = 0.00000100,  tickSize = 0.00000100):

Hier verstehe ich eigentlich auch nicht was damit gemeint ist, bezieht sich das jetzt auf den Preis der anderen Währung/Coins mit dem wir ETH kaufen würden?

 

 

Bearbeitet von Cftral
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Minuten schrieb bjew:

sollte in der api-beschreibung beschrieben sein

In der API Beschreibung habe ich folgendes gefunden:

PRICE_FILTER
ExchangeInfo format:

  {
    "filterType": "PRICE_FILTER",
    "minPrice": "0.00000100",
    "maxPrice": "100000.00000000",
    "tickSize": "0.00000100"
  }
minPrice defines the minimum price/stopPrice allowed; disabled on minPrice == 0.
maxPrice defines the maximum price/stopPrice allowed; disabled on maxPrice == 0.
tickSize defines the intervals that a price/stopPrice can be increased/decreased by; disabled on tickSize == 0.

=> Minumum/Maximum Preis per Coin den man Verkauft/Kaufen möchte (und auf welche Nachkomastelle genau)

LOT_SIZE
ExchangeInfo format:

  {
    "filterType": "LOT_SIZE",
    "minQty": "0.00100000",
    "maxQty": "100000.00000000",
    "stepSize": "0.00100000"
  }
The LOT_SIZE filter defines the quantity (aka "lots" in auction terms) rules for a symbol. There are 3 parts:

minQty defines the minimum quantity/icebergQty allowed.
maxQty defines the maximum quantity/icebergQty allowed.
stepSize defines the intervals that a quantity/icebergQty can be increased/decreased by.

=> Minimum, Maximum Anzahl der Coins die man in einem Trade kaufen/verkaufen kann (und auf welche Nachkomastelle genau)

MIN_NOTIONAL
ExchangeInfo format:

  {
    "filterType": "MIN_NOTIONAL",
    "minNotional": "0.00100000",
    "applyToMarket": true,
    "avgPriceMins": 5
  }
The MIN_NOTIONAL filter defines the minimum notional value allowed for an order on a symbol. 
An order's notional value is the price * quantity. If the order is an Algo order (e.g. STOP_LOSS_LIMIT), 
then the notional value of the stopPrice * quantity will also be evaluated. If the order is an Iceberg Order, 
then the notional value of the price * icebergQty will also be evaluated. 
applyToMarket determines whether or not the MIN_NOTIONAL filter will also be applied to MARKET orders. 
Since MARKET orders have no price, the average price is used over the last avgPriceMins minutes. 
avgPriceMins is the number of minutes the average price is calculated over. 0 means the last price is used.

=> Gesamt Preis/Wert des Trades

Denke ich habe es jetzt verstanden, danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
vor 6 Minuten schrieb bjew:

nun, was  macht dein Bot? fertig, erfolgreich?

Unverändert 😞 Mir kam leider was anderes dazwischen.

Ich hoffe, dass es nächste Woche weiter geht, aber man muss halt Prioritäten setzen. Aber vergessen habe ich die Baustelle nicht :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein wenig habe ich diese Woche geschafft, aber nicht so viel. Ich habe die Trennung zwischen Frontend und Backend weiter ausgebaut, per Timer (das, was man vor systemd mit cron gemacht hat) werden nun alle 10 Minuten die relevanten Daten zu den Coins geholt und in die DB geschrieben, ich schaue morgen mal, wie viel das ist, sind ja nur ein paar Bytes pro Zeile, ich denke, auf eine 20GB Partition kann ich Jahre mitplotten.

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.