JavaScript Binance API anwenden, programmieren

0ahnung

Cadet 3rd Year
Registriert
Nov. 2012
Beiträge
37
Hallo Leute,
ich möchte gerne mit Binance API ein mini Tradingbot programmieren.
Aber leider bin ich in Java, JS, NodeJS nicht gut.
Ich bin nur ein einfacher Mikrocontroller programmierer.
Lange rede kuzer sinn, ich brauche eure Hilfe.

Was ich bisher gemacht habe:
1. von Github Projekt / API runtergeladen und installiert
2. im Ordner examples die Datei example.js angepasst und ausgeführt
Weite komme ich leider nicht.

Wie ist der zeitliche Ablauf ? Normalerweise von oben nach unten, aber das funktioniert irgendwie nicht. Ich denke das hat damit zutun wie schell Binance die Daten zurück gibt. Wenn ja wie könnte ich das lösen?

Mit der Methode binance.openOrders (Zeile 34) bekomme ich diese Liste von Binance zurück.
002.PNG

Ich habe versucht z.b. die "OrderID" und "Side" aus der Liste so herauszuholen (Zeile 39):
if(OffeneOrders.orderID && OffeneOrders.side == 'BUY')
Folgende Fehler wird angezeigt.
003.png

Die Datei node-binance-api.js kann ich nicht hochladen, funktioniert nicht, "ungültige dateiformat".

Das ist die example.js

Code:
const binance = require('../node-binance-api.js');

var ETHMoney=0, LastPrice=0, OpenPrice=0, OffeneOrders;

binance.options({
    APIKEY: '<>',
	APISECRET: '<>',
	useServerTime: true, // If you get timestamp errors, synchronize to server time at startup
	test: true // If you want to use sandbox mode where orders are simulated
});



// binance.useServerTime(function() {
// 	binance.balance((error, balances) => {
// 		if ( error ) return console.error(error);
// //		console.log("balances()", balances);
// 		console.log("ETH balance: ", balances.ETH.available);
// 		ETHMoney = balances.ETH.available;
// 	});
// });

//**** Hole aktuelle ETH/BTC Open Preis **************************************/
// Getting latest price of a symbol
binance.prices(function(error, ticker) {
//	console.log("prices()", ticker);
	console.log("Price of DGD in ETH: ", ticker.DGDETH);
	LastPrice = ticker.DGDETH;
});


//**** lösche vorherige Buy Order und setzte eine neue Buy Order und hole Bestätigung */
// Getting list of open orders
binance.openOrders("DGDETH", function(error, OffeneOrders) {
	console.log("openOrders()",OffeneOrders);
});

// Wenn ein OrderID vorhanden dann gibt es ein offene BUY Order
if(OffeneOrders.orderID && OffeneOrders.side == 'BUY'){
	// Cancel an order
	binance.cancel("DGDETH", OffeneOrders.orderID, function (error, response) {
		console.log("cancel()", response);
	});
}

Vielen Danke für eure Hilfe.
 
Der Gültigkeitsbereich der Antwort von openOrders() ist auf den Rumpf der callback function (Zeile 34) beschränkt. Du musst deinen Code nach oben schieben, sodass er innerhalb der Klammern (aktuell Zeile 36) steht.
 
Hallo,
danke für die schnelle Antwort.

Der Code sieht jetzt so aus, Fehlermeldung ist weg, aber leider wird der Order nicht gelöscht.
Wie greift man auf die Elemente der OffeneOrders zu ?
So OffeneOrders.orderID funktionierts leider nicht.
Ich habe die Datei node-binance-api.js als zip im Anhang eingefügt.

Code:
//**** lösche vorherige Buy Order und setzte eine neue Buy Order und hole Bestätigung */
// Getting list of open orders
binance.openOrders("DGDETH", function (error, OffeneOrders) {
	console.log("openOrders()", OffeneOrders);
	
	// Wenn ein OrderID vorhanden dann gibt es ein offene BUY Order
	if (OffeneOrders.orderID && OffeneOrders.side == 'BUY') {
		// Cancel an order
		binance.cancel("DGDETH", OffeneOrders.orderID, function (error, response) {
			console.log("cancel()", response);
		});
	}
});
 

Anhänge

So was lässt sich nur durch debugging lösen. Das Hin und Her in einem Forum ist dafür viel zu träge. Entweder du fummelst mit console.log rum oder schaust dir an, wie man in Node richtig debugt. Das kennst du ja bestimmt auch aus der Programmierung, die du sonst so machst.
 
Wie greift man auf die Elemente der OffeneOrders zu ?
So OffeneOrders.orderID funktionierts leider nicht.
 
Was heißt denn "funktioniert nicht"? Irgendwas wird da schon drinstehen, sei es NaN, function(), undefined oder eben eine Zahl. Genau das musst du erst mal durch debugging klären.
 
Mit welchem IDE kann man nodejs debuggen ?
Ich benutzte gerade Visual Studio Code, da gibt es ein debug funktion, aber es funktioniert nicht.
Wenn ich deggen starte wird das hier in der konsole angezeit:
005.PNG

Code:
//**** lösche vorherige Buy Order und setzte eine neue Buy Order und hole Bestätigung */
// Getting list of open orders
binance.openOrders("DGDETH", function (error, OffeneOrders) {
	console.log("openOrders()", OffeneOrders);
	console.log("openOrders()", OffeneOrders.orderID);
	
	// Wenn ein OrderID vorhanden dann gibt es ein offene BUY Order
	if (OffeneOrders.orderID && OffeneOrders.side == 'BUY') {
		// Cancel an order
		binance.cancel("DGDETH", OffeneOrders.orderID, function (error, response) {
			console.log("cancel()", response);
		});
	}
});

004.PNG
 
Zuletzt bearbeitet:
Du hast da ein Array in der Hand. Das enthält JSON-Objekte und jedes davon die Felder, an die du ran willst. Du solltest über das Array iterieren und deine Operation auf die Elemente anwenden.
 
Du solltest über das Array iterieren und deine Operation auf die Elemente anwenden. :rolleyes:
 
So jetzt kann ich die Elemente aus dem JSON Daten auslesen.

Code:
	for (var j = 0; j < OffeneOrders.length; j++) {
		orderID = OffeneOrders[j].orderId;
		Side = OffeneOrders[j].side;
	}

Für was ist Websocket gedacht ?
Dieser Code holt automatisch (gefühlt jede 1s) Daten von Binance:
Code:
binance.websockets.depthCache(["DGDETH"], function(symbol, depth) {
	let max = 1; // Show 10 closest orders only
	let bids = binance.sortBids(depth.bids, max);
	let asks = binance.sortAsks(depth.asks, max);
	console.log(symbol+" depth cache update");
	console.log("asks", asks);
	console.log("bids", bids);
	console.log("ask: "+binance.first(asks));
	console.log("bid: "+binance.first(bids));



});

Sollte ich mein Code in Websockets rein packen, was meint ihr ?

Wenn man Daten von Binance anforder, wird im Code weiter gemacht bevor die Daten da sind.
Es soll erst dann weiter machen wenn die Daten da sind, weil ich im Nächstenschritt die Daten brauche.

Wei kann man das machen ?

Gruß
 
Ich möchte gerne binance.websockets.candlesticks(...) benutzten anstatt binance.websockets.depthCache(...).
Aber was muss als Parameter angegeben werden ?
Ich habe in node-binance-api.js geschaut, aber leider blick ich es nicht :(.
binance.websockets.depthCache(...) war im Beispiel vorgegeben.
 
Hallo, ich weiss nicht mehr weiter und brauche kurz eure Hilfe.

Wenn diesen code ausführe:
Code:
if (BuyOrderGesetzt == false) {
        binance.orderStatus(Waehrung, 4866946, function (error, OrderStatusStream) {
	   process.stdout.write('\n');
	   console.log("orderStatus(): ", OrderStatusStream);
	   for (var j = 0; j < OrderStatusStream.length; j++) {
	      orderStatus2 = OrderStatusStream[j].status;
	   }
	   console.log("orderStatus2: ", orderStatus2);
        });
	BuyOrderGesetzt = true;
}

der erste console.log gibt das hier aus, soweit so gut:
006.PNG

aber bei der zweiten console.log wird das hier ausgegeben, sollte aber CANCELED ausgegeben werden.
Was mache ich falsch ?
007.PNG
 
kein let oder var vor orderStatus2

Mach doch:
Code:
for (var j = 0; j < OrderStatusStream.length; j++) {
    console.log("orderStatus", OrderStatusStream[j].status);
}
 
Danke für die schnelle Antwort.
Doch ganz oben als globale variable var orderStatus2;
Ich brauche diese globale variable in einer anderen funktion.
Das mit der console.log war wegen Test, um zu schauen was ausgegeben wird.
Ergänzung ()

ich habe deine Idee ausgeführt, console.log in der for-schleife wird gar nicht ausgeführt :(.
Code:
if (BuyOrderGesetzt == false) {
   binance.orderStatus(Waehrung, 4866946, function (error, OrderStatusStream) {
	process.stdout.write('\n');
	console.log("orderStatus(): ", OrderStatusStream);
	for (var j = 0; j < OrderStatusStream.length; j++) {
		console.log("orderStatus ********************: ", OrderStatusStream[j].status);
	}
	// for (var j = 0; j < OrderStatusStream.length; j++) {
	// 	orderStatus2 = OrderStatusStream[j].status;
	// }
	// console.log("orderStatus2: ", orderStatus2);
   });
   BuyOrderGesetzt = true;
}
 
Zuletzt bearbeitet:
Ich weiss echt nicht weiter, bitte helft mir doch.

Ich möchte aus dem array bestimme Elemente auslesen. Ich habe den Code soweit abgespeckt, so dass ich erstmal nur die Länge der array jsoon hole, aber leider passiert folgendes:
Code:
binance.orderStatus(Waehrung, 5078347, function (error, jsoon) {
		console.log("orderStatus(): ", jsoon);
		console.log("jsoon.length: ", jsoon.length);
	});


Erste console.log(): soweit so gut
008.PNG

Zweite console.log(): hier wird die Länge der array nicht erkannt
009.PNG

Und jetzt kommt der Hammer. Bei diesem code werden die Elemente (hier OrderID und Side) ausgelsen:
Code:
binance.openOrders(Waehrung, function (error, OffeneOrders) {
	process.stdout.write('\n');
	console.log("openOrders()", OffeneOrders);
	for (var j = 0; j < OffeneOrders.length; j++) {
		orderID = OffeneOrders[j].orderId;
		Side = OffeneOrders[j].side;
	}
	console.log("orderID", orderID);
	console.log("Side", Side);

Ich habe auf stackoverflow etwas mit forEach gefunden, aber ich weiss nicht wie das für meine sache anwenden kann.
Was ist yourArray, arrayItem und arrayItem.prop1 ?

Code:
yourArray.forEach( function (arrayItem)
{
    var x = arrayItem.prop1 + 2;
    alert(x);
});

Ich weiss echt nicht mehr weiter, bitte helft mir.
 
Zuletzt bearbeitet:
Bei deinem ersten Schnipsel handelt es sich bei jsoon um ein Objekt, nicht um ein Array, weshalb die Eigenschaft length nicht verfuegbar ist.

binance.orderStatus(Waehrung, 5078347, callback) gibt dir nur ein Order-Objekt. Kannst also direkt auf die Eigenschaften zugreifen: jsoon.orderId

Von binance.openOrders(Waehrung, function (error, OffeneOrders) bekommst du ein Array.

Wegen des debuggens: Du musst in VSCode F5 druecken wenn du in deinem Code bist (und nicht in der node-binance-api.js).
Ausserdem solltest du das Binance Packet mit npm in deinem Projekt installieren (npm install node-binance-api --save)

Siehe Tutorials:
https://code.visualstudio.com/docs/nodejs/nodejs-tutorial
https://code.visualstudio.com/docs/editor/debugging
 
Wow super. Vielen Lieben Dank für deine Hilfe.
Für die Zukunft, woher weiß man ob es es ein Array oder ein Objekt ist ?

Wenn ich in VSCode mit F5 den Debugger starte wird von VSCode das angezeigt:

010.PNG

Wenn ich bis zum Breakpoint laufen lassen möchte mit F10 F11 passiert gar nix.

das mit dem npm packet installieren, das war ein heckmeck. Ich weiß immer noch nicht wie ich das hinbekommen habe. Ich habe versucht mit (npm install node-binance-api --save) das Packet zu installieren, aber ich hatte immer ein Fehlermeldung, irgent etwas mit installieren auf gleiche Verzeichnis oder so etwas.
Irgendwann hatte ich das "node_modules" Ordner in meinem Verzeichnis.
Ohne dies "node_modules" würde mein Programm garnicht funktionieren, oder ?
 
Zuletzt bearbeitet:
Bekommt man z.B. mit Array.isArray(obj) raus. Man sieht es aber auch an deiner Ausgabe.
Bei einem Array waere das Objekt in [].
Also [{oderId: 123}] anstatt {orderId: 123}

Zu dem npm kram:
Am besten erstellst du eine package.json via npm init (einfach ausfuellen oder alles mit Enter bestaetigen).
Nenn deine example.js um in main.js.
Wenn du dann die Binance API mit npm install node-binance-api --save installierst sieht die package.json ggf. so aus:
Code:
{
  "name": "0ahnung",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "0ahnung",
  "license": "MIT",
  "dependencies": {
    "node-binance-api": "^0.4.20"
  }
}

In der main.js fuegst du dann das folgende ein um das Paket verwenden zu koennen:
Code:
const binance = require('node-binance-api');

Der node_modules Ordner enthaellt alle installierten Abhaengigkeiten deines NodeJS Programms (in diesem fall dann node-binance-api)
Den Ordner musst du nicht unbedingt aufbewahren oder mitkopieren wenn du das ganze auf einem anderen Rechner verwenden moechtest. Musst dann aber npm install im Ordner ausfuehren um ihn neu zu erstellen.

Resultierende Ordner Struktur:
Code:
main.js              # dein Code
package-lock.json    # wichtig, behalten
package.json         # wichtig, behalten
node_modules/        # kann bei Umzug ignoriert werden, erfordert erneutes ausfuehren von: npm install
 
Vielen Dank für die ausführliche Informationen.
Das mit dem Array, Objekt kram funktioniert jetzt. Ich kann nun weiter programmieren.
Vielen Dank.
 
Zurück
Oben