Ccxt: Streaming (WS, Websocket-Unterstützung): Orderbücher, Trades, Salden...

Erstellt am 26. Juli 2017  ·  346Kommentare  ·  Quelle: ccxt/ccxt

Ich würde gerne eine neue Markteigenschaft namens Salden sehen, die genauso funktionieren würde wie Symbole. Wenn Sie fetchBalances() aufrufen, wird die Eigenschaft balances mit einem assoziativen Array von Währungen mit Salden gefüllt (kostenlos, verwendet, gesamt, verfügbar usw.).

Salden würden auch über Websocket (falls verfügbar) oder durch wiederholte Aufrufe der API aktualisiert, je nach Ratenbegrenzungen.

Letztendlich könnten wir so etwas tun:

kraken.fetchBalances();
let myAvailableBTC = kraken.balance.available['BTC'];
let myTotalBTC = kraken.balance.total['BTC'];
enhancement

Hilfreichster Kommentar

@kroitor wie ist der fortschritt?

Mal sehen ... Ich habe die obige Antwort vor genau 48 Stunden gepostet, um die Menge zufrieden zu stellen.

Seitdem habe ich zweimal für ca. 6 Stunden geschlafen, das sind insgesamt 12 Stunden, verbleibende 36 Stunden.
Ich nahm auch mehrere Mahlzeiten ein und erledigte einige andere Dinge, die insgesamt etwa 4 Stunden dauerten, 32 Stunden blieben übrig. Ich habe etwas gearbeitet, um Geld für meinen Lebensunterhalt zu verdienen, das hat ungefähr 8 Stunden gedauert, niemand, außer ein paar Leuten, die gespendet haben (Dank und Respekt an sie), bezahlt tatsächlich für die Open-Source-Arbeit, erinnerst du dich? ) Also, um etwas zu essen zu haben, müssen wir auch an anderen Projekten arbeiten.

Das gibt uns eine verbleibende Zeit von 32-8 = 24 Stunden, ein ganzer Tag, um an ccxt zu arbeiten. Dann habe ich ungefähr 4 Stunden damit verbracht, verschiedenen Leuten hier und da zu antworten, wie es geht. Das sind noch 20 Stunden für die eigentliche Arbeit. Innerhalb dieser Zeit habe ich 20 neue Issues geschlossen (zum Teil mehrfach beantwortet) und ca. 30 Pull-Requests mit diversen Bugfixes, Erweiterungen und Edits in die bestehende Codebasis gemergt. Das sind etwa 20 Minuten pro Issue/Pull-Request. Einige von ihnen erfordern eine intensive Kommunikation und dauern länger, andere sind schneller abgeschlossen.

Nun, ich kann mir nicht vorstellen, wie Sie innerhalb dieses Zeitrahmens ernsthafte Fortschritte bei diesem speziellen Thema erzielen könnten. Und meine Antwort und Einstellung zu dieser Art von Fragen wird in diesem Kommentar vollständig zum Ausdruck gebracht: https://gist.github.com/kroitor/aabecc346a5bded6ead7a82205d8ffc1#gistcomment -2335076

Grundsätzlich ist auch der Fortschritt dieses Open-Source-Projekts offen, also wann immer Sie sich fragen, wie es geht, werfen Sie einen Blick in die Commit-Historie )

Alle 346 Kommentare

Sie werden es bald haben) Danke fürs Posten!

Wir haben die Saldo-API, wie hier in Ausgabe Nr. 36 beschrieben, vereinheitlicht. Jetzt kann Ihre Feature-Anfrage einfach implementiert werden ) Wir werden zuerst eine Dirty-Balance-Methode hinzufügen, die das Gleichgewicht auf einer Marktinstanz speichern würde. Und wenn wir bereit sind, die Websocket-Implementierungen zu veröffentlichen, werden wir sie natürlich automatisch aktualisieren lassen. Den Kontakt halten! )

Das „schmutzige Guthaben“ ist also eine Anpassung des lokalen Hauptbuchs, um alle von mir platzierten Bestellungen widerzuspiegeln? Was ist mit Aufträgen, die sich füllen? Wird das auch für die Salden verfolgt?

Ja, wenn wir einen ratenbegrenzten Poller und Freigabemethoden für Websocket-APIs hinzufügen, wird das Gleichgewicht alles in Echtzeit widerspiegeln (so real wie möglich). Derzeit werden Salden nicht neu geladen und nicht automatisch zwischengespeichert, Sie müssen dies manuell tun, da wir sie gerade vereinheitlicht haben (das war an sich schon eine Menge Arbeit). Aber nachdem wir sie vereinheitlicht haben, werden wir bald auch die automatische Anpassung hinzufügen. Was die Ausführung von Bestellungen betrifft, glaube ich nicht, dass ich Ihre Frage vollständig verstanden habe, aber eine Saldo-API gibt normalerweise einen (verbleibenden) Betrag in Bestellungen, ein frei verfügbares Guthaben und eine Gesamtsumme an, und normalerweise gibt es eine separate Schnittstelle für Ausführungsdetails (Transaktionen, Handel). Es wird auch Stream-basiert sein, im Grunde müssen alle Daten, einschließlich des Saldos, offener Orders, teilweise ausgeführter Orders und geschlossener Orders, alle miteinander konsistent sein.

Da diese Ausgabe noch offen ist und ich mich schwer getan habe, etwas anderes darüber zu finden (außer Ausgabe Nr. 145, die hier geschlossen verlinkt ist): Gibt es etwas Neues zum gesamten WebSocket-Thema?

@Helmi Hallo! Diese Ausgabe ist noch offen, wir arbeiten daran und hoffen, sie bald liefern zu können. Wie Sie an unserer Versionierung sehen können, nähern wir uns v2, wo wir ein umfassendes Refactoring und viele neue Funktionen einführen werden . Bleiben Sie dran für weitere Updates! )

Danke für den schnellen Headup. Das hört sich super an. Mach es 👍

+1
Gibt es Informationen zum Veröffentlichungsdatum von Version 2.0?

@alexmipego Wir arbeiten derzeit intensiv daran, um die erste Version so schnell wie möglich auszuliefern, hoffentlich noch in diesem Monat.

Vielen Dank für die Mühe! Ich bin ein Fan!

@kroitor du schriebst:

Wie Sie an unserer Versionierung sehen können, nähern wir uns v2, wo wir ein umfassendes Refactoring und viele neue Funktionen einführen werden )

Gibt es eine Möglichkeit, einen Blick auf den v2- und WebSocket-Code und die wichtigsten Umgestaltungen zu werfen? Ich konnte es nirgends finden.

Wo wird die Versionierung verwaltet? Ich konnte es nicht finden.

@nitzanav

Gibt es eine Möglichkeit, einen Blick auf den v2- und WebSocket-Code und die wichtigsten Umgestaltungen zu werfen? Ich konnte es nirgends finden.

Das Refactoring findet gerade im Hauptzweig statt (seitdem gab es viele Änderungen), und die Arbeit an Websockets ist ebenfalls im Gange, aber es gibt derzeit keinen einzigen Ort, der alles enthält, die Arbeit ist erledigt Gabeln meistens ... Hier ist ein Beispiel dafür: https://github.com/ccxt/ccxt/pull/751

Wo wird die Versionierung verwaltet? Ich konnte es nicht finden.

Versions-Single-Sourcing wird bei jedem Build auf Travis CI von package.json mit dem Skript vss.js durchgeführt. Mehr dazu: https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md.

Vielen Dank für die Informationen und für dieses tolle Projekt!

@kroitor Wird es wie gewohnt in den drei Sprachen verfügbar sein?

@rubobaquero ja, das ist der springende Punkt, wenn wir eine Implementierung in nur einer einzigen Sprache hineinwerfen könnten, würde das Hinzufügen von Unterstützung für ws nicht so lange dauern.) Die Hauptschwierigkeit besteht darin, sie alle zu vereinheitlichen.

Alle Zeitachsen-Updates zur Websocket-Implementierung.

@GoChartingAdmin Ja, wir sind dabei, diese PR zusammenzuführen: https://github.com/ccxt/ccxt/pull/751 , also erwarten Sie in den kommenden Tagen erste Implementierungen eines generischen ws-Wrappers.

@kroitor Ich habe meine EtherDelta-Implementierung noch nicht abgeschlossen. Ermöglicht diese PR die Implementierung von Websockets mit allen grundlegenden Vorgängen? Ist es vollständig genug für mich, um es zu versuchen?

@fredfortier leider noch nicht... Es ist ein erster Ansatz, und das ist er auch

  • nicht vereinheitlicht (börsenspezifisch)
  • nicht portabel (sprachabhängig)

Wir arbeiten immer noch an der Vereinheitlichung von WS (das ist der schwierigste Teil davon). Wenn Sie tiefer in die Geschichte von Websockets in ccxt eintauchen möchten, finden Sie hier eine Übersicht darüber (enthält mehrere andere Implementierungen in JS, die einem einheitlichen Zustand näher kommen): https://gist.github.com/kroitor/7dce1d23a10937ab8c07a5451f17ccf2

Für PHP können wir einen Wrapper um eine Bibliothek erstellen, zB: https://github.com/ampphp/websocket
Die Sache ist, es wäre nur für PHP 7+ verfügbar (wir können es als Vorschlag / optionale Sache machen)

Ich möchte nicht undankbar oder berechtigt erscheinen, weil dies ein großartiges Projekt ist, aber Sie haben eine Zeit lang eine WS-fähige Veröffentlichung versprochen.

Vielleicht sollten Sie ein Github-Projekt erstellen, damit es leichter nachverfolgt werden kann, damit andere etwas beitragen können, und eine einfache Dokumentation der vorgeschlagenen API grob aufschreiben, damit wir sie für Feedback kommentieren können, wenn eine Änderung „billiger“ ist?

Ich kenne den Schmerz sehr gut, Dinge zu überbauen und nicht früh Feedback zu bekommen.

Von dem, was ich gelesen habe, klingt das, was Sie tun, ziemlich ehrgeizig und vielleicht eine v3, wenn wir auf eine v1 warten.

Ich möchte nicht undankbar oder berechtigt erscheinen, weil dies ein großartiges Projekt ist, aber Sie haben eine Zeit lang eine WS-fähige Veröffentlichung versprochen.

Wir leisten die Kernarbeit am Basiscode, um ihn so schnell wie möglich bereitzustellen.

Vielleicht sollten Sie ein Github-Projekt erstellen, damit es leichter nachverfolgt werden kann, damit andere etwas beitragen können, und eine einfache Dokumentation der vorgeschlagenen API grob aufschreiben, damit wir sie für Feedback kommentieren können, wenn eine Änderung „billiger“ ist?

Das ist genau so, wie wir denken, wir werden zuerst eine Teilmenge von Austauschen veröffentlichen, damit die Community von dort aus weitermachen kann, aber wir müssen zumindest unsere aktuellen Tests bestehen, bevor wir sie veröffentlichen können. Hoffe auf ihr Verständnis.

Ich kenne den Schmerz sehr gut, Dinge zu überbauen und nicht früh Feedback zu bekommen.

Wir würden gerne das frühe Feedback bekommen, das ist der Grund dafür, die Vorbereitungsarbeit überhaupt jetzt zu machen.

Fantastisch!

Da Sie über das Bestehen von Tests sprechen und ich einige PR für WS sehe, muss das bedeuten, dass Sie sich auf eine Implementierung und die API dafür und die Verwendung festgelegt haben?

Vielleicht wäre es eine gute Idee, schnell einen Entwurfsabschnitt im Handbuch mit der Bezeichnung „WIP“ zu löschen, damit wir die API und die Verwendung anzeigen und Feedback geben können (falls erforderlich)?

Es ist besser, wenn wir Ihnen jetzt sagen, ob wir glauben, dass wir Probleme sehen.

Vielleicht wäre es eine gute Idee, schnell einen Entwurfsabschnitt im Handbuch mit der Bezeichnung „WIP“ zu löschen, damit wir die API und die Verwendung anzeigen und Feedback geben können (falls erforderlich)?

Dies ist jetzt neben einem Entwurf für die Umsetzung selbst eine unserer obersten Prioritäten. Wir werden es dokumentieren, sobald wir einen Layout-Entwurf (wip) haben. Unser Team ist sehr klein und wir tun unser Bestes, um mit dem Support Schritt zu halten und neue Funktionen hinzuzufügen. WS ist unterwegs, wir brauchen nur noch etwas Geduld. Vielen Dank!

Cool, danke.

Schlagen Sie dennoch vor, dass Sie sich die Verwendung von Github-Projekten ansehen.
Gut für grundlegendes Roadmap-Management und Sichtbarkeit.

Hey Leute - ich bin ziemlich neu hier, habe mich aber in den letzten zwei Wochen in ccxt vertieft. Wenn ich einen Vorschlag bezüglich des WIP machen und einige von uns eifrigen Bibern hier zufrieden stellen darf, die daran interessiert sind, einige [ungetestete/undokumentierte] Funktionalität in die Hände zu bekommen. Viele von uns denken in Code, und nach meiner bescheidenen Erfahrung würde das Zusammenwerfen einiger einfacher Testbeispiele in einem Ipython-Notizbuch Wunder bewirken, um beide Seiten zufrieden zu stellen: Wir können mit ein paar Beispielen spielen, und die erfahrenen Mitwirkenden entwickeln implizit einen Überblick über den Inhalt Werde ins WIP gehen und später in die Dokumentation. Außerdem ist ein oft ignorierter oder unbekannter Vorteil von github, dass es tatsächlich Jupyter-Notebooks ausführt und es somit jedem ermöglicht, von einer Mini-Workbench im Quantopian-Stil zu profitieren, wenn Sie so wollen.

Wie auch immer, nur ein paar Denkanstöße. Mach weiter so.

Gibt es eine organisierte Liste der laufenden Websocket-Arbeiten, damit andere versuchen können, dabei zu helfen?

Hallo!

@mmehrle

Hey Leute - ich bin ziemlich neu hier, habe mich aber in den letzten zwei Wochen in ccxt vertieft. Wenn ich einen Vorschlag bezüglich des WIP machen und einige von uns eifrigen Bibern hier zufrieden stellen darf, die daran interessiert sind, einige [ungetestete/undokumentierte] Funktionalität in die Hände zu bekommen.

Die Hauptschwierigkeit bei dieser Aufgabe besteht darin, einige in der Entwicklung befindliche/nicht dokumentierte Funktionen bereitzustellen. Wenn wir es in einem experimentellen Zustand haben, würde das bedeuten, dass wir alles haben (die andere Arbeit von dort ist trivial). Es im experimentellen Zustand zu haben, ist jetzt unsere oberste Priorität. Im Grunde fragen Sie, ob es möglich ist, 90 % der Denkarbeit jetzt zu erledigen, damit Benutzer die anderen 10 % übernehmen können. Ja, das ist möglich, und genau damit beschäftigen wir uns.

@Geldbörse

Gibt es eine organisierte Liste der laufenden Websocket-Arbeiten, damit andere versuchen können, dabei zu helfen?

Die Hauptschwierigkeit liegt nicht in der Routine, sondern in der richtigen tragbaren und robusten Konstruktion . Wir werden den Umsetzungsentwurf veröffentlichen, sobald wir ihn haben. Wenn Sie sich jetzt ein geeignetes tragbares und robustes Design einfallen lassen, sind Ihre Gedanken dazu willkommen.

@kroitor Lassen Sie mich zunächst sagen, dass alle die Arbeit des Teams zu schätzen wissen.

Wir alle fragen dasselbe – schreiben Sie einfach einen Entwurf der API, die Sie derzeit für den Websocket-Support verfügbar machen möchten, damit wir sehen können, was Sie bereitstellen möchten, und wir können Feedback geben. Das ist es.
Sie haben monatelang daran gearbeitet, sicherlich war das erste, was Sie getan haben, die Anwendungsfälle herauszufinden und sich eine Vorstellung von den API-Ergänzungen zu CCXT und Pseudocode zu machen.

Lassen Sie uns, die Benutzer dieses Moduls, das jetzt sehen und Feedback geben.

Diese Arbeit ist seit vielen, vielen Monaten im Gange und liegt weit hinter dem Zeitplan zurück, den Sie immer wieder angeboten haben. Natürlich sind einige von uns angesichts Ihrer mangelnden Bereitschaft und Ihrer Gründe, nicht zu teilen, und der anhaltenden Verzögerung zunehmend misstrauisch und möchten helfen.

@kroitor Mate, fügen Sie dem Handbuch einfach einen Abschnitt „Echtzeit“ hinzu, der mit WIP gekennzeichnet ist, mit Pseudocode, der die Verwendung der vorgeschlagenen API zeigt, mit init/config, Beispielereignisfluss – sogar ein Link zu einem schnellen und schmutzigen GIST, nur in JS .
Das reicht vorerst aus, damit wir sehen können, wie es als Verbraucher des CCXT-Moduls aussehen wird.

Dann sollten Sie vielleicht in Betracht ziehen, hier ein kurzes Update mit einer realistischen Einschätzung zu machen, wann Sie etwas veröffentlichen werden, mit dem wir spielen können.
Du schuldest niemandem etwas, aber es warten viele Leute.

Nachdem ich mich in einer ähnlichen Situation wie Sie befand und immer wieder versprach und nicht lieferte, lernte ich, dass es besser ist, früh und oft alles zu veröffentlichen, was ich hatte, da die Leute helfen wollen, und frühes Feedback zu erhalten war viel besser in Bezug auf das Engagement der Gemeinschaft und das Vornehmen von Änderungen, wenn sie in Bezug auf den Aufwand billiger waren.

Ich brauche diese Funktion auch wirklich und bin bereit, meine Zeit mit Tests und Feedback zu verbringen.

„_Die Hauptschwierigkeit liegt nicht in der Ausführung der Routine, sondern im richtigen tragbaren und robusten Design._ Wir werden den Implementierungsentwurf veröffentlichen, sobald wir ihn haben. Wenn Sie mit einem richtigen tragbaren und robusten Design aufwarten können Jetzt – Ihre Gedanken dazu sind willkommen.“

Ja, so sehr ich auch anfangen möchte, etwas beizutragen, ich würde eher zustimmen, wenn es um die Designaspekte davon geht. Es ist nicht trivial und es wird ein Pisser sein, es später neu zu gestalten. Bis Sie das alles geklärt haben, bleiben wir gespannt ;-)

@kroitor irgendwelche Entwürfe, die ich mir jetzt ansehen kann?

@jjhesk arbeitet daran, die Spezifikation dem Handbuch hinzuzufügen, wie von @TimNZ gefordert. Noch kein Umsetzungsentwurf.

Ich denke, in der ersten Phase müssten nur die Websocket-Konfigurationen in jeder Basis-JS-Konfiguration verwaltbar sein. Weil der in jeder Sprache zu implementierende Stil völlig unterschiedlich sein wird. Aber wenn es universell gehandhabt werden könnte, nur um die richtige URL zu erstellen, wäre das hilfreich. Gedanken?

@pursehouse Unsere Gedanken begannen mit diesem https://gist.github.com/kroitor/aabecc346a5bded6ead7a82205d8ffc1

Dies ist nur die Einführung zu einer Einführung, das gesamte Streaming-Kapitel und alles, was folgt, wird hoffentlich bald im Handbuch veröffentlicht. Dies wird schließlich zu einer Spezifikation für die WS-Unterstützung, wie hier angefordert.

Es muss auf kompatible Weise in 3 Sprachen erfolgen: JS, Python (sowohl 2 als auch 3) und PHP, unter Beachtung dieser Regeln: https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING .md

@kroitor ok, ich denke, der Entwurf ist hier ziemlich vollständig. Eine weitere Sache, die angesprochen werden muss, ist die Unterstützung der Websocket-Versionierung und deren Verwaltung.

@kroitor wie ist der fortschritt?

@kroitor wie ist der fortschritt?

Mal sehen ... Ich habe die obige Antwort vor genau 48 Stunden gepostet, um die Menge zufrieden zu stellen.

Seitdem habe ich zweimal für ca. 6 Stunden geschlafen, das sind insgesamt 12 Stunden, verbleibende 36 Stunden.
Ich nahm auch mehrere Mahlzeiten ein und erledigte einige andere Dinge, die insgesamt etwa 4 Stunden dauerten, 32 Stunden blieben übrig. Ich habe etwas gearbeitet, um Geld für meinen Lebensunterhalt zu verdienen, das hat ungefähr 8 Stunden gedauert, niemand, außer ein paar Leuten, die gespendet haben (Dank und Respekt an sie), bezahlt tatsächlich für die Open-Source-Arbeit, erinnerst du dich? ) Also, um etwas zu essen zu haben, müssen wir auch an anderen Projekten arbeiten.

Das gibt uns eine verbleibende Zeit von 32-8 = 24 Stunden, ein ganzer Tag, um an ccxt zu arbeiten. Dann habe ich ungefähr 4 Stunden damit verbracht, verschiedenen Leuten hier und da zu antworten, wie es geht. Das sind noch 20 Stunden für die eigentliche Arbeit. Innerhalb dieser Zeit habe ich 20 neue Issues geschlossen (zum Teil mehrfach beantwortet) und ca. 30 Pull-Requests mit diversen Bugfixes, Erweiterungen und Edits in die bestehende Codebasis gemergt. Das sind etwa 20 Minuten pro Issue/Pull-Request. Einige von ihnen erfordern eine intensive Kommunikation und dauern länger, andere sind schneller abgeschlossen.

Nun, ich kann mir nicht vorstellen, wie Sie innerhalb dieses Zeitrahmens ernsthafte Fortschritte bei diesem speziellen Thema erzielen könnten. Und meine Antwort und Einstellung zu dieser Art von Fragen wird in diesem Kommentar vollständig zum Ausdruck gebracht: https://gist.github.com/kroitor/aabecc346a5bded6ead7a82205d8ffc1#gistcomment -2335076

Grundsätzlich ist auch der Fortschritt dieses Open-Source-Projekts offen, also wann immer Sie sich fragen, wie es geht, werfen Sie einen Blick in die Commit-Historie )

Irgendwelche Gedanken zu diesem Vorschlag?
https://gist.github.com/kroitor/aabecc346a5bded6ead7a82205d8ffc1#gistcomment -2401614

@dmitriz danke! Dort beantwortet)

Es scheint, dass es keine Möglichkeit gibt, zu empfangen
Benachrichtigungen für die neuen Kommentare in Gists,
Daher möchte ich vorschlagen, die Diskussion hierher zu verschieben,
wo wir diese und andere schöne Einrichtungen haben.

In Bezug auf @kvdveer Kommentar in
https://gist.github.com/kroitor/aabecc346a5bded6ead7a82205d8ffc1#gistcomment -2403346
Ich stimme zu, dass jede Sprache ihr eigenes bevorzugtes Idiom verwenden sollte
und dass sich meine Vorschläge hauptsächlich auf die JS konzentrieren.

Es wäre jedoch traurig, wenn die "Unterklassifizierung" Sprachen aufgezwungen würde, die sie nicht benötigen.
Ich finde den klassenbasierten JS-Code oft sehr schwer zu verstehen, weil die Kapselung zu oft durch Klassen unterbrochen wird, die auf innere Details verweisen, deren Definitionen über eine große Anzahl von Dateien verteilt sind.

Ich bin kürzlich auf ein ganzes Ökosystem von Stream-Bibliotheken gestoßen
https://github.com/pull-stream/pull-stream
gepflegt von @dominictarr (der einer der produktivsten Mitwirkenden in der JS-Node-Community ist). Sowohl der Code als auch die API sind sehr elegant und einfach und verwenden keine Klassen.

@kroitor Ich habe die Websockets-Funktion getestet. Ich habe React/Ratchet und Evenement in PHP und ws und EventEmitter in Javascript verwendet. Ich weiß nicht, ob dies ein gültiger Ansatz für ccxt sein könnte, aber ich habe PHP- und js-Beispiele erstellt, um cex websocket zu verbinden und Auftragsbuchaktualisierungen zu erhalten, und es funktioniert (viele Dinge müssen überprüft werden, aber ich sehe Aktualisierungen im Ausführungsprotokoll). Wenn Sie denken, dass es ein guter Ausgangspunkt sein könnte, würde ich Python auch gerne testen.

Entschuldigung, ich habe den Github-Link vergessen: https://github.com/lfern/ccxt/tree/feature/websockets

@lfern schön, hast du an einer Struktur für die Websocket-Konfigurationen pro Austausch gearbeitet? Ich glaube, das war die eigentliche Hürde

@pursehouse Ich habe versucht, den gesamten Code im Zusammenhang mit Websockets aus dem Code zu entfernen, der für jeden Austausch geschrieben wurde. Auf diese Weise habe ich eine Basisklasse AsyncConnection definiert

https://github.com/lfern/ccxt/blob/feature/websockets/js/base/async/async_connection.js

das definiert nur diese Methoden: connect, close, send und sendJson. Diese Basisklasse erbt von EventEmitter und gibt Ereignisse im Zusammenhang mit Websockets-Ereignissen aus. In diesem Test habe ich drei Ereignisse definiert:

  • 'Nachricht', wenn eine Nachricht von der Verbindung empfangen wird,
  • 'error' wann ein Fehler aufgetreten ist und
  • 'Schließen', wenn die Verbindung vom Server geschlossen wird.

Ich habe eine untergeordnete Klasse WebsocketConnection von AsyncConnection definiert,

https://github.com/lfern/ccxt/blob/feature/websockets/js/base/async/websocket_connection.js

die eine einfache Websocket-Verbindung implementiert (wenn ein Austausch einen anderen Verbindungstyp definiert, können Sie neue untergeordnete Klassen von AsyncConnection definieren, z. B. Pusher in Bitstamp). In Exchange.js können Sie diese Ereignisse erfassen

https://github.com/lfern/ccxt/blob/feature/websockets/js/base/Exchange.js#L1176

und benutzerdefinierte Funktionen aufrufen, die in Austauschklassen in *.js definiert sind.

In cex.js habe ich die Methode _asyncOnMsg definiert

https://github.com/lfern/ccxt/blob/feature/websockets/js/cex.js#L539

das die von websocket empfangene Nachricht erhält, sie analysiert und alles tut, was zu tun ist. Ich habe die Exchange-Klasse so geändert, dass sie auch von EventEmitter erbt, sodass Sie Ereignisse von cex.js senden können. In diesem Test habe ich nur den Orderbuchprozess implementiert. Wenn also die Methode _asyncOnMsg erkennt, dass das Orderbuch eingegangen ist, verarbeitet sie das Ereignis „ob“ und gibt es aus.

https://github.com/lfern/ccxt/blob/feature/websockets/js/cex.js#L563

Dieses Ereignis könnte vom Hauptprogramm erfasst werden, um eine beliebige Aktion beim Empfang zu implementieren. Ich habe die Methode _asyncSubscribeOrderBook auf cex.js definiert

https://github.com/lfern/ccxt/blob/feature/websockets/js/cex.js#L596

die von der asyncSubscribeOrderBook-Methode in Exchange.js aufgerufen wird. In dieser _asyncSubscribeOrderBook-Methode können Sie die Nachricht generieren, die an Websocket gesendet werden soll, um ein Orderbuch-Abonnement zu erstellen (Sie würden für jede Börse definieren).

Im Moment sieht die Konfigurationsstruktur für asynchrone Verbindungen wie folgt aus:

'asynchron': {
'Typ': 'ws',
'url': ' wss://ws.cex.io/ws/ ',
'wait4readyEvent': 'auth',
},

wobei type der Verbindungstyp ist (in diesem Fall Websockets), url die Websocket-URL ist und wait4readyevent das Ereignis definiert, auf das Sie warten müssen, bis Sie einen Befehl an den Websocket abonnieren oder senden können (in cex müssen Sie sich authentifizieren, bevor Sie ein Abonnement senden Anfrage). Diese Struktur muss jedoch überarbeitet werden, wenn neue asynchrone Verbindungen hinzugefügt würden. Ich habe in node und php getestet, und es scheint, dass es funktionieren könnte.

https://github.com/lfern/ccxt/blob/feature/websockets/examples/js/async-orderbook-cex.js

https://github.com/lfern/ccxt/blob/feature/websockets/examples/php/async_orderbook_cex.php

Ich denke, dass es ein guter Ausgangspunkt sein könnte, um Websockets in Börsen zu implementieren, aber ich möchte nicht fortfahren, wenn Sie denken, dass dies nicht der Fall ist.

@lfern sieht für mich nach einem guten Anfang aus. Ich würde versuchen, diese großen if-Anweisungsblöcke aus der cex._asyncOnMsg -Methode zu entfernen, wenn Sie nicht möchten, dass diese Methode auf lange Sicht in jedem Austausch riesig wird. _async_orderBookSubscribe oder was auch immer...

Weil ich denke, idealerweise ... hätten Sie eine Liste von Methoden und deren Websocket-Schlüssel, damit eine allgemeinere Einzelmethode die Datenprüfung ausführen könnte. Die Exchange-Konfiguration hätte also ein Array der Schlüssel und ihre entsprechende Methode zur Verarbeitung dieser Daten. Dann wäre die Exchange-Klasse die einzige Methode, in die umfangreiche Logik geschrieben werden müsste, um zu prüfen, was mit dem Ergebnis zu tun ist. Oder lassen Sie sie sogar 1:1 benennen
anstelle von if( e === 'order-book-subscribe' ) .... sollte es so etwas wie cex._async_eventOrderBookSubscribe aufrufen, ähnlich wie bei dem bereits existierenden Methoden-Mapping-Konzept

Probieren Sie vielleicht ein paar weitere Austauschvorgänge mit sehr unterschiedlichen Web-Socket-Systemen aus, um zu sehen, welche Probleme/Verfeinerungen auftauchen.

Denken Sie daran, dass ein Schlüsselfaktor sein wird, wie viel weniger Code pro Austausch vorhanden sein muss, der generisch gehandhabt werden kann

Ich möchte diese Websocket-Implementierung für Binance mit voll funktionsfähigem Code teilen:
https://github.com/zoeyg/binance/issues/57

Ein wichtiger Teil ist die Wiederverwendbarkeit von Funktionen und die Trennung von Anliegen.
Beispielsweise ist der gesamte WebSocket-bezogene Teil vollständig in dieser Funktion gekapselt:

// general purpose websocket factory
const WebSocket = require('ws')
const createWS = path => cb => 
  new WebSocket(path).on('message', cb)

Der Rest sind reine Funktionen, die isoliert komponiert und getestet werden können.

@dmitriz Ich verwende vorher keine Streams, aber denkst du, dass dieser Ansatz in anderen Arten von Verbindungen verwendet werden könnte? Bitstamp verwendet eine Pusher-Verbindung für Trades, Orderbuch und Ticker, und in Gemini müssen Sie sich für jedes Symbol mit einer anderen WS-URL verbinden. Kennen Sie eine ähnliche Bibliothek, um sie in Python und PHP zu implementieren?

@lfern
Unterschiedliche ws URLs sollten keinen Unterschied machen, Sie setzen einfach die createWS Factory mit einer anderen passenden Funktion getUrl zusammen.

Ich habe keine Erfahrung mit Pusher, ist das eine Art Wrapper um WS?
Dann würde es die createWS Fabrik durch eine eigene Fabrik ersetzen, mit der gleichen Idee:

const createPusher = (channel, event, key) => cb => 
  new Pusher(....).on(event, cb)

oder so ähnlich
(Ich kenne die genaue Syntax nicht, aber sie sind normalerweise ähnlich, also erfinde ich sie nur.)

Ich habe nicht so viel Erfahrung mit Python oder PHP
aber das Prinzip sollte dasselbe sein - Sie erstellen eine allgemeine Verwendungsfunktion
das Ihre Callback-Funktion für den Stream abonniert.
Wenn es allgemein und wiederverwendbar ist, können Sie es gut vom Rest des Codes isolieren.

@dmitriz @lfern Der Socket-Code geht nicht in die Austauschklasse, sondern in die sprachspezifischen Klassen. Die Austauschklassen haben nur Konfigurationsinformationen und vielleicht ein wenig austauschspezifische Logik.
Lassen Sie sich nicht darauf ein, welche nodejs-Bibliothek Sie verwenden sollen, da dieser Teil nicht relevant ist, um die allgemeine Funktionsfähigkeit zu erhalten.

Der Schlüssel liegt darin, die Konfigurationsstruktur der Exchange-Klasse in die Lage zu versetzen, alles zu handhaben, was die Vielfalt der Börsen darauf werfen kann.

Höchstwahrscheinlich wäre es sinnvoll, wenn die Bibliothek nur das Erstellen/Lesen der Daten für die Sockets unterstützt und keine Entscheidung darüber trifft, welche Socket-Bibliothek verwendet werden soll

@Geldbörse

Der Socket-Code geht nicht in die Austauschklasse, sondern in die sprachspezifischen Klassen.

Können Sie erklären, welche Klassen Sie meinen?
Ist die Klasse Exchange unter /js/base , von der die Vermittlungsstellen erben, die sprachspezifische Klasse? Welche Klassen sind dann nicht sprachspezifisch?

Lassen Sie sich nicht darauf ein, welche nodejs-Bibliothek Sie verwenden sollen, da dieser Teil nicht relevant ist, um die allgemeine Funktionsfähigkeit zu erhalten.

Stimmen Sie zu, dass es gut ist, diese Bibliotheken an einem Ort aufzubewahren.
Wo würden Sie sie hinstellen?

Der Schlüssel liegt darin, die Konfigurationsstruktur der Exchange-Klasse in die Lage zu versetzen, alles zu handhaben, was die Vielfalt der Börsen darauf werfen kann.

Wenn wir davon ausgehen können, dass der Austausch immer etwas JSON zurückgibt, werden die Empfängerfunktionen als Argumente übergeben. Oder meinst du eine Nachbearbeitung der Daten basierend auf bestimmten Konfigurationen?

Höchstwahrscheinlich wäre es sinnvoll, wenn die Bibliothek nur das Erstellen/Lesen der Daten für die Sockets unterstützt und keine Entscheidung darüber trifft, welche Socket-Bibliothek verwendet werden soll

In der Tat wäre es gut, eine generische Schnittstelle zu verwenden. Wie in meinem Beispiel, wo die Funktionssignatur nur die url und callback hat, die in jede andere Socket-Bibliothek eingepasst werden könnten.
Vielleicht eine source Objektabstraktion, die alle Informationen enthält, die zum Abrufen des Streams erforderlich sind?

Aber am Ende muss die Bibliothek immer noch eine Auswahl treffen, welche Socket-Bibliothek verwendet werden soll, nicht wahr?

Nur die Klassen wie binance oder gdax sind nicht sprachspezifisch. Die anderen sind sprachspezifisch.

Was benötigt wird, ist eine Konfigurations-/Methodenstruktur, die in jeder Vermittlungsklasse existieren kann, die die Daten erzeugen würde, die zum Erzeugen einer Socket-Verbindung benötigt werden. Das heißt, die URL und potenzielle Post/Get-Daten sind enthalten. Dann ein weiterer Satz von Regeln/Methoden zum Analysieren der Daten, die in jedem Zyklus von diesen Websockets zurückgegeben werden.

Es gibt viel zu viele Konzepte dafür, welche spezifische ereignisbasierte Bibliothek jemand verwenden möchte/muss. Wenn Sie also diese Funktionen für die einfache Handhabung des Auffüllens der Socket-Verbindungsinformationen und die Verarbeitung der Ergebnisse dieser Verbindung verwenden, kann dies dazu führen, dass es eine gibt spezifische oder Sperrfeuer verschiedener Socket-Bibliotheken, die zur Verwendung implementiert sind. Weil Sie noch Code implementieren müssen, um diese Daten zu verarbeiten.

$exchange = new \ccxt\binance();
$socketInfo = $exchange->getSocket( $someIdeaOfParams );
$socketLibrary = \SomeSocketLib();

\Amp\Loop::run( function () use ( $streamsUrl, $exchange ) {
$connection = $socketLibrary->open( $socketInfo['url'], $socketInfo['post'] );
while( $message = yield $connection->receive() ) {
/// stuff..
}
}

etc...

Es ist ein projektspezifischer Weg, um zu versuchen, die tatsächliche Socket-Verbindung zu handhaben.

Die größte Hürde ist ein praktikables, wiederholbares Konfigurationskonzept, das über alle Börsen hinweg funktioniert. Der Rest ist zweitrangig und nicht einmal wirklich wichtig, um in der Bibliothek zu sein ... es sei denn, die Leute haben Lust, Beispiele für verschiedene Socket-Bibliotheken zu übernehmen

@dmitriz Ich denke, Sie müssen die Funktionalität besser verstehen, um dies abzuwägen ... lassen Sie @lfern einfach seine Arbeit fortsetzen

@Geldbörse

@dmitriz Ich denke, Sie müssen die Funktionalität besser verstehen, um dies abzuwägen ... lassen Sie @lfern einfach seine Arbeit fortsetzen

Ich finde diesen Kommentar ziemlich unhöflich, besonders von jemandem, der nie zu diesem Projekt beigetragen hat.

@dmitriz Entschuldigung, Mann, Ihre Fragen sind einfach viel zu verwirrt darüber, wie die Aufteilung zwischen dem, was wiederverwendet werden kann, und dem, was nicht möglich ist. Es ist frustrierend, es zu erklären, warten Sie einfach.

das ist ein tolles Projekt!

Wie sieht der Zeitplan für die Unterstützung der Websocket-API aus?

@imhazige es liegt im Moment ziemlich in @lferns Händen, du könntest aber einspringen und helfen, wenn du Zeit hast

@Geldbörse

ok, danke, ich denke, es sollte dieses Feature sein https://github.com/lfern/ccxt/tree/feature/websockets

Ich werde meinen Kommentar von #3023 wiedergeben

Hallo Leute, ich brauche etwas Hilfe bezüglich dieser Bibliothek. Ich bin ein bisschen neu in der Programmierung in der Javascript-Welt und versuche dies, um eine Backend-Datenberechnung zu erstellen.

Ich versuche, alle Börsen durchzugehen und ihre Ticker herunterzuladen. In der Schleife baue ich eine JSON-Struktur auf, in der ich alle Daten durchgehen kann, um Berechnungen durchzuführen. Ich würde das gerne schneller machen, da ich vorhabe, einen Web-Client mit einigen Diensten zu bauen, beginnend mit einer Marktkapitalisierung für Münzen in Echtzeit. Das Abrufen von Websockets wird für ccxt verfügbar sein?

Ist es praktikabel, dies auf diese Weise zu tun? Sie können die Quelle hier überprüfen .

@jraicr Ich würde empfehlen, von der Arbeit, die @lfern begonnen hat, abzuzweigen und zu versuchen, seine Arbeit fortzusetzen, um ein generisches Format für die Konfigurationen pro Austausch zu erhalten, um die URL-Erstellung und Ergebnisverarbeitung zu handhaben. Der Code zum tatsächlichen Erstellen eines Sockets sollte wahrscheinlich separat gehalten werden, da jede Sprache Sockets unterschiedlich verwendet. Aber das Hinzufügen einer funktionalen optionalen Bibliothek als Beispiel würde den Leuten sicherlich helfen, nachdem die Basislogik des Websocket-Konfigurationssystems aufgebaut ist.

Und lesen Sie auch die vielen Hinweise, die wir zu Details in diesem Thread hinzugefügt haben :)

Ich habe in dieser Funktion https://github.com/lfern/ccxt/tree/feature/websockets getestet. Ich habe das Bestellbuch mit gateio, binance, cex und coincheck getestet, aber ich denke, das Design ist noch nicht robust genug. Ich würde es gerne mit anderen Websockets-Börsen testen. Wissen Sie, wo Sie die wichtigsten Börsen mit Websocket-Unterstützung finden (vorerst kein Push-Protokoll)?

Danke

@lfern Sie sollten sich vielleicht auch gdax, bitmex, bitfinex ansehen ... wir hoffen, die vollständige Liste in ccxt zusammenstellen zu können ... aber bis dahin, denke ich, soll das Verfahren von CoinMarketCap-Ranking → CCXT-Börsenliste gehen → API-Dokumente von Exchanges.

@lfern ja, wie er sagte, testen Sie diese und von den am besten bewerteten Börsen und arbeiten Sie sich in der Liste nach unten, bis Sie das Gefühl haben, dass Sie die Dinge genug optimiert haben

Ich habe lbank & zb Websocket Orderbook erfolgreich getestet, aber ich habe einige Fragen:

  1. Ich habe ein Kontextobjekt/Wörterbuch erstellt, um alle zeitlichen Informationen zu speichern, die Sie über die Websocket-Verwaltung benötigen. Auf dieses Wörterbuch kann von jedem Austauschcode (z. B. binance.js) aus zugegriffen werden, sodass Sie alle Daten daraus abrufen/einstellen können. Wenn Sie in diesem Kontext einen Wert speichern müssen, können Sie dies folgendermaßen tun:
let ethBtcSymbol = this.context['ob']['ETH/BTC'];
ethBtcSynbol['ob'] = obReceived;

Aber wenn dies in PHP transpiliert wird, können Sie keinen Verweis auf this.context['ob']['ETH/BTC'] erhalten, Sie erhalten wirklich eine Kopie dieses Wörterbuchs, also setzen Sie diesen Wert hier nicht .Kontext. Ich denke, die einzige Möglichkeit, dies zu tun, besteht darin, auf diese Weise in .js zu codieren:

this.context['ob']['ETH/BTC']['ob'] = obReceived;

Weißt du, wie wir das lösen könnten?

  1. Ich habe alle neuen Methoden mit dem Präfix "async" definiert. Denken Sie, dass dies in Ordnung ist oder es besser ist, ein anderes Präfix zu verwenden oder keine Präfixe in diesen Funktionen zu verwenden?

  2. Wie könnten wir diesen Code auf ccxt zusammenführen? Glaubst du, dass dies in einem separaten Zweig zusammengeführt werden könnte, oder ist es besser, diesen Zweig beizubehalten?

https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Ich denke, wir brauchen andere Leute, die diesen Code testen und Feedback von ihnen bekommen. Es ist das erste Mal, dass ich asyncio und reacphp verwende, und ich bin mir sicher, dass ich viele Fehler bei der Implementierung gemacht habe.

@lfern , wenn du mit JS am besten bist, bleib einfach beim Lösen all der JS-Sachen. Ich werde versuchen, die PHP-Probleme so schnell wie möglich zu überprüfen. Aber ich würde vorschlagen, Dinge wie _asyncHandleOb nicht abzukürzen. Ich habe eine Weile gebraucht, um herauszufinden, was "ob" bedeutet :) Ich könnte die Dinge genauso gut so ausführlich wie möglich halten.
Soweit die Namensfrage für async oder was auch immer ... Ich denke, dass es besser sein könnte, mit socket oder websocket zu gehen, da es mehr asynchrone Konzepte als nur Websockets gibt ... damit zukünftige Probleme vermieden werden. Und schon weniger Verwirrung gegenüber der Einstellung js : async

Aber wenn dies in PHP transpiliert wird, können Sie keinen Verweis auf this.context['ob']['ETH/BTC'] erhalten, Sie erhalten wirklich eine Kopie dieses Wörterbuchs, also setzen Sie diesen Wert hier nicht .Kontext.

Richtig, PHP-Arrays werden nach Wert kopiert, nicht nach Referenz (im Gegensatz zu JS und Python).

Ich denke, die einzige Möglichkeit, dies zu tun, besteht darin, auf diese Weise in .js zu codieren:

this.context['ob']['ETH/BTC']['ob'] = obReceived;

Weißt du, wie wir das lösen könnten?

Ich fürchte, die einzige Möglichkeit, dies transpilierbar zu lösen, besteht darin, entweder eine Reihe von Basisklassenmethoden für die Arbeit mit Objektreferenzen zu erstellen oder die Syntax aus Ihrer obigen Zeile zu verwenden.

Aber ich würde vorschlagen, Dinge wie _asyncHandleOb nicht abzukürzen.

Ich würde hier @pursehouse zustimmen, „OrderBook“ oder „Orderbook“ wäre ein viel freundlicherer Name für „ob“.

Ich habe alle neuen Methoden mit dem Präfix "async" definiert. Denken Sie, dass dies in Ordnung ist oder es besser ist, ein anderes Präfix zu verwenden oder keine Präfixe in diesen Funktionen zu verwenden?

Ich würde lieber überhaupt keine Präfixe verwenden. Ich würde die Methodenbenennung verwenden, die explizit wäre, was sie ohne doppelte Präfixe tut. Normalerweise hat es die Form von "Verb-Substantiv(en)", wie "updateData", "saveFile", "fetchOrderBook", "createOrder", "handleOrderBookDeltaUpdate" ...

Wie könnten wir diesen Code auf ccxt zusammenführen? Glaubst du, dass dies in einem separaten Zweig zusammengeführt werden könnte, oder ist es besser, diesen Zweig beizubehalten?

https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Wir werden damit beginnen, dies in einen separaten Zweig von CCXT zu stellen. Allerdings müssen wir den WS-Code selbst etwas überarbeiten, um ihn mit SignalR-, reinen/benutzerdefinierten WS- und socket.io-Protokollen kompatibel zu machen (das sind die drei beliebtesten Streaming-Varianten, die häufig an vielen Börsen verwendet werden). Und dafür müssen wir sicherstellen, dass wir keine globalen Variablen oder Instanzvariablen verwenden. Andernfalls könnte dies zu unzähligen Konflikten in der asynchronen Parallelität führen (wir haben sie bereits in Python aufgrund von Instanzvariablen wie self.last_http_response und dergleichen).

Wenn Sie nämlich die Verwendung this.context['ob'] vermeiden und stattdessen das Funktionsargument verwenden können, um es zu übergeben, würde dies dazu beitragen, das obige "Copy-by-Value" -Problem etwas zu lösen, und würde den Code auch robuster machen. Wir würden also die Globals und Instanzvariablen gegen lokale Scope-Variablen und für Async-Generatoren tauschen. Auf diese Weise würden wir mögliche Konflikte in Zukunft verhindern. Dies wäre jedoch eine erhebliche Änderung an Ihrem Code. Im Allgemeinen bevorzugen wir reine zustandslose Funktionen (die keinen globalen Zustand oder Instanzzustand ändern). Schmutzige zustandsbehaftete Methoden stehen normalerweise in einer gleichzeitigen Umgebung (Rennbedingungen usw.) im Konflikt miteinander.

Wie könnten wir diesen Code auf ccxt zusammenführen? Glaubst du, dass dies in einem separaten Zweig zusammengeführt werden könnte, oder ist es besser, diesen Zweig beizubehalten?

Etwas mehr zu diesen Fragen ... Wir beginnen mit dem Sammeln einer Liste von WS-fähigen Börsen, fügen unserer Börsentabelle eine WS-Spalte hinzu und beginnen dann mit dem Ausfüllen. Hoffentlich haben wir in der ersten stabilen Version davon ein Dutzend Austauschvorgänge mit WS-Unterstützung. Sobald dies erledigt ist, werden wir es mit dem Master-Zweig zusammenführen. Und wir werden den Rest von dort aus weiter hinzufügen.

Wir werden damit beginnen, dies in einen separaten Zweig von CCXT zu stellen. Allerdings müssen wir den WS-Code selbst etwas überarbeiten, um ihn mit SignalR-, reinen/benutzerdefinierten WS- und socket.io-Protokollen kompatibel zu machen (das sind die drei beliebtesten Streaming-Varianten, die häufig an vielen Börsen verwendet werden). Und dafür müssen wir sicherstellen, dass wir keine globalen Variablen oder Instanzvariablen verwenden. Andernfalls könnte dies zu unzähligen Konflikten in der asynchronen Parallelität führen (wir haben sie bereits in Python aufgrund von Instanzvariablen wie self.last_http_response und dergleichen).

Ich weiß nicht, wie ich das ohne Instanzvariablen machen soll, weil Sie das Live-Orderbuch führen und bei jedem Delta-Update ändern und in der gleichen Reihenfolge verarbeiten müssen, in der Sie sie von Websocket erhalten. Ich denke also, dass Sie eingehende Websockets-Nachrichten nicht mit verschiedenen Threads verarbeiten können. (aber ich weiß nicht so viel über asyncio). Vielleicht ist dieser Ansatz nicht gut, um diese Anforderung zu erfüllen.

Wie auch immer, ich denke, es ist keine gute Idee, mehr Austausch zu testen, bevor diese Änderungen im WS-Code (um ihn mit diesen Protokollen kompatibel zu machen: SignalR, ...) fertig wären. Aber ich weiß nicht, wie ich in diesem Job zusammenarbeiten soll. Ich dachte, dies könnte erreicht werden, indem man einen Wrapper über diese Protokolle entwickelt und mit EventEmitter die Ereignisse „On-Open“, „On-Message“, „On-Error“ und „On-Close“ ausgibt. Aber wenn dies kein guter Ansatz ist, wäre es vielleicht besser, noch einmal anzufangen und eine neue Klasse/Schnittstelle zu definieren, die mit all diesen Protokollen gut funktioniert.

Vielleicht einen Hinweis für den JS-zu-PHP-Transpiler einführen, um die Referenz & anstelle von copy zu verwenden?
http://php.net/manual/en/language.references.whatdo.php

Vielleicht einen Hinweis für den JS-zu-PHP-Transpiler einführen, um die Referenz & anstelle von Kopie zu verwenden?

Ja, das könnte ein Workaround sein, aber das Ziel ist es, die Codebasis in reinen Zielsprachen sauber zu halten, sonst wären diese Hinweise bereits überall in diesem Repo vorhanden. Wir würden lieber eine Basismethode wie updateArrayByReference (&array) hinzufügen.

@lfern

Ich weiß nicht, wie ich das ohne Instanzvariablen machen soll, weil Sie das Live-Orderbuch führen und bei jedem Delta-Update ändern und in der gleichen Reihenfolge verarbeiten müssen, in der Sie sie von Websocket erhalten.

Die übliche Vorgehensweise besteht darin, keine Instanzvariablen zu verwenden, sondern stattdessen eine Referenz auf das Orderbuch zusammen mit den Aktualisierungsdaten selbst in die Aktualisierungsbehandlungsmethode zu übergeben. Wenn Sie also die richtigen Referenzen durch die gesamte Aufrufkette leiten, brauchen wir überhaupt keine Instanzvariablen, richtig?

Das Hauptproblem mit Instanzvariablen (das sind fast identische "globale" Variablen) besteht darin, dass Sie möglicherweise viele Nebenwirkungen, Konflikte und Inkonsistenzen mit Methoden haben, die Mutationen dieser Instanzvariablen durchführen, wenn asynchrone Antworten nicht mehr in der richtigen Reihenfolge sind. Wie ich schon sagte, wir hatten früher einige davon, also sollten wir den Fehler besser nicht wiederholen.

ok, @kroitor . Vielleicht könnte jemand mit einer großartigen Erfahrung in Python Asyncio einen Blick auf exchange.py werfen. Ich konnte nicht finden, wo ich diese lokale Variable (Live-Orderbuch und andere Statusvariablen) platzieren müsste, um in jeder Austauschmethode sichtbar zu sein, die asynchrone Nachrichten von Websocket verarbeitet. Wenn dies mit tatsächlich in Python geschriebenem Code nicht möglich ist, müssen wir den Knoten- und PHP-Code an die erforderlichen Änderungen für Asyncio im Multithread-Modus anpassen.

@lfern

Vielleicht könnte jemand mit einer großartigen Erfahrung in Python Asyncio einen Blick auf exchange.py werfen.

Es gibt zwei exchange.py -Dateien, eine für die synchronisierte Python-Version und eine für die asynchrone Python-Version, abgeleitet von der synchronisierten. Sie suchen also wahrscheinlich nach https://github.com/ccxt/ccxt/blob/master/python/ccxt/async/base/exchange.py

Oder ich habe die Frage falsch verstanden, wenn ja, lass es mich bitte wissen.

Ich konnte nicht finden, wo ich diese lokale Variable (Live-Orderbuch und andere Statusvariablen) platzieren müsste, um in jeder Austauschmethode sichtbar zu sein, die asynchrone Nachrichten von Websocket verarbeitet.

Keine Sorge, im Grunde meine ich, anstatt dies zu tun:

function initializeOrderBook (snapshot) {
    this.context['ob'] = { ... snapshot ... }; // new orderbook state, for example
    this.ws.handler = this.updateOrderBook
}

function updateOrderBook (deltas) {
    const oldOrderBook = this.context['ob'];
    const newOrderBook = parseDeltas (deltas, oldOrderBook);
    this.context['ob'] = newOrderBook;
}

...

↓ Anstelle des obigen ist es besser, so etwas zu tun (Pseudocode):

// a base method
function initializeOrderBook (snapshot) { 
    const newOrderBook = new ccxt.IncrementalOrderBook ({ ... snapshot ... }) // initialize it
    // should pass by ref in PHP in the base code, class instances are passed by reference
    this.ws.handler = (deltas) => {
        const updatedOrderBook = this.updateOrderBook (newOrderBook, deltas) 
        this.orderBookUpdated (updatedOrderBook)
    }
    return newOrderBook; // return it, don't store it in an instance variable
}

function updateOrderBook (orderBookInstance, deltas) {
    // mutate orderBookInstance
    orderBookInstance.update (deltas)
    return orderBookInstance;
}

Im zweiten Beispiel ist das Auftragsbuch selbst ein Objekt, das "per Referenz übergeben" und von den Anrufen zurückgegeben wird, sodass sich keine Anrufe gegenseitig stören, indem sie in einen gemeinsam genutzten Zustand schreiben. Die Sync-Primitive sollten sich im Orderbuch selbst befinden. Ich bin mir nicht sicher, ob ich es mit diesem Beispiel erkläre ...

Außerdem wird nicht empfohlen, asyncio + Threads zu mischen. Wir verwenden besser entweder nur die Thread-Parallelität oder nur die asynchrone Parallelität (bevorzugt), und Sie können nicht wirklich beide Parallelitäten gleichzeitig verwenden, da sie beginnen, ... ähm ... zu konkurrieren.

Was ich in meinem vorherigen Beitrag meinte, ist, dass wir es einfach zusammen mit den Argumenten an alle daran interessierten Aufrufe weitergeben und den aktualisierten Wert von diesen Aufrufen zurückgeben sollten, anstatt in die Instanzvariable zu schreiben. Dies sollte das PHP ausgeben, auch wenn der Wert per Copy übergeben wird.

Einer der Schlüsselpunkte von PHP5 OOP, der oft erwähnt wird, ist, dass "Objekte standardmäßig durch Referenzen übergeben werden". Dies ist nicht ganz richtig.
Eine PHP-Referenz ist ein Alias, der es zwei verschiedenen Variablen ermöglicht, denselben Wert zu schreiben. Ab PHP5 enthält eine Objektvariable nicht mehr das Objekt selbst als Wert. Es enthält nur einen Objektidentifizierer, der es Objektzugreifern ermöglicht, das eigentliche Objekt zu finden. Wenn ein Objekt per Argument gesendet, zurückgegeben oder einer anderen Variablen zugewiesen wird, sind die verschiedenen Variablen keine Aliase: Sie enthalten eine Kopie des Bezeichners, der auf dasselbe Objekt zeigt.

Hoffe, das hilft, werde gerne antworten, wenn Sie weitere Fragen dazu haben.

Danke @kroitor Ich bin mir sicher, dass es hier implizit ist, aber sorry, ich kann es immer noch nicht erkennen. Bitte lassen Sie mich Ihrem Codebeispiel folgen:

// a base method in Exhange.js
function initializeOrderBook (snapshot) { 
    const newOrderBook = new ccxt.IncrementalOrderBook ({ ... snapshot ... }) // initialize it
    // should pass by ref in PHP in the base code, class instances are passed by reference
    this.ws.handler = (deltas) => {
        const updatedOrderBook = this.updateOrderBook (newOrderBook, deltas) 
        this.orderBookUpdated (updatedOrderBook)
    }
    return newOrderBook; // return it, don't store it in an instance variable
}
// a base methid in Exchange.js
function updateOrderBook (orderBookInstance, deltas) {
    // mutate orderBookInstance
    orderBookInstance.update (deltas)
    return orderBookInstance;
}

In cex.js habe ich eine Eingabemethode definiert, um jede von Websocket empfangene Nachricht zu analysieren.

/* ...*/
processWebsocketIncomingMessage (msg) {
  // parse msg
  if (orderbook snapshot) {
    let orderBook = this.initializeOrderBook (msg.snapshot);
    return orderbook;
  } else if (orderbook delta) {
    /* here I need to recover incremental orderbook and then*/
  } else if (orderbook subscription) {
    /* here I need to recover a promise set when I send a subscription message (in other cex.js method) to tell the user subscription succeded*/
   }
}

Diese Methode wird von Exchange.js aufgerufen:

/* receive msg from websocket */
let orderbook = this.processWebsocketIncommingMessage(msg);

Mit diesem Modell habe ich ein Problem, weil ich nicht weiß, ob eine eingehende Nachricht eine Orderbuchnachricht in Exchange.js ist (dies ist don in cex.js), aber falls ich könnte, wo ich diese Orderbuchvariable speichern könnte, und dann Stellen Sie es in Exchange.js wieder her, damit ich es (wenn eine Delta-Nachricht empfangen wird) in diese Methode processWebsocketIncommingMessage einfügen kann, ohne es in einer Instanzvariablen zu speichern?

Entschuldigung, sicher ist es trivial, aber jetzt verstehe ich nicht, wie es geht.

@lfern Entschuldigung, ich verwirre Sie wahrscheinlich mehr als etwas zu klären) Aber wie auch immer, konzentrieren wir uns nicht auf Instanzvariablen, tatsächlich können wir auch mit Instanzvariablen davonkommen. Grundsätzlich gibt es kein Problem mit Ihrer Implementierung von processWebsocketIncomingMessage (msg) in der asynchronen Umgebung – dieser Code löst keinen Konflikt aus, jedoch kann der Zugriff auf eine Instanzvariable in einer Thread-Umgebung (mit PHP) ein Problem darstellen. Darüber hinaus übergibt PHP alle Argumente per Kopie, es sei denn, es handelt sich um Instanzen einer Klasse.

Wir haben also folgende Auswahl:

  • Entwerfen Sie entweder eine eigenständige OrderBook-Klasse, um die Verwendung der Instanzvariablen zu vermeiden, und machen Sie sie zu einer eindeutigen Instanz pro Thread:
// in main thread:
let exchangeInstanceInQuestion = new ccxt.cex ({ ... })

// in each worker thread:
let orderbook = new ccxt.OrderBook (exchangeInstanceInQuestion)

Das Auftragsbuch kapselt dann die Methode processIncomingOrderBookDelta sowie andere benötigte Methoden, und der Benutzer hat in jedem Thread eine separate Auftragsbuchinstanz ...

  • oder fügen Sie primitive Synchronisierungsbasismethoden hinzu, um den Code tatsächlich Thread-sicher zu machen:
processWebsocketIncomingMessage (msg) {
  // parse msg
  if (orderbook snapshot) {
    let orderBook = this.initializeOrderBook (msg.snapshot);
    return orderbook;
  } else if (orderbook delta) {

    // lock // ←-------------- added

    /* here I need to recover incremental orderbook and then*/

    // unlock // ←-------------- added

  } else if (orderbook subscription) {
    /* here I need to recover a promise set when I send a subscription message (in other cex.js method) to tell the user subscription succeded*/
   }
}

Sie haben also Recht, es gibt keine einfache Möglichkeit, die Instanzvariablen zu vermeiden und dies Thread-sicher zu machen, ohne die Thread-Sicherheit von Anfang an beim Code-Design zu berücksichtigen. Wir sind derzeit nicht Thread-sicher, daher ist zur Umgehung dieses gesamten Problems eine separate Austauschinstanz pro Thread erforderlich, um mögliches Racing zu vermeiden. Dies könnte eine gute Lösung für das Problem sein – im Grunde sollten wir jeden davon abhalten, die Instanzen überhaupt über Threads hinweg zu teilen.

Letztendlich muss es eines sein von:

  • ein Orderbuch pro Thread
  • oder ein Austausch pro Thread
  • oder muss synchronisierende Mutexe enthalten

Hoffe es macht Sinn.

PS: Für mich macht es eigentlich wenig Sinn, die WS-Verbindungsbehandlung zu threaden – dies sollte nicht gethreaded werden, stattdessen sollte ein Thread-Pool separate WS-Verbindungen verwalten.

UPD. Entschuldigung für die Tippfehler

@lfern In welchem ​​Zweig sollte ich nachsehen, wenn ich die neueste Websocket-Funktion testen möchte?
dieses https://github.com/lfern/ccxt/tree/feature/websockets
oder diese https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Ich denke, es ist weniger wichtig, das Konzept der Verwendung von Sockets für die Benutzer zu lösen, als vielmehr die Aufruferstellung und Paketanalyse zu isolieren, damit sie von einer potenziellen vorgefertigten Socket-Aufrufmethode oder von ihren eigenen Zyklen verwendet werden können als ein Beispiel für jede Sprache verteilt werden könnte

Ich bin sehr gespannt darauf, die Socket-Funktion mit der neuesten ccxt-Version im Browser mithilfe von Javascript verwenden zu können.

@imhazige der aktuelle Zweig ist https://github.com/lfern/ccxt/tree/feature/websockets-multiple Ein Beispiel finden Sie in async_orderbook.js (das gleiche für , php und .py). Dieses Beispiel erwartet Parameter:

Knotenbeispiele/js/async_orderbook.js[markt2 ...]

Das Orderbuch ist in cex, gateio, binance, bitmex, lbank und zb implementiert. Orderbuch-Delta-Aktualisierungen müssen überarbeitet werden, aber wenn Sie den Verbose-Modus einstellen, können Sie eingehende Nachrichten sehen und ein Orderbuch-Ereignis wird ausgegeben.

@lfern

Danke.

Ich habe gerade die example/js/async_orderbook.js getestet und festgestellt, dass der Proxy nicht funktioniert hat.

Die ausführliche Option ist offen, ich kann sehen, dass die Anfrage über den Proxy erfolgt. aber es hat nicht funktioniert, jedes Mal einen Request-Timeout-Fehler auslösen.

Ich habe dann andere Beispiele ohne Websocket getestet, wie live-ticker.js, hat immer noch nicht funktioniert. Während beim neuesten ccxt-Repository-Mater-Zweig das Beispiel funktioniert.

Ich denke, das liegt daran, dass die Codebasis weit hinter dem Hauptzweig des ccxt-Repositorys liegt.

Ist es möglich, den neuesten Code von ccxt einzufügen?

Und ich habe eine Frage: Wird der Websocket Proxy unterstützen?

@imhazige
mit ccxt master zusammengeführt. Ich habe es nicht über einen Proxy getestet. Ich mache nur ein paar Tests und ich denke, wir brauchen eine weitere Konfigurationsvariable für den Websocket-Proxy, weil:

der URL vorangestellt, wie https://proxy.com/https ://exchange.com/api...

funktioniert nicht.

@lfern

Danke, ich sehe, dass der Code den ccxt-Master v1.14.240 zusammengeführt hat. Jetzt funktioniert der http-Proxy.

aber wenn ich den Websocket-Proxy versuche, hat es nicht funktioniert.

Ich habe mit der Proxy-URL im Beispielcode http://185.93.3.123 :8080/ getestet, es hat nicht funktioniert

Hat es in Ihrem Fall funktioniert?

Ich habe mit der Proxy-URL im Beispielcode http://185.93.3.123 :8080/ getestet, es hat nicht funktioniert

Tut mir leid, wenn das nicht das ist, wonach Sie gefragt haben.

@kroitor

Vielen Dank für die Beispiele.

Für http reicht es aus, CORS-Proxys zu verwenden.

aber bei der Verwendung von Websocket dachte ich, benutze diesen Weg https://github.com/imhazige/node-http-connect-proxy , nachdem ich es versucht hatte, funktionierte es in einigen Ländern nicht. :(, ich habe jetzt keine Ahnung.

htto-proxy-agents scheint gut mit node websocket zu funktionieren.

beispiel.js

    const proxy = process.env.http_proxy || 'http://185.93.3.123:8080' // HTTP/HTTPS proxy to connect to
    const agent = new HttpsProxyAgent (proxy)
    exchange = new ccxt[id] ({
        apiKey: apiKey,
        secret: secret,
        enableRateLimit: true,
        verbose: true,
        agent: agent,
    });

Aber Autobanh/asyncio(python) funktioniert nicht, wenn Sie versuchen, einen Proxy zu verwenden:

2018-06-22T11:32:03 connection to tcp:104.20.34.190:443 established
2018-06-22T11:32:03 CONNECT ws.cex.io:443 HTTP/1.1
Host: ws.cex.io:443


2018-06-22T11:32:03 received HTTP response:

b'HTTP/1.1 400 Bad Request\r\nServer: cloudflare\r\nDate: Fri, 22 Jun 2018 10:32:01 GMT\r\nContent-Type: text/html\r\nContent-Length: 171\r\nConnection: close\r\nCF-RAY: -\r\n\r\n'


2018-06-22T11:32:03 received HTTP status line for proxy connect request : HTTP/1.1 400 Bad Request
2018-06-22T11:32:03 received HTTP headers for proxy connect request : {'server': 'cloudflare', 'date': 'Fri, 22 Jun 2018 10:32:01 GMT', 'content-type': 'text/html', 'content-length': '171', 'connection': 'close', 'cf-ray': '-'}
2018-06-22T11:32:03 failing proxy connect ('HTTP proxy connect failed (400 - BadRequest)')
2018-06-22T11:32:03 dropping connection to peer tcp:104.20.34.190:443 with abort=True: None
2018-06-22T11:32:03 _connectionLost: None
Traceback (most recent call last):
  File "src/py/async-orderbook.py", line 84, in <module>
    loop.run_until_complete(main())
  File "C:\Users\Luis\AppData\Local\Programs\Python\Python36\lib\asyncio\base_events.py", line 468, in run_until_complete
    return future.result()
  File "src/py/async-orderbook.py", line 64, in main
    await exchange.async_subscribe('ob', symbol)
  File "c:\users\luis\documents\projects\ccxt\python\ccxt\async\base\exchange.py", line 669, in async_subscribe
    await self._async_ensure_conx_active(event, symbol, True)
  File "c:\users\luis\documents\projects\ccxt\python\ccxt\async\base\exchange.py", line 480, in _async_ensure_conx_active
    await self.async_connect()
  File "c:\users\luis\documents\projects\ccxt\python\ccxt\async\base\exchange.py", line 490, in async_connect
    await async_connection.connect()
  File "c:\users\luis\documents\projects\ccxt\python\ccxt\async\async\websocket_connection.py", line 90, in connect
    await future
Exception: connection was closed uncleanly (None)

@lfern

Ich habe die Beispiele mit der Agentenoption getestet

const proxy = process.env.http_proxy || 'http://185.93.3.123:8080'; // HTTP/HTTPS proxy to connect to
  const agent = new HttpsProxyAgent(proxy);
  exchange = new ccxt[id]({
    apiKey: apiKey,
    secret: secret,
    enableRateLimit: true,
    verbose: true,
    agent: agent
  });
  exchange.on('err', (err, conxid) => {
    try {
      console.log(err);
      exchange.asyncClose(conxid);
    } catch (ex) {
      console.log(ex);
    }
  });

einen Fehler bekommen

fetch:
 binance GET https://api.binance.com/api/v1/exchangeInfo
Request:
 {}
 undefined

Error: [RequestTimeout] binance GET https://api.binance.com/api/v1/exchangeInfo request timed out (10000 ms)

           at e  js/base/Exchange.js:388  throw new RequestTimeout (this.id + ' ' + method + ' ' + url + ' request timed …

läuft der Proxy-Server http://185.93.3.123 :8080? Was ist das für ein Proxy-Server?

Tut mir leid, ich habe keinen Proxy-Server in meinem Netzwerk und wollte keine Zeit damit verschwenden, ihn zu Testzwecken zu installieren, also versuche ich es mit einem kostenlosen Proxy von free-proxy-list.net . Ich denke, diese Proxys sind nicht immer verfügbar.

@lfern

ok, danke, ich meinte, dass der Proxy in "irgendeinem Land" nicht funktioniert.

Wie kann ich diese Funktion über npm verwenden? oder muss ich den kompilierten Code direkt importieren?

In einer Entwicklungsumgebung klone ich von lfern/ccxt in einen lokalen Ordner
(./ccxt) und erstellen Sie ein neues Projekt (./test). Dann exec 'npm init', 'npm
installiere ccxt -save' und 'npm link ../ccxt'. Oder wenn Sie es vorziehen, können Sie
direkt importieren.

@lfern

Gut zu wissen, danke.

@lfern

Ich möchte die Okex-Websocket-Funktion hinzufügen. Gibt es einen Entwicklungsleitfaden für die Implementierung?

@imhazige Tut mir leid, es ist noch kein Dokument fertig. Ich habe einige Tipps eingefügt
https://github.com/lfern/ccxt/blob/feature/websockets-multiple/WEBSOCKETS.md
aber Sie können sich cex.js ansehen, weil ich denke, dass das Orderbook-Abonnement okex ähnlich ist. Wie auch immer, schick mir
jede Frage dazu und ich würde Ihnen helfen, es zu aktivieren.

@imhazige vielleicht kannst du dieses Skelett als Ausgangspunkt verwenden:

...
,
            'asyncconf': {
                'conx-tpls': {
                    'default': {
                        'type': 'ws',
                        'baseurl': 'wss://real.okex.com:10441/websocket',
                    },
                },
                'methodmap': {
                },
                'events': {
                    'ob': {
                        'conx-tpl': 'default',
                        'generators': {
                            'url': '{baseurl}',
                            'id': '{id}',
                        },
                    },
                },
            }
...
  _asyncOnMsg (data, conxid = 'default') {
    let msg = this.asyncParseJson (data);
    console.log(msg);
  }
  _asyncSubscribe (event, symbol, nonce) {
        if (event !== 'ob') {
            throw new NotSupported ('subscribe ' + event + '(' + symbol + ') not supported for exchange ' + this.id);
        }
        this.asyncSendJson ({
          event: 'addChannel',
          channel: 'ok_sub_spot_' + pairId + '_depth',
        });
    }

Vielen Dank, werde ich mir heute anschauen.

Am 28.06.2018 um 00:43 Uhr schrieb lfern:
>

@imhazige https://github.com/imhazige vielleicht kannst du das verwenden
Skelett als Ausgangspunkt:

...
,
'asyncconf': {
'conx-tpls': {
'Ursprünglich': {
'Typ': 'ws',
'baseurl': ' wss://real.okex.com :10441/websocket',
},
},
'Methodenkarte': {
},
'Veranstaltungen': {
'ob': {
'conx-tpl': 'Standard',
'Generatoren': {
'url': '{baseurl}',
'Ich tat}',
},
},
},
}
...
_asyncOnMsg (data,conxid = 'default') {
let msg= this.asyncParseJson (Daten);
Konsole.log (msg);
}
_asyncSubscribe (Ereignis,Symbol,Nonce) {
if (event !== 'ob') {
throw new NotSupported ('subscribe ' + event + '(' + symbol+ ') not supported for exchange ' + this.id);
}
this.asyncSendJson ({
Ereignis: 'addChannel',
Kanal: 'ok_sub_spot_' + pairId+ '_depth',
});
}


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ccxt/ccxt/issues/56#issuecomment-400748176 oder
Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AD7pFvG0YcY0lhX9tlQ_YdNpyrb0mkeaks5uA7YlgaJpZM4OjakB .

@lfern
Für diese Methode asyncSubscribe (event, symbol) könnten wir einen dritten Parameter params hinzufügen, damit wir Kundenparameter wie depth hinzufügen können, und für ein zukünftiges Orderbuch benötigen wir einen Parameter von contract_type

@imhazige Natürlich! Ich denke, es ist besser, ein volles Orderbuch zu haben, um ein lokales Orderbuch korrekt zu verwalten, aber dieser Tiefenparameter könnte nützlich sein, um ein Orderbuch mit fester Länge zu benachrichtigen. Nehmen Sie alle erforderlichen Änderungen vor, da der aktuelle Code nur ein Vorschlag ist und einige wenige Websocket-Austauschvorgänge getestet wurden.

Haben wir eine Liste aller Börsen, die eine Websocket-Verbindung (jeglicher Art) anbieten? Ich habe insgesamt ~25-30 solcher Austausche gesammelt und könnte die Liste ergänzen, die Sie möglicherweise an Ihrer Seite führen

@kroitor was denkst du über das Hinzufügen dieser Spalten zur ccxt-Austauschliste (ws ver, wsDoc)?
https://github.com/lfern/ccxt/tree/feature/websockets-multiple

@lfern sicher, das mache ich gleich. Wenn es Ihnen jedoch nichts ausmacht, würde ich diese Spalte in das Wiki unter der Streaming -Sektion stellen (existiert dort noch nicht). Ich würde das jetzt noch nicht auf die Hauptliste in der README.md setzen, denn wenn ich das tue, werden Noob-Leute nichts lesen und denken, dass diese Spalten Websocket-Unterstützung in CCXT anzeigen, und uns nur mit Fragen zu ws und überschwemmen all das, was wir im Moment nicht brauchen ) Also, wenn es Ihnen nichts ausmacht, würde ich vorerst einen neuen Abschnitt zum Thema Streaming in unserem Wiki eröffnen. Werde das in Kürze tun. Das wäre zum Bearbeiten und zum Einreichen von URLs und anderen Dingen an unsere Wissensdatenbank verfügbar.

Ich habe gerade festgestellt, dass der Websocket-Proxy im Browser für Okex nicht funktioniert, er muss auch Cross-Origin-Header zulassen.

Hallo @lfern

Ich habe versucht, die binance ws zu verwenden.

Es hört sich so an, als ob die Funktion _asyncHandleObRestSnapshot, die die Binance-Logik über die lastUpdateId u und U verwaltet, nur einmal beim Snapshot-Abruf aufgerufen wird.

Außerdem glaube ich, dass es ein Problem mit der Methode mergeOrderBookDelta und searchIndexToInsertOrUpdate gibt. Letzteres sieht so aus, als müssten die OB sortiert werden, um das richtige Element zu finden, und es dann letztendlich in mergeOrderBookDelta löschen, was zumindest mit binance websocket nie passiert :(

Ich arbeite an Refactoring-Funktionen in Basisklassen (entferne das Präfix „async“ in Methoden) und füge einige Klassenmethoden hinzu, um auf Kontextdaten zuzugreifen. Ich hoffe, diese Woche fertig zu sein.

@lfern , ich freue mich zu hören, dass das Refactoring nützlich sein wird. Könnten Sie sich in der Zwischenzeit bitte den Marktdatenfluss für Binance ansehen, der nicht die richtigen Daten zurückgibt? Ich versuche, es auf meiner Seite zu beheben, aber Sie finden die Lösung möglicherweise schneller. Sie können auf der Binance-Website nachsehen, dass es eine ganze Reihe von Diskrepanzen gibt.

_async-String aus Methoden entfernt und Kontextmethoden hinzugefügt, um auf Websocket-Kontextdaten zuzugreifen. Vielleicht war es besser, dies in einer separaten Klasse zu tun, aber ich denke, es erfordert eine Änderung des Transpile-Skripts. Diese Kontextmethoden sind nicht Thread-sicher, aber ich denke, auf diese Weise könnte sie bei Bedarf implementiert werden. Wie auch immer, jede Websocket-Verbindung hat ihre eigenen Kontextdaten, und ich denke, jede Websocket-Verbindung muss von einem einzigen Thread verwaltet werden. Dies sind die neuen Kontextmethoden zum Abrufen/Speichern von Daten:

    _contextGetEvents(conxid) // get events dictionary ('ob', 'tickers', ...)
    _contextGetSymbols(conxid, event) // get symbols from event 
    _contextResetEvent(conxid, event) // reset event dictionary
    _contextResetSymbol(conxid, event, symbol) // reset symbol dictionary ({'subscribed': false, 'subscribing': false, 'data':{}})
    _contextSetSubscribed (conxid, event, symbol, subscribed) // return subscribed status for event/symbol
    _contextIsSubscribed (conxid, event, symbol) // set subscribed status for event/symbol
    _contextSetSubscribing (conxid, event, symbol, subscribing) // return subscribing status for event/symbol
    _contextIsSubscribing (conxid, event, symbol) // set subscribing status for event/symbol
    _contextGetSymbolData(conxid, event, symbol) // get symbol user defined dictionary
    _contextSetSymbolData(conxid, event, symbol, data) // set symbol user defined dictionary
    _contextSet (conxid, key, data) // set data to user defined dictionary (to store any user defined data)
    _contextGet (conxid, key) // get from user defined dictionary

Nächster Schritt: einige Tests zu Merge-Orderbook-Methoden durchführen. Sicher stimmt da was nicht!!!

@anymos Ich habe gerade einen Test für updateBidAsk hinzugefügt und jetzt denke ich, dass es gut funktioniert.

@imhazige Ich habe Änderungen an Ihrem Okex-Code vorgenommen, um ihn transpilierbar zu machen und Kontextmethoden zu verwenden.

@lfern

Toll!

Ist https://github.com/lfern/ccxt/tree/feature/websockets-multiple der offizielle Branch für die WebSocket-Entwicklung? Ich bin daran interessiert, einen Beitrag zu leisten.

@wardbradt , es ist ein bedeutender Zweig dafür, ja. Nichts ist wirklich "offiziell", denke ich. Aber Hilfe wird sehr geschätzt, dies ist höchstwahrscheinlich die zusammengeführte Gabel, denke ich

Welche Hilfe wird in diesem Zweig benötigt? Gibt es irgendwo ein Dokument mit verbleibenden Schritten und wer arbeitet woran? Ich würde mir gerne Zeit nehmen, um bei den Python-Implementierungen zu helfen, wenn ich kann.

Ich denke, es wäre nett, wenn Sie versuchen könnten, Websocket-Unterstützung für jeden Austausch hinzuzufügen, und hier Feedback zu Problemen schreiben, die Sie finden, oder wenn dieser Ansatz nicht wirklich eine gute Möglichkeit ist, Websockets in ccxt hinzuzufügen. Mit diesem Feedback akzeptieren/lehnen Eigentümer des ccxt-Projekts die Zusammenführung dieses Zweigs ab.

Es gibt ein erstes Dokument mit einigen Tipps, wie Sie Websocket-Unterstützung hinzufügen können:
https://github.com/lfern/ccxt/blob/feature/websockets-multiple/WEBSOCKETS.md

Aber wenn Sie Fragen dazu haben, schreiben Sie bitte einen Kommentar in diese Ausgabe und ich werde sie beantworten.

Hey, ich habe im Moment keine Zeit zum Integrieren, aber ich habe dieses Beispiel für eine Basisklasse und eine erweiterte Klasse zum Konvertieren einer bestimmten Exchange-Kline-Paketnutzlast in ein generisches Cross-Exchange-Format, das vom System verwendet werden kann. Für PHP ist es ein großer Vorteil, eine strukturierte Klasse zu haben, die diese Dinge enthält, anstatt eine Methode zu konvertieren. Ich gehe davon aus, dass der Knotencode derselbe ist, ich beschäftige mich nur nicht so viel damit

class SocketCandleKLineBinance extends SocketCandleKLine {
    public function __construct( $payload )   {
        $this->interval             = $payload->k->i;
        $this->start_time           = $payload->k->t;
        $this->trades_count         = $payload->k->n;
        $this->price_open           = $payload->k->o;
        $this->price_high           = $payload->k->h;
        $this->price_low            = $payload->k->l;
        $this->price_close          = $payload->k->c;
        $this->volume               = $payload->k->v;
        $this->taker_base_volume    = $payload->k->V;
        $this->taker_quote_volume   = $payload->k->Q;
    }
}

und..

class SocketCandleKLine {
    public $interval;
    public $start_time;
    public $trades_count;
    public $price_open;
    public $price_high;
    public $price_low;
    public $price_close;
    public $volume;
    public $taker_base_volume;
    public $taker_quote_volume;
    public $lowest_ask;
    public $highest_bid;
}

Ich würde es auch vorziehen, Klassen zum Speichern der Daten zu verwenden, aber bei der Transpilation von .js-Code erhalte ich Fehler beim Zugriff auf Attribute einer beliebigen Klasse

let x = $payload.k;

Ich bekomme diesen transpilierten Code in PHP

$x = $payload.k;

Sicher, es könnte getan werden, das Transpile-Skript zu ändern, aber es ist nicht einfach für mich.

Vielleicht könnten wir einige Wrapper-Dienstprogramme aus transpilierbarem .js-Code definieren, damit Sie auf jedes zurückgegebene Wörterbuch von ccxt-Funktionen bis zu Klassen wie dieser zugreifen können.

oh, das ist seltsam ... ja, ich weiß nicht, wie der Transpiler funktioniert ... vielleicht @kroitor ?

@lfern Das Problem beim generischen Transpilieren von interpretierten Klassen (ohne strikte Typisierung und mit Closures) besteht darin, dass es sehr schwer zu erraten ist, welche Variable welcher Typ ist, ohne einen vollständigen AST-Durchlauf zur Laufzeit und ohne Selbstbeobachtung / ohne in die zu gehen v8/python/php "Bytecode" sozusagen ... Ich werde etwas als schnelle Lösung dafür finden.

Ich bekomme diesen transpilierten Code in PHP

Eigentlich ist dieses spezielle Problem PHP-spezifisch und es sollte leicht lösbar sein, lassen Sie mich ein wenig an transpile.js arbeiten, wir werden uns in Kürze dazu bei Ihnen melden. Sie müssen nur ein paar Ausnahmen für den Punktoperator hinzufügen.

Danke @kroitor , ich sehe, dass Sie keine Klassen in .js transpilierbaren Austauschcode erstellen, also nahm ich an, dass es schwierig sein könnte, es zu implementieren. Ich habe versucht, es in dieser Branche zu vermeiden. Wie auch immer, ich denke, es ist jetzt wichtiger, dass andere Mitwirkende versuchen, andere Websocket-Orderbuchbörsen zu implementieren und Feedback von ihnen zu erhalten. Wenn ihnen gefällt, wie wir Websockets implementieren, könnten wir von @pursehouse vorgeschlagene Klassen hinzufügen

Ich sehe, dass Sie keine Klassen in .js transpilierbaren Austauschcode erstellen, also nahm ich an, dass es schwierig sein könnte, es zu implementieren

Ja, du hast absolut Recht, ich dachte anfangs dasselbe ... Ich habe es gerade überprüft und versucht, einen Quickfix hinzuzufügen, aber ... es hat nicht gut funktioniert ) Ich suche jetzt nach einer schnellen Problemumgehung den Punkt richtig transpilieren, ohne ihn zu maskieren und ohne den Code zu optimieren, wobei alle String-Literale intakt bleiben, rein mit Hilfe des Transpilers ... Ich denke, ich werde etwas mehr Zeit brauchen, aber ich werde es herausfinden und werde es euch schnellstmöglich mitteilen.

Fügen Sie für einige Börsen einen Websocket-API-Doc-Link in der Tabellenliste hinzu:
https://github.com/lfern/ccxt/blob/feature/websockets-multiple/README.md

Lfern bist du auf Telegram oder Discord? Ich habe ein paar Fragen.

EDIT: Eine ccxt-dev Slack-Gruppe wäre schön. Gibt es das?

Am Do, 12. Juli 2018 um 9:01 Uhr schrieb lfern [email protected] :

Fügen Sie für einige Börsen einen Websocket-API-Doc-Link in der Tabellenliste hinzu:
https://github.com/lfern/ccxt/blob/feature/websockets-multiple/README.md


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ccxt/ccxt/issues/56#issuecomment-404563014 , oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AFQFAllW7QM1RwVI_U-3BTGoV3LqumQOks5uF3LRgaJpZM4OjakB
.

Entschuldigung @skeller88 . Ich habe derzeit kein Telegramm-/Discord-Konto. Wenn Sie nichts dagegen haben, schreiben Sie sie hier und ich versuche, schnell zu antworten.

@GoChartingAdmin , hätten Sie etwas dagegen, Ihre Websocket-Austauschliste zu veröffentlichen, um sie dieser Liste hinzuzufügen?

@lfern Ich werde versuchen, Binance-Unterstützung auf binance-websocket-support hinzuzufügen, a
Zweig, den ich von lfern/feature/websockets-multiple abgezweigt habe
https://github.com/skeller88/ccxt/tree/feature/binance-websocket-support .
Dann werde ich eine PR gegen Websockets-Multiple einreichen. Funktioniert es?

Ich versuche, "examples/py/websocket-orderbook.py" mit "binance" und auszuführen
den folgenden Fehler sehen. Das self.wsconf Dict ist zur Laufzeit leer. Es gibt
schon etwas code in binance.js so war die websocket-orderbook.py schon mal
Arbeiten für Sie mit Binance? Ich nehme an, das war es nicht.

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py",
line 1664, in <module>
    main()
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py",
line 1658, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py",
line 1068, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Applications/PyCharm
CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in
execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File
"/Users/shanekeller/Documents/lfern_ccxt/examples/py/websocket-orderbook.py",
line 81, in <module>
    loop.run_until_complete(main())
  File "/Users/shanekeller/anaconda/lib/python3.6/asyncio/base_events.py",
line 467, in run_until_complete
    return future.result()
  File
"/Users/shanekeller/Documents/lfern_ccxt/examples/py/websocket-orderbook.py",
line 61, in main
    await exchange.websocket_subscribe('ob', symbol, {'limit': limit})
  File
"/Users/shanekeller/Documents/lfern_ccxt/python/ccxt/async/base/exchange.py",
line 712, in websocket_subscribe
    raise ExchangeError('Not valid event ' + event + ' for exchange ' +
self.id)
ccxt.base.errors.ExchangeError: Not valid event ob for exchange binance
binance requires to release all resources with an explicit call to the
.close() coroutine.
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x10c483dd8>

Am Freitag, 13. Juli 2018 um 9:08 Uhr schrieb lfern [email protected] :

@GoChartingAdmin https://github.com/GoChartingAdmin , hätten Sie etwas dagegen
Veröffentlichen Sie Ihre Websocket-Austauschliste, um sie dieser Liste hinzuzufügen?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ccxt/ccxt/issues/56#issuecomment-404878798 , oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AFQFApUvfY_oNwHXIIOjxPXdP1Bel4lYks5uGMYBgaJpZM4OjakB
.

Entschuldigung @skeller88 . Ich übertrage keine Änderungen an transpilierten .py- und .php-Dateien. Vielleicht müsste ich diese Dateien auch übergeben. Sie müssen npm install und dann npm run-script transpile ausführen, um die transpilierte Datei binance.py zu erhalten. Dann würde websocket-orderbook.py funktionieren

Nach dem Ausführen von transpile funktioniert websocket-orderbook.py. Ich sehe Binance
hat bereits Unterstützung für Websocket-Auftragsbücher, also werde ich versuchen, Websocket hinzuzufügen
Orderbuch-Unterstützung für Bittrex. Ihr Websocket ist in der Beta-Phase, also wenn ich es nicht bekomme
Das funktioniert, ich werde es für gdax hinzufügen. Klingt gut?

Wurden Tests geschrieben? Ich finde noch keine.

Warten Sie mit dem Hinzufügen des Python- und PHP-Codes, bis lfern/ccxt genehmigt ist
zum Zusammenführen mit ccxt/ccxt?

Am Freitag, 13. Juli 2018 um 14:23 Uhr schrieb lfern [email protected] :

Entschuldigung @skeller88 https://github.com/skeller88 . Ich verpflichte mich nicht
Änderungen von transpilierten .py- und .php-Dateien. Vielleicht müsste ich mich binden
diese Dateien auch. Sie müssen npm install und dann npm run-script ausführen
transpile, um die transpilierte Datei binance.py zu erhalten. Dann websocket-orderbook.py
würde funktionieren


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ccxt/ccxt/issues/56#issuecomment-404957677 oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AFQFAhc61obJP9u6Y9Yu5iqWP6-s-0Htks5uGQ_XgaJpZM4OjakB
.

Ich denke, Gdax Websocket Doc ist besser als Bittrex, aber wir testen noch, daher könnte jeder Austausch interessant sein, um zu prüfen, ob er einfach zu implementieren ist. Die einzige Einschränkung besteht darin, keinen Austausch zu implementieren, der das Pusher-Protokoll (wie bitstamp) oder pubnut.com verwendet. In diesem Zweig werden nur "rohe" Websocket-Verbindungen unterstützt.

Wurden Tests geschrieben? Ich finde noch keine.

Entschuldigung, ich denke, es ist nicht einfach, Tests zu schreiben, die eine Websocket-Verbindung simulieren. Ich denke nicht darüber nach, aber ich nehme an, wir können eine Websocket-Unterklasse erstellen, die eine Websocket-Verbindung emuliert, aber diese Klasse würde für jeden Austausch erstellt werden ... Vielleicht könnte uns jemand in diesem Thread einige Ideen dazu geben.

Warten Sie mit dem Hinzufügen des Python- und PHP-Codes, bis lfern/ccxt genehmigt ist
zum Zusammenführen mit ccxt/ccxt?

Ja, ich dachte, dass dies festgeschrieben werden könnte, wenn dieser Zweig zusammengeführt würde. Aber wenn Sie denken, dass das Commit des transpilierten Codes jedem das Leben leichter macht, der ihn in PHP oder Python testen möchte, werde ich diesen Code auch committen! Vielleicht könnte @kroitor uns sagen, ob dies eine gute Idee wäre, oder ob es besser ist, transpilierten Code vorerst nicht zu übertragen.

Ich habe versucht, den gdax-Websocket anzuschließen. Siehe diesen Zweig
https://github.com/lfern/ccxt/compare/feature/websockets-multiple...skeller88:feature/websockets-multiple-gdax?expand=1 .
Ich fand das Parsing und die Konfiguration von wsconfg etwas verwirrend. Es
Es scheint, als ob der einzige Grund für diese Analyse darin besteht, Websocket-URLs zu erstellen
die verbunden sind, wie im Fall von Binance. Aber für gdax nur eine
url verbunden ist und mehrere Kanäle über abonniert sind
Abonnementanfragen über diese Websocket-Verbindung. Für gdax nicht
scheinen die URL-Definition auf Ereignisebene und die variable Interpolation zu sein
notwendig oder? Diese Konfiguration könnte also optional sein.

Ich erhalte einen Timeout-Fehler, wenn ich versuche, eine Verbindung zum gdax-Websocket herzustellen.
Ich habe ein paar Tage keine Zeit, um daran zu arbeiten, aber ich werde versuchen, zu helfen
so viel ich kann.

Am Freitag, den 13. Juli 2018 um 16:15 Uhr schrieb lfern [email protected] :

Ich denke, Gdax Websocket Doc ist besser als Bittrex, aber wir sind es immer noch
Testen, daher könnte jeder Austausch interessant sein, um zu prüfen, ob es einfach ist
implementieren. Die einzige Einschränkung besteht darin, keinen Austausch zu implementieren, der verwendet wird
Pusher-Protokoll (wie Bitstamp) oder pubnut.com, Nur "roher" Websocket
Verbindungen werden in diesem Zweig unterstützt.

Wurden Tests geschrieben? Ich finde noch keine.

Entschuldigung, ich denke, es ist nicht einfach, Tests zu schreiben, die einen Websocket simulieren
Verbindung. Ich denke nicht darüber nach, aber ich nehme an, wir können einen Websocket erstellen
Unterklasse, die eine Websocket-Verbindung emuliert, aber diese Klasse wäre
für jeden Austausch erstellt... Vielleicht könnte uns jemand in diesem Thread weiterhelfen
einige Ideen dazu,.

Warten Sie mit dem Hinzufügen des Python- und PHP-Codes, bis lfern/ccxt genehmigt ist
zum Zusammenführen mit ccxt/ccxt?

Ja, ich dachte, dass dies begangen werden könnte, wenn dieser Zweig wäre
zusammengeführt. Aber wenn Sie denken, dass das Festschreiben des transpilierten Codes Leben macht
einfacher Jeder, der es in PHP oder Python testen möchte, werde ich diesen Code übertragen
zu! Vielleicht könnte uns @kroitor https://github.com/kroitor sagen, ob dies der Fall ist
wäre eine gute Idee, oder es ist besser, transpilierten Code vorerst nicht zu übertragen.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ccxt/ccxt/issues/56#issuecomment-404976377 oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AFQFAiQDi3R9BmZDxnTbVYsgAeXjJFRuks5uGSoGgaJpZM4OjakB
.

Ja, also sollte es ein generisches Konzept zum Erstellen der öffnenden URL geben, das die Fähigkeit benötigt, Objekte zum Erstellen der URL zu akzeptieren. sowie benötigt die Socket-Aufrufe zum Hinzufügen von Abonnements als generisches Konzept, das Objekte akzeptiert.
dann benötigen all diese Objekttypen separat ihre eigene zentrale Struktur, die jeder Austausch erweitern kann, um das Format zum und vom ccxt -Format zu formatieren

Ja, du hast Recht @skeller88 . Die variable Interpolation ist derzeit nicht wirklich nützlich, da aktuelle Websocket-implementierte Börsen außer Binance nur einen Websocket für alle Ereignisse haben. Ich denke, wir brauchen etwas, das Exchange.js verwenden kann, um zu wissen, was zu tun ist, wenn es einen Abonnement-/Abmeldebefehl für ein Ereignis/Symbol erhält. Exchange.js verwaltet Websocket-Verbindungen, daher brauchen wir in jedem Austausch etwas, das uns mitteilt, was bei jedem Abonnementbefehl zu tun ist:

  • wenn mehrere Kanäle in nur einem Websocket: bei Abonnement und wenn Websocket nicht geöffnet ist, dann Websocket öffnen, Kontext zurücksetzen. Wenn noch geöffnet, tun Sie nichts, schließen Sie den Websocket bei der Abmeldung (oder nicht), wenn keine Abonnements mehr aktiv sind, und setzen Sie den Websocket-Kontext zurück.
  • Wenn mehrere Kanäle auf einem Websocket, aber unterschiedliche URL-Verbindungen für jeden Kanal (Binance): Bei der Anmeldung/Abmeldung müssen Sie sich mit einer anderen URL (die mit früheren Anmeldungen/Abmeldungen generiert wurde) erneut mit dem Websocket verbinden und den Websocket-Kontext zurücksetzen. Schließen Sie beim Abbestellen, wenn der letzte Stream aktiv ist, den Websocket.
  • Wenn Pusher: Jedes Ereignis/Symbol hat seine eigenen Websocket-Verbindungsinformationen, also brauchen wir etwas, das Ereignis/Symbol der Pusher-Konfiguration zuordnet.
  • wenn jedes Ereignis oder Ereignis/Symbol einem anderen Websocket entspricht: bei Abonnement Websocket für Ereignis/Symbol öffnen, Kontext zurücksetzen; Bei Abmeldung Websocket für Ereignis/Symbol schließen.

Ich finde immer noch keinen Austausch für diesen letzten Fall, aber variable Interpolarion wäre nützlich, um Quell-Websocket für diese Ereignis-/Symbolinformationen zu erhalten.

Vielleicht wäre es besser, dies aus der Konfiguration zu entfernen und Methoden zu erstellen, die von Exchange.js aufgerufen werden und diese Informationen zur Verwaltung des Websocket-Verbindungspools bereitstellen.

@lfern , deshalb würde ich vorschlagen, sich auf die einzelnen Funktionen zu konzentrieren, die für die Verarbeitung von Daten erforderlich sind, die mit dem Socket gesendet oder empfangen werden. anstatt zu lösen, wie Sockets im Allgemeinen verwendet werden.
Auf diese Weise können die Anforderungen in Phasen aufgeteilt werden, und auf die potenzielle Veröffentlichung der Kernfunktionalitätsmerkmale mit Beispielen für deren Verwendung kann eine Zukunft ( und ein viel komplizierteres Problem ) einer generischen Methode zum Aufrufen der Sockets folgen. Was viel mehr Community-Unterstützung erhalten wird, weil die Bausteine ​​​​existieren werden.
Denn welchen Socket-Stil Sie auch immer für JS erstellen, jetzt gibt es auch einen neuen Socket-Stil, der für PHP und Python benötigt wird. Das Erzwingen einer vollständigen Socket-Lösung in der Veröffentlichung bedeutet also, dass diese ebenfalls gelöst werden müssen. und für PHP wäre das gelinde gesagt komplex ... weil es nicht ereignisgesteuert ist wie JS, also muss ich, damit ich die Antworten an meine Datenbank oder was auch immer senden kann, nachdem CCXT es verarbeitet hat, in etwa so sein ...

// $streamsUrl would be populated by the CCXT Binance socket url generator based on objects passed to it
\Amp\Loop::run( function () use ( $streamsUrl, $exchange ) {
    /** <strong i="9">@var</strong> \Amp\Websocket\Connection $connection */
    $connection = yield Websocket\connect( $streamsUrl );
    while( $message = yield $connection->receive() ) {
        $payload = yield $message->buffer();
// this decode line would be replaced with the CCXT decoder for Binance
        $decode = json_decode( $payload );
// this switch would use the CCXT generic format for a socket packet
        switch( $decode->data->e ) {
            case "kline":
// methods do save my data
            break;
        }
        yield new Delayed( 1000 );
    }
} );

Wenn Sie also die Bausteine ​​lösen, können die Leute ihre Systeme implementieren, um sie zu verwenden. und vielleicht wird sich im Laufe der Zeit eine generische Socket-Lösung entwickeln, die Pakete an das Entwicklersystem weiterleiten kann.

@pursehouse Für mich läuft das Obige nur auf eine ordnungsgemäße und flexible Methodenzerlegung hinaus. Ich stimme jedoch zu, dass asynchrone Dinge mit PHP schwierig sein können und möglicherweise sogar eine Threading-Lösung oder einen Nur-PHP7-Wrapper erfordern ... Aber wie auch immer, es auf sprachspezifische oder austauschspezifische Weise zu tun, wäre gleichmäßig schwieriger zu warten oder zu transpilieren. Ich denke, unser ultimatives Ziel ist es, zu Vereinigungszwecken so viel wie möglich in die Basisklasse zu verschieben.

@kroitor richtig, also versuche jetzt nicht, die Socket-Fähigkeiten zu lösen, sondern konzentriere dich nur auf Bausteine:

  • URL-Generierung
  • Paketerstellung
  • Paketverarbeitung

Denn im Moment scheint es, als würde viel Zeit darauf verwendet werden, wie man Sockets im Allgemeinen macht, was nicht in allen Sprachen gelöst werden kann. Und scheint der schwierigste Aspekt zu sein, wenn es darum geht, daraus eine generische Lösung zu machen, und selbst wenn die generischen Sockets für JS gelöst sind, sind all diese Bausteine ​​immer noch erforderlich, um über alle Börsen hinweg funktionieren zu können. Warum also nicht zuerst Bausteine ​​erstellen und vielleicht einen Beispielcode für ihre Verwendung hinzufügen? Anschließend kann an einer generischen Socket-Lösung gearbeitet werden, die höchstwahrscheinlich eine größere Anzahl von Mitwirkenden hat.

@lfern Wird bis morgen EOD erledigt

@lfern ging die Liste durch - Sie haben Bistamp hinzugefügt. Bitstamp verwendet derzeit Pusher. Ich dachte, Pusher wäre zu diesem Zeitpunkt außerhalb des Geltungsbereichs

@GoChartingAdmin , ja, du hast Recht. Ich denke, wir könnten alle Börsen mit Websocket hinzufügen und vielleicht eine Spalte hinzufügen, um darauf hinzuweisen, dass das Pusher-Protokoll nicht verfügbar ist. Was denken Sie?

@lfern Ich stimme zu. Das wird Bitstamp und Quionex ausschalten

Danke Jungs für die Arbeit an WS! Benötigen Sie Hilfe, damit es schneller geht? Haben Sie auch eine ETA, wann das in Ordnung sein wird? Mein Unternehmen braucht diese Funktion wirklich und wir können bei Bedarf 1 oder 2 Entwickler zuweisen.

@GoChartingAdmin Spalte „Ws Protocol“ in Readme-Tabelle hinzugefügt.

@backnight In den letzten Beiträgen wurden einige Änderungen vorgeschlagen. Aber ich denke, es wäre besser, wenn andere Leute Code für andere Börsen schreiben könnten, damit wir erkennen könnten, dass die aktuelle ws-Implementierung wirklich eine gute Implementierung ist. Ich weiß nicht, ob jemand versucht, dies zu tun oder diese Implementierung in irgendeiner Weise zu modifizieren, aber ich warte auf ein Feedback dazu. Wenn diese Implementierung akzeptiert wird (mit allen vorgeschlagenen Änderungen), denke ich, dass neue Austausche sehr schnell hinzugefügt werden könnten.

@lfern Nur zur Info. Ich konnte kürzlich Nicht-Websocket-APIs (signalR oder Pusher) in unsere App integrieren. Wir unterstützen derzeit WS für mehr als 21 Börsen in unserer App GoCharting . Sehen Sie sich unten die Live-Produktion für einen signalR-Client an

https://gocharting.com/terminal/IN/CRYPTO/ADT%7CBTC/BitTrex

Ich werde einige dieser Teile einbringen, wenn wir die normalen Websockets behandelt haben. Mir wurde klar, dass sie alle nur Wrapper um die native Websocket-Implementierung sind und daher ohne andere Bibliotheken von Drittanbietern implementiert werden können

image

@lfern

ein möglicher Fehler? - Fehler "Socket nicht geöffnet" beim Aufrufen von "websocketSubscribe".

im Zweig https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Dies passiert in einem langsamen Netzwerk, wenn eine Verbindung zu Okex hergestellt wird.

Es ist seltsam, dass der Socket immer noch nicht geöffnet ist, wenn websocketSubscribe aufgerufen wird.

Fehlerstapel:

Fehler: I20180905-18:02:28.011(8) nicht geöffnet? bei WebSocket.send (node_modules/ws/lib/WebSocket.js:360:18) I20180905-18:02:28.011(8)? bei WebsocketConnection.send (ccxt-websocket/js/base/websocket/websocket_connection.js:77:28) I20180905-18:02:28.012(8)? bei WebsocketConnection.sendJson (cxt-websocket/js/base/websocket/websocket_base_connection.js:37:14) I20180905-18:02:28.012(8)? bei okex.websocketSendJson (ccxt-websocket/js/base/Exchange.js:1866:31) I20180905-18:02:28.012(8)? bei okex._websocketSubscribe (ccxt-websocket/js/okex.js:295:14) I20180905-18:02:28.012(8)? bei Promise.asyncApply (ccxt-websocket/js/base/Exchange.js:2092:14)

das wird sich nicht einfach reproduzieren lassen.

@kroitor Danke für das tolle Projekt. Gibt es ein Beispiel, das zeigt, wie man Trades über Websocket erhält?
Und welche Börsen werden bisher unterstützt

@amit2103

Gibt es ein Beispiel, das zeigt, wie man Trades über Websocket erhält?

Ich bin mir nicht sicher, ob es überhaupt über Websocket möglich ist, können Sie nicht die Rest-API verwenden?
https://github.com/lfern/ccxt/blob/feature/websockets-multiple/examples/js/bitfinex-fetch-trades.js

Und welche Börsen werden bisher unterstützt

https://github.com/lfern/ccxt/tree/feature/websockets-multiple#supported-cryptocurrency-exchange-markets

@lfern hallo, könnten Sie bitte ein Beispiel für ein Binance-Websocket-Fetch-Orderbook hinzufügen?

Hallo @djoffrey , in examples/js/websocket-orderbook.js finden Sie ein Beispiel zum Abrufen des Orderbuchs. Führen Sie es mit diesen Parametern aus und Sie können Ereignisse aus den Orderbuchinformationen abrufen und abrufen:

node examples/js/websocket-orderbook.js binance 'no-apikey-required' 'no-key-required' 10 ETH/BTC

Der erste Parameter ist die Börsen-ID, der zweite/dritte ist der API-Schlüssel/das Geheimnis (wird von Binance nicht benötigt), der vierte ist die Anzahl der zu erhaltenden Gebote/Anfragen und der fünfte und folgende sind das zu erhaltende Symbol.

Hey Leute, und wie wäre es mit FIX API? CoinbasePro unterstützt dies und würde die Türen zu klassischen (Aktien/...) Handelsbörsen öffnen. http://en.wikipedia.org/wiki/Financial_Information_eXchange Weiß nicht, welche anderen Krypto-Börsen diesen Standard unterstützen.

UPDATE: Habe einen guten Artikel gefunden ... https://algosforcryptos.com/trading-apis-top-crypto-exchanges/

FIX-API ist verfügbar für:

  • Bitfinex
  • Bitstamp
  • BTCC
  • CEX.io
  • CoinbasePrime
  • CoinbasePro
  • ZWILLINGE
  • HitBTC

Bedeutet, dass eine Implementierung der FIX-API (die meines Wissens auch wie Websocket streamt) sofort 8 (ok 7) Krypto-Börsen plus viele traditionelle Börsen abdecken würde.

Es gibt bereits nodeJS-Implementierungen für die FIX-API, auf die sich ccxt mit einem einheitlichen Zugriff auf FIX- und Websocket-Streams verlassen könnte. Nur eine Idee... :)

Ich hasse es, dieser Typ zu sein, aber irgendwelche Fortschritte dabei? Verstehen Sie mich nicht falsch, ich finde es erstaunlich, dass Sie so ein tolles Projekt kostenlos verschenken, aber die Websocket-Implementierung wurde angeblich vor über einem Jahr fast abgeschlossen.
Einfach eine HTTP-Anfrage in einer Schleife zu verwenden, wie in einigen Beispielen, ist keine gute Lösung für mein Projekt.
Also gibt es dafür eine ETA?
Nochmals vielen Dank für das tolle Projekt :)

@bramvbilsen Vielleicht müssen Sie damit beginnen, es in ccxt zu implementieren. Ich denke , @kroitor und alle anderen Entwickler würden sich freuen, wenn Sie entwerfen könnten, wie Sie es mit ccxt implementieren möchten (und Callback-Funktion zulassen, anstatt ein Versprechen zurückzugeben, denke ich). Sobald ich zur FixAPI komme (habe auch viele andere Aufgaben auf meiner Liste), werde ich wahrscheinlich damit beginnen, da ich die Arbeit der ccxt-Community (besonders @kroitor heutzutage) sehr schätze. Ich möchte der Gesellschaft etwas zurückgeben. Aber wie bei der „vor einem Jahr“-Ausgabe wird es auch noch etwas dauern. ;-)

@TechupBusiness Versteh mich nicht falsch, ich hätte nichts dagegen, es zu tun. Aber der Grund, warum ich mir ccxt angesehen habe, ist, dass ich leider überhaupt nicht viel Zeit habe.

@bramvbilsen Das ist wahrscheinlich der Grund, warum die meisten von uns hier gelandet sind: Zeit sparen, da es die knappste Ressource ist. :)

PS Ich würde auch gerne eines Tages eine Art ccxt für Blockchain/DLT-Interaktionen sehen.

@TechupBusiness Genau!

Wenn Ihr Projekt dies benötigt und die Börse(n) Websocket-Unterstützung haben, warum schreiben Sie dann nicht Ihren eigenen Wrapper? Es ist viel einfacher, als etwas zu schreiben, das in eine einheitliche Abstraktionsschicht passt, was die Leute von ccxt versuchen. Es gibt bereits viele Implementierungen für beliebte Börsen wie Binance, Bitfinex, Bitstamp usw. Es gibt keinen Grund, warum Sie HTTP-Anfragen durchlaufen sollten, wenn Ihnen eine Websocket-API zur Verfügung steht

@soliveira-vouga Das mache ich nicht, ich verwende derzeit die Websocket-Implementierungen verschiedener Börsen. Aber ich dachte, ich hätte gesehen, dass die Beispiele in diesem Repo genau das tun, um "Live" -Daten zu erhalten.

Kann die Verzweigung feature/websockets-multiple von Python aus verwendet werden?

Austausch mit ws-Unterstützung (js/py/php) im Zweig feature/websockets-multiple
@quazzuk , @tommuhm , @yevsev , @imhazige , @beijingkaka , @firepol , danke für deine Hilfe!!

| Austausch | ws-Typ | Veranstaltungen |
|----------|-----------|--------------------- ----------|
|Binanz | WS | Orderbuch Ticker Handel ohlcv |
|bitmex | WS | Auftragsbuch |
|bitstamp | Drücker | Auftragsbuch |
|cex | ws (auth) | Auftragsbuch |
|Münzscheck | WS | Auftragsbuch |
|coinbaseprime | WS | Auftragsbuch |
|coinbasepro | WS | Auftragsbuch |
|Gateio | WS | Auftragsbuch |
|Zwillinge | WS | Auftragsbuch |
|hadax | WS | Auftragsbuch |
|hitbtc2 | WS | Auftragsbuch |
|huobipro | WS | Auftragsbuch |
|Bank | WS | Auftragsbuch |
|flüssig | Drücker | Auftragsbuch |
|okex | WS | Auftragsbuch |
|poloniex | WS | Auftragsbuch |
|zb | WS | Auftragsbuch |

Kennt jemand eine andere URL (https://algosforcryptos.com/trading-apis-top-crypto-exchanges/), um mehr Börsen zu erhalten, die Websocket- oder Pusher-Verbindungen unterstützen?

@lfern Ich versuche herauszufinden, wie der Python-Teil funktioniert. Wo ist die Konfiguration für die Websocket-URL für jeden Austausch? und die verfügbaren Veranstaltungen?

ask-Ausnahme wurde nie abgerufen
Zukunft:exception=ExchangeError('Kein gültiges Event-Orderbuch für Exchange Binance',)>
Traceback (letzter Aufruf zuletzt):
Datei "websocket-playground.py", Zeile 59, in main
warte auf exchange.websocket_subscribe(event, symbol, params)
Datei „/home/user/crypto/ccxt/python/ccxt/async_support/base/exchange.py“, Zeile 773, in websocket_subscribe
raise ExchangeError('Ungültiges Ereignis ' + Ereignis + ' für Austausch ' + self.id)
ccxt.base.errors.ExchangeError: Ungültiges Event-Orderbook für Exchange Binance

Danke

@ rg687 Ich übertrage noch keine von PHP und Python generierten Dateien aus dem Transpilationsprozess. Sie müssen npm run transpile im Basisordner ccxt ausführen, um sie zu erhalten. Sie finden eine `wsconf'-Konfigurationsstruktur mit gültigen Ereignissen ('ob' für Orderbuch)

@ rg687 möglicherweise müssen Sie vor der Transpilation npm run export-exchanges ausführen, um sicherzustellen, dass exchange.json generiert wird.

@ rg687 Ich übertrage noch keine von PHP und Python generierten Dateien aus dem Transpilationsprozess. Sie müssen npm run transpile im Basisordner ccxt ausführen, um sie zu erhalten. Sie finden eine `wsconf'-Konfigurationsstruktur mit gültigen Ereignissen ('ob' für Orderbuch)

@lfern Ich habe gerade mit Python getestet und es hat mit ein paar von mir getesteten Austauschprogrammen gut funktioniert. Gute Arbeit!

Ich sehe, dass viele große Börsen implementiert wurden.

Ideen, wann bitfinex implementiert wird?

Websocket-Auftragsbuch für therock, theocean, bitfinex2 hinzugefügt

@lfern Darf ich fragen, wann Sie 'websockets-multiple' mit dem Master zusammenführen möchten?

@AlexeyZelenin Ich weiß nicht wirklich, ob diese Entwicklung ausgereift genug ist, um eine Push-Anfrage zum Master zu stellen. Wenn ccxt-Besitzer so denken, würde ich dem Master eine Push-Anfrage hinzufügen. Aber ich denke, sie müssen prüfen, ob der entwickelte Code und die hinzugefügten Abhängigkeiten im Master-Branch zusammengeführt werden können.

@lfern tolle Arbeit mit bitfinex2, ich habe es gerade getestet und es funktioniert super.
Ich habe auch cex (authenticated WS) getestet.

Darf ich ein paar Probleme melden, die ich gefunden habe? Ich habe einige Websocket-Beispiele in examples/py getestet:

(Übrigens denke ich, dass es eine gute Idee sein könnte, ein paar Beispiele mit Verwendung (fühlen Sie sich frei, das Folgende zu kopieren/anzupassen) in die WEBSOCKETS.md -Datei zu schreiben, Noob-freundlich.) Wie auch immer, hier meine Ergebnisse:

  • websocket-poloniex-orderbook.py , (in Zeile 11 ersetzen Sie import ccxt.async durch import ccxt.async_support ) Verwendung ./websocket-poloniex-orderbook.py funktioniert
  • websocket-playground.py , Verwendung ./websocket-playground.py bitstamp ob BTC/EUR funktioniert wie ein Zauber
  • websocket-orderbook.py , (ersetzen Sie in Zeile 11 import ccxt.async durch import ccxt.async_support ), Verwendung:

    • ein Symbol: ./websocket-orderbook.py bitstamp None None 5 BTC/EUR

    • mehrere Symbole ./websocket-orderbook.py bitstamp None None 5 BTC/EUR XRP/EUR

Nach ungefähr 5 Sekunden bekomme ich diesen Fehler:

Traceback (most recent call last):
  File "/opt/projects-python/ccxtws/examples/websocket-orderbook.py", line 81, in <module>
    loop.run_until_complete(main())
  File "/usr/lib/python3.6/asyncio/base_events.py", line 473, in run_until_complete
    return future.result()
  File "/opt/projects-python/ccxtws/examples/websocket-orderbook.py", line 74, in main
    await exchange.websocket_unsubscribe('ob', symbol)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/base/exchange.py", line 825, in websocket_unsubscribe
    self._websocket_unsubscribe(conxid, event, symbol, oid, params)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/bitstamp.py", line 941, in _websocket_unsubscribe
    self.websocketSendJson(payload)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/base/exchange.py", line 669, in websocketSendJson
    websocket_conx_info['conx'].sendJson(data)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/websocket/websocket_base_connection.py", line 31, in sendJson
    self.send(json.dumps(data))
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/websocket/pusher_light_connection.py", line 172, in send
    if json_data['event'] == 'subscribe':
KeyError: 'event'

./websocket-orderbook.py binance None None 5 NANO/BTC BTC/USDT : scheint gut zu funktionieren, aber nach etwa 30s schlägt es mit KeyError:'limit' fehl.

Ich denke, dafür sind die Zeilen await asyncio.sleep(5) verantwortlich. Wenn ich z. B. auf 20 erhöhe, funktioniert es 20 Sekunden. Ist es möglich, das Beispiel so zu ändern, dass es für immer funktioniert?

Außerdem hatte ich erwartet, dass mehrere Websockets gleichzeitig funktionieren, was nicht wirklich der Fall ist.

Bitte reparieren Sie alle ccxt.async mit ccxt.async_support in den Beispielen, wenn es andere Reste gibt.

Nochmals vielen Dank für die tolle Arbeit. Ich habe mich wirklich darauf gefreut, eine gute Bibliothek zu haben, die viele Austauschmöglichkeiten unterstützt, und das erfüllt die Aufgabe.

Danke! @firepol , dein Traceback hilft mir, zwei Fehler zu finden:

  • ein Symbol: ./websocket-orderbook.py bitstamp None None 5 BTC/EUR
  • mehrere Symbole ./websocket-orderbook.py bitstamp None None 5 BTC/EUR XRP/EUR

Nach ungefähr 5 Sekunden bekomme ich diesen Fehler:

Traceback (most recent call last):
  File "/opt/projects-python/ccxtws/examples/websocket-orderbook.py", line 81, in <module>
    loop.run_until_complete(main())
  File "/usr/lib/python3.6/asyncio/base_events.py", line 473, in run_until_complete
    return future.result()
  File "/opt/projects-python/ccxtws/examples/websocket-orderbook.py", line 74, in main
    await exchange.websocket_unsubscribe('ob', symbol)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/base/exchange.py", line 825, in websocket_unsubscribe
    self._websocket_unsubscribe(conxid, event, symbol, oid, params)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/bitstamp.py", line 941, in _websocket_unsubscribe
    self.websocketSendJson(payload)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/base/exchange.py", line 669, in websocketSendJson
    websocket_conx_info['conx'].sendJson(data)
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/websocket/websocket_base_connection.py", line 31, in sendJson
    self.send(json.dumps(data))
  File "/opt/projects-javascript/ccxt/python/ccxt/async_support/websocket/pusher_light_connection.py", line 172, in send
    if json_data['event'] == 'subscribe':
KeyError: 'event'

Dies wird durch einen Zeitüberschreitungsfehler beim Abbestellen verursacht. Das Pusher-Abonnement gibt ein ack-Ereignis zurück, aber die Abmeldung gibt kein Ereignis zurück und der Binance-Code hat darauf gewartet.
./websocket-orderbook.py binance None None 5 NANO/BTC BTC/USDT : scheint gut zu funktionieren, aber nach etwa 30s schlägt es mit KeyError:'limit' fehl.

Wenn Sie Aktualisierungen des Binance-Orderbuchs auf einem zweiten Marktsymbol abonnieren möchten, müssen Sie sich mit zusätzlichen URL-Parametern erneut mit dem Websocket verbinden. Wenn Websocket wieder verbunden wird, werden seine Kontextvariablen zurückgesetzt, sodass im Kontext gespeicherte „limit“-Parameter verloren gehen und diesen „ keyerror:limit “-Fehler verursachen. Bei dieser Art von Austausch (Streams) müssen wir diese Konfigurationsparameter in kontextbeständigen Variablen speichern.

Danke nochmal für deine Hilfe!

Vielen Dank an Sie @lfern für die schnellen Lösungen, die ich zu schätzen weiß.

Mir ist noch etwas aufgefallen, als ich mehrere Websockets an derselben Börse getestet habe, z.

./websocket-orderbook.py bitfinex2 None None 5 BTC/USDT XRP/USDT

Ich sehe sofort BTC/USDT-Updates, aber bevor ich etwas über XRP/USDT sehe, muss ich etwa 5 Sekunden warten.

Ich denke, das liegt an await asyncio.sleep(5) wird das wirklich benötigt?

Wenn ich es mit 3 Paaren versuche:

./websocket-orderbook.py bitfinex2 None None 5 BTC/USDT XRP/USDT

Gleiches: BTC/USDT wird sofort angezeigt, nach 5 Sekunden sehe ich XRP/EUR-Updates, dann muss ich weitere 5 Sekunden warten, um ETH/EUR-Updates zu sehen. Stellen Sie sich vor, Sie möchten 11 Paare überwachen, Sie sehen Updates des letzten Paares erst nach 50 Sekunden. Ist das eine Art Ratenbegrenzung für Websockets?

Außerdem scheint es im Websocker-Orderbook-Beispiel, dass der Websocket alle 5 Sekunden abgemeldet und neu abonniert wird. In diesem Beispiel sieht etwas nicht richtig aus.

Ich habe versucht, das erste await asyncio.sleep(5) zu kommentieren, aber dann scheint es nur das erste Paar zu abonnieren.
Ich habe versucht, einen niedrigeren Wert zu setzen, 1 Sekunde: await asyncio.sleep(1) , also ist die Verzögerung jetzt sehr gering.
Ich habe einen hohen Wert für den zweiten Schlaf festgelegt: await asyncio.sleep(2000000) so wird es erst später abgemeldet. Hat das eine Auswirkung? Was passiert, wenn der Websocket früher getrennt wird? 5 Sekunden war eine Möglichkeit, es in einem solchen Ereignis neu zu abonnieren? Wird ein Ereignis ausgelöst, wenn ein Abonnement für einen Websocket nicht mehr funktioniert? Wäre schön, ein Beispiel zu haben, um eine Websocket-Trennung richtig zu handhaben, z. B. versuchen Sie, sich nach 2 Minuten erneut anzumelden, wenn die Websocket-Verbindung unterbrochen wird.

Vielen Dank für Ihre Rückmeldung

Hallo, nach einigen weiteren Tests entwickle ich tatsächlich mein kleines eigenes Projekt und öffne es hier: https://github.com/firepol/ccxt-websockets-db-updater

@lfern Ich habe Probleme, mich mit mehr als einem Paar bei binance zu verbinden, vielleicht kannst du helfen, das zu beheben? Nach dem, was ich in meinem anderen Tool gesehen habe, das ich codiert habe (ebenfalls basierend auf einer anderen Bibliothek, also bin ich überhaupt kein Experte für Websockets), benötigen Binance und GDAX eine "Produktregistrierung", bevor sie jedes Auftragsbuch abonnieren. Ich weiß nicht, was das bedeutet, aber das könnte der Grund sein, warum Binance nicht funktioniert, wenn ich versuche, mich parallel zu verbinden, wie ich es in meinem Programm getan habe.

Siehe: https://github.com/firepol/ccxt-websockets-db-updater/issues/1

@firepol , binance verwendet Streams in der Websocket-Verbindung. Sie müssen den Websocket mit allen Symbolen öffnen, die Sie beobachten möchten: wss://stream.binance.com :9443/stream?streams=//

Wenn Sie zum ersten Mal versuchen, die Websocket-Bibliothek zu abonnieren, öffnen Sie den Websocket mit nur einem Stream: wss ://stream.binance. com:9443/stream?streams=NANOBTC@tiefe

während das Warten auf das erste Abonnement erfolgreich ist, wenn Sie versuchen, das zweite Symbol zu abonnieren, muss der binance ws-Treiber die vorherige Verbindung schließen und den Websocket mit einer neuen URL öffnen: wss://stream.binance.com :9443/stream? streams=NANOBTC@Tiefe/ETHBTC@Tiefe , und die erste Websocket-Öffnungsaktion wird geschlossen, bevor sie erfolgreich ist.

Ich weiß nicht, wie ich damit richtig umgehen soll, vielleicht müsste der Binance-Treiber vor dem Schließen warten, bis das erste Abonnement erfolgreich ist. Die Schließfunktion ist jedoch nicht asynchron, und wir müssen sicherstellen, dass die vorherige ws-Verbindung geschlossen ist, bevor eine Verbindung mit einer neuen URL hergestellt wird. Vorerst dürfen Sie nicht parallel an derselben Börse abonnieren

Hallo, nach einigen weiteren Tests entwickle ich tatsächlich mein kleines eigenes Projekt und öffne es hier: https://github.com/firepol/ccxt-websockets-db-updater

@lfern Ich habe Probleme, mich mit mehr als einem Paar bei binance zu verbinden, vielleicht kannst du helfen, das zu beheben? Nach dem, was ich in meinem anderen Tool gesehen habe, das ich codiert habe (ebenfalls basierend auf einer anderen Bibliothek, also bin ich überhaupt kein Experte für Websockets), benötigen Binance und GDAX eine "Produktregistrierung", bevor sie jedes Auftragsbuch abonnieren. Ich weiß nicht, was das bedeutet, aber das könnte der Grund sein, warum Binance nicht funktioniert, wenn ich versuche, mich parallel zu verbinden, wie ich es in meinem Programm getan habe.

Siehe: firepol/ccxt-websockets-db-updater#1

UPDATE: vielen Dank @lfern für die Reparatur meines kleinen Projekts, ich weiß es zu schätzen!

TL;DR: @lfern hat mir geholfen, dass es funktioniert, mehrere Websockets von derselben Börse parallel zu abonnieren. Schauen Sie sich mein Skript an: https://github.com/firepol/ccxt-websockets-db-updater

@lfern danke für deine Antwort, übrigens ist mir bei bitfinex2 eine Kleinigkeit aufgefallen, der Zeitstempel fehlt.

Damit Binance mehrere Paare zulässt, können Sie sich vielleicht von der xchange-stream-Bibliothek inspirieren lassen, auch wenn es Java ist, vielleicht können einige Ideen auch für CCXT nützlich sein? Überprüfen Sie insbesondere ProductSubscription. Sehen Sie zB, wie ich es benutze (ich bin kein Experte, jemand hat mir geholfen, es zum Laufen zu bringen) hier:

https://github.com/firepol/crypto-websockets/blob/dev/src/main/java/com/github/firepol/cryptows/ExchangeManager.java

Siehe in processWebsockets :

        pairsByExchange.forEach((exchangeName, pairsCollection)->{
            if (Arrays.asList(NEED_PRODUCT_REGISTRATION).contains(exchangeName)) {
                pairsCollection.pairs.forEach(pair->{
                    StreamingExchange exchange = getStreamingExchange(exchangeName);
                    ProductSubscription productSubscription = ProductSubscription.create()
                        .addOrderbook(pair)
                        .build();
                    exchange.connect(productSubscription).blockingAwait();
                    subscribeOrderBook(exchange, pair);
                });
            } else {
                StreamingExchange exchange = getStreamingExchange(exchangeName);
                exchange.connect().blockingAwait();
                pairsCollection.pairs.forEach(pair->subscribeOrderBook(exchange, pair));
            }
        });

Grundsätzlich prüft das erste if, ob der Börsenname im NEED_PRODUCT_REGISTRATION -Array enthalten ist (das gdax, binance enthält, möglicherweise werden andere Börsen angezeigt) und stellt in diesem Fall eine Verbindung zum Websocket her, der das Produktabonnement übergibt. Wie das gehandhabt wird, weiß ich nicht genau, aber schauen wir uns hier den Quellcode an:

Hier die ProductSubscription -Klasse

Hier, wie es zB in BinanceStreamingExchange.java verwendet wird

    private BinanceStreamingService createStreamingService(ProductSubscription subscription) {
        String path = API_BASE_URI + "stream?streams=" + buildSubscriptionStreams(subscription);
        return new BinanceStreamingService(path, subscription);
    }

So weit so gut, wie Sie bereits erwähnt haben, wie dies in xchange-stream gehandhabt wird, bin ich mir nicht sicher, ich sehe, dass die Nachricht in der Superklasse gehandhabt wird, vielleicht können Sie einen Blick darauf werfen und mehr Glück beim Verstehen haben?

Hallo @lfern, während weiterer Tests (versucht, viele Verbindungen über einen längeren Zeitraum aufrechtzuerhalten) habe ich weitere Probleme festgestellt:

  • bitstamp, ws für btc/usd scheint zu abonnieren, aber es werden keine Werte zurückgegeben. Siehe bitstamp Websocket-Dokumentation , für jedes andere Paar als btc/usd ist der Kanalname order_book_{currency_pair} , aber für btc/usd ist es nicht order_book_btcusd , sondern einfach order_book .
  • bitstamp: datetime ist immer: 1970-01-18T20:58:45.806Z
  • bitfinex: datetime & timestamp sind beide null
  • bitfinex: Volumenwerte für Asks werden mit negativen Werten zurückgegeben, zB -240, erwartet: 240
  • cex scheint ziemlich instabil zu sein: Ich habe viele Verbindungen getestet und cex ist diejenige, die am meisten abbricht. Cex-Websockets müssen authentifiziert werden. Wenn Sie dies testen möchten und kein Konto haben, können Sie sich bei cex.io registrieren. Ich weiß, dass dies möglicherweise kein Problem Ihrer Implementierung ist, aber es wäre schön, ein Beispiel zu haben, das zeigt, wie Sie die Verbindung wiederherstellen können. Ich arbeite daran auf Python und konnte noch keine Lösung dafür finden.

Überprüfen Sie im Allgemeinen den Zeitstempel und die Datumszeit, bisher wirklich gute Arbeit!
Nochmals vielen Dank und Prost

Danke @firepol für dein Feedback.

  • Probleme mit bitstamp datetime und btc/usd-Abonnements wurden behoben
  • Ich kann keine Zeitstempelinformationen in Bitfinex-Auftragsbuchnachrichten finden. Daher fülle ich diese Werte lieber nicht mit Ortszeit.
  • Auch negative Bitfinex-Werte sind behoben.
  • Ich werde ein neues Beispiel mit einem Wiederverbindungsbeispiel hinzufügen. Möglicherweise müssen wir die Fehlerberichterstattung mit detaillierteren Fehlermeldungen ändern.

Hallo @lfern ,

Ich habe Ihren letzten Commit überprüft, aber die Commit-Nachricht ist irreführend, da sie "bitfinex" sagt, aber die Datei hat bitstamp.js geändert. Ich glaube, Sie haben vergessen, Bitfinex-Änderungen einzufügen, oder haben Bitstamp mit Bitfinex-Änderungen verwechselt, die Sie als nächstes übernehmen wollten?

Über den Umgang mit Verbindungsabbrüchen habe ich versucht, etwas in meinem Projekt zu versuchen (das übrigens bereits Daten in einer Datenbank speichert, ich verwende Postgres, aber Sie können es auch mit SQLite testen). Ich habe eine benutzerdefinierte Ausnahme (WsError) erstellt, die ich auslöse in: https://github.com/firepol/ccxt-websockets-db-updater/blob/master/utils.py :

    @exchange.on('err')
    async def websocket_error(err, conxid):  # pylint: disable=W0612
        error_message = type(err).__name__ + ":" + str(err)
        error_stack = traceback.extract_stack()
        logging.error(f'{exchange.id}: {error_message}')
        logging.error(error_stack)
        print(f'{exchange.id}, {datetime.datetime.now()}, {error_stack}')
        await exchange.close()

Und fangen Sie es hier ein: https://github.com/firepol/ccxt-websockets-db-updater/blob/master/ob_updater.py

    except WsError as wse:
        print(f'Canceling: {wse}')
        ob_subscriptions[wse].cancel()

Ich bin mir sicher, dass ich etwas falsch mache, ich bin immer noch ein Noob in der asynchronen Programmierung in Python.

Idealerweise möchte ich im ob_updater.py -Programm die Ausnahme pro Austausch abfangen (deshalb habe ich die Aufgaben in einem Wörterbuch wie folgt hinzugefügt:

            # make a list of tasks by exchange id
            ob_subscriptions[exchange.id] = asyncio.ensure_future(utils.subscribe_ws('ob', exchange, symbols, limit,
                                                     pp, args.debug, args.verbose, session))

Die Idee war dann, die Aufgabe richtig abzubrechen (die meiner Meinung nach jetzt nicht richtig abgebrochen wird, da sie sich beschwert, dass sie abgewartet werden musste) und dann eine neue Aufgabe desselben Austauschs zu erstellen. Das wäre das Beste.

Wenn Sie das in Ihre Repo-Beispiele aufnehmen können, werde ich versuchen, daraus zu lernen und mich für mein separates Projekt zu bewerben. Prost

neue Beispiele für die Wiederherstellung nach einem Websocket-Fehler hinzugefügt.

  • websocket-recover-connection.js
  • websocket-recover-connection.py

@firepol , was denkst du über den Wiederherstellungsprozess? Vielleicht könnte es einfacher sein.

Hallo @lfern , ich habe schnell dein neues Beispiel in Python ausprobiert: /websocket-recover-connection.py (Austausch: cex, ich habe meinen API-Schlüssel/Geheimnis weitergegeben, Paare: nur 'BTC/USD'

subscribe: BTC/USD
KeyError:'ok'
  File "/home/firepol/env/ccxtws/lib/python3.6/site-packages/ccxt/async_support/base/exchange.py", line 711, in websocket_connection_message
    self._websocket_on_message(conxid, msg)
  File "/home/firepol/env/ccxtws/lib/python3.6/site-packages/ccxt/async_support/cex.py", line 563, in _websocket_on_message
    getattr(self, method)(contextId, msg, oid, resData)
unsubscribing all ...
  File "/home/firepol/env/ccxtws/lib/python3.6/site-packages/ccxt/async_support/cex.py", line 570, in _websocket_handle_auth
unsubscribe: BTC/USD
    if msg['ok'] == 'ok':
ExchangeError:not recoverable error
unsubscribing all ...
unsubscribe: BTC/USD

Wie der Fehler sagt, scheint es, dass es in der msg keine 'ok'-Taste gibt. Hast du das in Python mit CEX versucht?

Tolle Arbeit & Branche @lfern , vielen Dank.
In Bezug auf 'ob' ist es möglich, nur den ersten Snapshot und dann die Updates zu erhalten, wenn sie kommen, nicht alles (z. B. mit einer Option)? Ich sehe im Code (zumindest beim Drucken der empfangenen Nachrichten vom Austausch), dass das Daten-Patching durch den ccxt-Code erfolgt.
Danke vielmals

Entschuldigung @firepol , ich habe nicht mit CEX getestet, ich muss den CEX-Verifizierungsprozess abschließen, um einen neuen API-Schlüssel zu generieren. Getestet mit bitfinex2, gemini und bitstamp

Danke @maayank , ich denke, wir müssen eine Kopie des Auftragsbuchs in ccxt aufbewahren, damit Sie eine Live-Auftragsbuchkopie erhalten, wenn Sie die websocketFetchOrdebook-Methode aufrufen. Es könnte möglich sein, dem Ereignisobjekt „ob“ ein zusätzliches Attribut mit den letzten empfangenen Änderungen hinzuzufügen (wie das CCXT-Attribut „info“ mit der ursprünglichen Antwort, die vom Austausch in CCXT-REST-Methoden empfangen wurde). Einige Börsen senden aber immer einen Snapshot (zB Bitstamp). In diesen Fällen ersetzt ccxt nur die Kopie des internen Orderbuchs durch eine neue.

Es ist nicht schwierig, diesen neuen Parameter „info“ mit den zuletzt erhaltenen Anfragen/Geboten (Preis/Betrag) hinzuzufügen, oder wir könnten ein neues Ereignis „rawob“ definieren, das nur Schnappschüsse und Aktualisierungen sendet, aber bevor ich dies hinzufüge, würde ich gerne wissen was andere darüber denken.

In Bezug auf 'ob' ist es möglich, nur den ersten Snapshot und dann die Updates zu erhalten, wenn sie kommen, nicht alles (z. B. mit einer Option)? Ich sehe im Code (zumindest beim Drucken der empfangenen Nachrichten vom Austausch), dass das Daten-Patching durch den ccxt-Code erfolgt.
Danke vielmals

@lfern ist Ihr Skript hier (https://github.com/lfern/ccxt/blob/feature/websockets-multiple/examples/py/websocket-orderbook.py) kann eigenständig ausgeführt werden?

cobinhood websocket support hinzugefügt: orderbook/trade/ticker/ohlcv

@mishaker Ja, Sie können dieses Beispiel ausführen, um eine einfache Bid/Ask-Tabelle für das Live-Orderbuch zu drucken. Es ist ein Konsolenskript, und ich habe es nur in Windows/Cygwin getestet, aber ich denke, es müsste auf der Linux-Konsole funktionieren.

@lfern ist Ihr Skript hier (https://github.com/lfern/ccxt/blob/feature/websockets-multiple/examples/py/websocket-orderbook.py) kann eigenständig ausgeführt werden?

@lfern vielleicht eine Noob-Frage, aber ich habe diesen Fehler beim Versuch, Ihr Skript auszuführen:

Task exception was never retrieved
future: <Task finished coro=<subscribe() done, defined at example.py:67> exception=AttributeError("'binance' object has no attribute 'on'",) created at example.py:64>
source_traceback: Object created at (most recent call last):
  File "example.py", line 194, in <module>
    main()
  File "example.py", line 64, in main
    asyncio.ensure_future(subscribe (ex, exchange['symbols'], config['symbolDefaults']), loop=loop)
Traceback (most recent call last):
  File "example.py", line 69, in subscribe
    @exchange.on('err')
AttributeError: 'binance' object has no attribute 'on'

Vielleicht sollte ich etwas einfügen, bevor ich das Skript ausführe?

Entschuldigung @mishaker. Ich übertrage keinen transpilierten Python-Code. Sie müssen also npm run trasnspile ausführen, bevor Sie ein Websocket-Python-Skript ausführen.

Upbit-Websocket-Unterstützung hinzugefügt: Auftragsbuch/Handel/Ticker

Hallo, wie kann ich rechtzeitig Bestellungen für Binance Exchange House erhalten?
Wie kann ich Bestellungen mit Zeitstempel erhalten?
Gibt es eine ccxt-Methode?

@lfern ein paar Neuigkeiten von meiner Seite: Ich habe mein Repo aktualisiert und jetzt funktioniert es ganz gut. Ich habe es eine ganze Nacht auf einer VM mit 2 CPUs und 2 GB RAM laufen lassen und hatte keine (scheinbare) Websocket-Verbindung ... die Festplatte drehte sich ziemlich, muss ich sagen, also werde ich ein Setup in Betracht ziehen, wo die Datenbank im Speicher ist, SQLlite hat eine solche Funktion.

Teilen eines kleinen Problems: Ich habe einige Konflikte festgestellt, wenn Binance und Cexio gleichzeitig laufen. Grundsätzlich kein Problem, wenn viele Börsen und Binance laufen. Aber wenn ich nur cexio + binance laufen lasse, bekommt binance einige Fehler. Aus diesem Grund musste ich die Fehlererkennung deaktivieren. Auch das Nichtabfangen dieser Fehler hat keine Auswirkungen und alles wird aktualisiert, daher weiß ich nicht, warum ich solche Fehlerereignisse erhalte. Vielleicht kannst du mal schauen, ob du es von deiner Seite auch reproduzieren kannst? Ich habe ein Problem in meinem Repo erstellt: https://github.com/firepol/ccxt-websockets-db-updater/issues/4 Ich werde den Stack-Fehler hinzufügen, aber wenn Sie versuchen, mein Repo mit --verbose und --debug Optionen werden Sie es sofort bemerken.

Um das Thema zu wechseln: Ich habe mich gefragt, ob Sie auch Websockets-Unterstützung für Bittrex hinzufügen könnten ? Ich werde gerne weitere Tests durchführen und je mehr Austausch es gibt, desto besser.

Tolle Arbeit, Mann, ich liebe die Websockets-Funktion und freue mich darauf, dass sie in Master zusammengeführt wird!

Übrigens, da Sie keinen mit Python transpilierten Code in das Repo schreiben, habe ich ein Repo erstellt, das nur die (transpilierten) Python-Dateien verwendet, um es einfacher in meinem Repo zu verwenden: https://github.com/firepol/ccxt-websockets
(Vielleicht wäre ein Nebenprojekt, dies zu automatisieren, sodass bei jedem Update von Ihrer Seite eine Travis-Pipeline den Code transpiliert und mein Repo aktualisiert, ohne dass ich es manuell mache ...).

@lfern , in Bezug auf Bitfinex und Zeitstempel senden sie Zeitstempel, wenn Sie ein "conf" -Ereignis im Abonnement mit dem entsprechenden Flag senden (grep für "Timestamp in milliseconds." in
https://docs.bitfinex.com/v2/docs/ws-general
).
(auch @firepol , wie ich sehe, hat er es angesprochen)
Ich kann einen Patch schreiben und ihn an Ihren Zweig senden, oder wenn es für Sie einfacher ist, nur zur Information ändern.

@maayank , Orderbuch-Timestamp-Handling jetzt hinzugefügt.

@firepol , tut mir leid!!! Ich versuche, diese Woche etwas Zeit zu finden, um Ihr Problem zu überprüfen und Bitrex-Unterstützung hinzuzufügen

@firepol Ich habe Bittrex gerade Websocket-Unterstützung hinzugefügt. Dieser Austausch verwendet Signalr und unsere interne Websocket-Implementierung (vielleicht wäre es notwendig, später eine neue Websocket-Klasse für Signalr zu erstellen). Ich habe es heute Nachmittag getestet und es funktioniert einwandfrei.

Ich habe ein PHP-Transpilationsproblem gefunden:
Dieser Javascript-Code

'connectionData': '[{"name":"c2"}]',

wird so nach PHP transpiliert

'connectionData' => [array ("name":"c2")]'

Ich werde ccxt/master mit diesem Zweig zusammenführen, um zu überprüfen, ob es behoben wurde.

Hallo @lfern , danke für die Implementierung von Bittrex! Ich habe es getestet und es funktioniert!

Vielleicht könnte die nächste große Börse Kraken sein? Ich habe gelesen, dass sie kürzlich Websocket-Unterstützung hinzugefügt haben: https://blog.kraken.com/post/2019/websockets-public-api-launching-soon/

Es wird in wenigen Tagen offiziell gestartet, aber es ist möglich, es bereits in der Sandbox zu testen.

Websocket-Unterstützung auf Kraken. Im Moment ist nur die Sandbox-Websocket-URL aktiv. Um es jetzt zu testen, müssen Sie die baseurl-Konfiguration in sandboxurl ändern.

Können Sie mir sagen, wie viel Geld ich habe? Danke!

Hallo Leute! Zunächst einmal, @lfern @firepol – danke, dass du diese große Initiative als WS vorantreibst, ich denke, die gesamte ccxt-Community ist sehr aufgeregt darüber.

Ich habe versucht, darin einzutauchen. Und ich habe folgende Ergebnisse. Zunächst habe ich mit diesem Skript begonnen: https://github.com/lfern/ccxt/blob/feature/websockets-multiple/examples/py/websocket-orderbook.py
und es wurde einfach ohne Ausgabe beendet:

v:py fcl$ python3 websocket-orderbook.py
v:py fcl$

Dann habe ich mit diesem Repo fortgefahren - https://github.com/firepol/crypto-websockets
Richten Sie APIs, Einstellungen, Datenordner usw. ein. Es läuft also, aber auch keine Ausgabe, keine Aktivität und DB ist leer:

v:ccxt-websockets-db-updater fcl$ ./ob_tester.py -e binance -s ETH/BTC --debug
^CClosing Loop
Nach Abschluss
v:ccxt-websockets-db-updater fcl$ cat cryptows.db
???N!!?gtableorder_bookorder_bookCREATE TABLE order_book (
id INTEGER NICHT NULL,
Austauschname VARCHAR(20) NICHT NULL,
base VARCHAR(10) NOT NULL,
zitieren VARCHAR (10) NICHT NULL,
Seite VARCHAR(3) NOT NULL,
Preis DEZIMAL NICHT NULL,
Lautstärke DEZIMAL NICHT NULL,
sortiere INTEGER NICHT NULL,
datetime DATETIME NOT NULL,
PRIMÄRSCHLÜSSEL (id)

Ich würde mich freuen, wenn Sie mir die Richtung aufzeigen könnten, um es richtig zu debuggen.

Hallo @Fcl69 , in Websocket-Multiple Branch werden Python-Module nicht aus dem Knotencode transpiliert. Wenn Sie dieses Beispiel versuchen:

 python3 examples/py/websocket-playground.py kraken ob ETH/XTC limit:1

und du bekommst so etwas:

Task exception was never retrieved
future: <Task finished coro=<main() done, defined at examples/py/websocket-playground.py:19> exception=ExchangeError('Not valid event ob for exchange kraken',)>
Traceback (most recent call last):
  File "examples/py/websocket-playground.py", line 58, in main
    await exchange.websocket_subscribe(event, symbol, params)
  File "c:\users\luis\documents\projects\ccxt\python\ccxt\async_support\base\exchange.py", line 826, in websocket_subscribe
    raise ExchangeError('Not valid event ' + event + ' for exchange ' + self.id)
ccxt.base.errors.ExchangeError: Not valid event ob for exchange kraken
kraken requires to release all resources with an explicit call to the .close() coroutine. If you are creating the exchange instance from within your async coroutine, add exchange.close() to your code into a place when you're done with the exchange and don't need the exchange instance anymore (at the end of your async coroutine).
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x0000022292D4C860>

dann müssen Sie Code transpilieren mit:

npm run transpile

und dann erhalten Sie den gesamten Python-Code zum Testen bereit.

Das websocket-orderbook.py -Skript reinigt den Konsolenbildschirm, um die Orderbuchdaten zu aktualisieren, wenn sie von den Börsen empfangen werden. Möglicherweise hat diese Reinigung den gedruckten Stacktrace-Fehler entfernt.

es sagt:
v:ccxt fcl$ npm transpile ausführen

[email protected] transpile /Users/v.golban/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt
Knoten transpilieren

internal/modules/cjs/loader.js:611
Fehler werfen;
^

Fehler: Modul 'ololog' kann nicht gefunden werden
bei Function.Module._resolveFilename (internal/modules/cjs/loader.js:609:15)
bei Function.Module._load (internal/modules/cjs/loader.js:535:25)
bei Module.require (internal/modules/cjs/loader.js:663:17)
bei require (internal/modules/cjs/helpers.js:20:18)
bei Objekt.(/Users/v.golban/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt/transpile.js:5:14)
bei Module._compile (internal/modules/cjs/loader.js:734:30)
bei Object.Module._extensions..js (internal/modules/cjs/loader.js:745:10)
bei Module.load (internal/modules/cjs/loader.js:626:32)
bei tryModuleLoad (internal/modules/cjs/loader.js:566:12)
bei Function.Module._load (internal/modules/cjs/loader.js:558:3)
npm ERR! Code ELIFECYCLE
npm ERR! Fehler 1
npm ERR! [email protected] transpilieren : node transpile
npm ERR! Ausgangszustand 1
npm ERR!
npm ERR! Fehler beim Transpile-Skript [email protected] .
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.
npm WARN Local package.json existiert, aber node_modules fehlt, wollten Sie installieren?

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR! .npm/_logs/2019-01-31T22_15_59_360Z-debug.log

und dann:

v:ccxt fcl$ cat .npm/_logs/2019-01-31T21_11_25_875Z-debug.log
0 info es hat geklappt wenn es mit ok endet
1 ausführliches cli [ '/usr/local/Cellar/node/11.9.0/bin/node',
1 ausführliches CLI '/usr/local/bin/npm',
1 ausführliches cli 'run',
1 ausführliches cli 'transpile' ]
2 info mit [email protected]
3 info mit [email protected]
4 verbose run-script [ 'pretranspile', 'transpile', 'posttranspile' ]
5 info lifecycle [email protected] ~pretranspile: [email protected]
6 info lifecycle [email protected] ~transpile: [email protected]
7 verbose lifecycle [email protected] ~transpile: unsafe-perm in lifecycle true
8 ausführlicher Lebenszyklus [email protected] ~transpile: PFAD: /usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/Users/Documents/_personal/_work/ccwd/bin/ccwd /ccxt_lfern/ccxt/node_modules/.bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ local/share/dotnet:~/.dotnet/tools
9 ausführlicher Lebenszyklus [email protected] ~transpile: CWD: ccxt_lfern/ccxt
10 dummer Lebenszyklus [email protected] ~transpile: Args: [ '-c', 'node transpile' ]
11 dummer Lebenszyklus [email protected] ~transpile: Zurückgegeben: Code: 1 Signal: null
12 info lifecycle [email protected] ~transpile: Transpile-Skript konnte nicht ausgeführt werden
13 ausführlicher Stack-Fehler: [email protected] transpile : node transpile
13 Verbose Stack Exit-Status 1
13 ausführlicher Stack bei EventEmitter.(/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:301:16)
13 ausführlicher Stack bei EventEmitter.emit (events.js:197:13)
13 ausführlicher Stack bei ChildProcess.(/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 ausführlicher Stack bei ChildProcess.emit (events.js:197:13)
13 ausführlicher Stack bei MaybeClose (internal/child_process.js:978:16)
13 ausführlicher Stack bei Process.ChildProcess._handle.onexit (internal/child_process.js:265:5)
14 ausführliche pkgid [email protected]
15 ausführlich cwd ccxt_lfern/ccxt
16 ausführlich Darwin 16.7.0
17 verbose argv "/usr/local/Cellar/node/11.9.0/bin/node" "/usr/local/bin/npm" "run" "transpile"
18 ausführlicher Knoten v11.9.0
19 ausführlich npm v6.5.0
20 Fehlercode ELIFECYCLE
21 Fehler Fehler Nr. 1
22 Fehler [email protected] transpilieren : node transpile
22 Fehler Ausgangsstatus 1
Fehler 23 Fehler beim [email protected] .
23 Fehler Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.
24 ausführlicher Ausgang [ 1, wahr ]

Entschuldigung, ich denke, Sie müssen zuerst npm install ausführen, um Knotenmodule zu installieren.

mein Fehler
aber dann:
v:ccxt fcl$ npm transpile ausführen

[email protected] transpile /Users/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt
Knoten transpilieren

internal/modules/cjs/loader.js:611
Fehler werfen;
^

Fehler: Modul „./exchanges.json“ kann nicht gefunden werden
bei Function.Module._resolveFilename (internal/modules/cjs/loader.js:609:15)
bei Function.Module._load (internal/modules/cjs/loader.js:535:25)
bei Module.require (internal/modules/cjs/loader.js:663:17)
bei require (internal/modules/cjs/helpers.js:20:18)
bei transpileDerivedExchangeFiles (/Users/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt/transpile.js:717:17)
bei Objekt.(/Benutzer/Dokumente/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt/transpile.js:958:17)
bei Module._compile (internal/modules/cjs/loader.js:734:30)
bei Object.Module._extensions..js (internal/modules/cjs/loader.js:745:10)
bei Module.load (internal/modules/cjs/loader.js:626:32)
bei tryModuleLoad (internal/modules/cjs/loader.js:566:12)
npm ERR! Code ELIFECYCLE
npm ERR! Fehler 1
npm ERR! [email protected] transpilieren : node transpile
npm ERR! Ausgangszustand 1
npm ERR!
npm ERR! Fehler beim Transpile-Skript [email protected] .
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR! .npm/_logs/2019-01-31T23_08_18_442Z-debug.log

Nochmals Entschuldigung! ausführen
npm run export-exchanges
Wenn es nicht funktioniert, führen Sie den vollständigen Build aus:
npmrun build

hm ... tut mir leid, dass ich dich anstupse, aber es hilft nichts. Gebäude scheitert an

v:ccxt fcl$ npm Build ausführen
.....
Transpilieren von ./js/test/base/functions/test.datetime.js (transpileDateTimeTests @ transpile.js:859)

→ ./python/test/test_exchange_datetime_functions.py (transpileDateTimeTests @ transpile.js:883)
→ ./php/test/test_exchange_datetime_functions.php (transpileDateTimeTests @ transpile.js:884)
Transpilieren von ./python/test/test_async.py → ./python/test/test.py (transpilePythonAsyncToSync @ transpile.js:778)
Erfolgreich transpiliert. (@transpile.js:975)

[email protected] qa /Users/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt
npm run check-python-syntax && npm run check-php-syntax

[email protected] check-python-syntax /Users/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt
cd python && tox -e qa && cd ..

sh: tox: Befehl nicht gefunden
npm ERR! Datei sch
npm ERR! Code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! Syscall-Spawn
npm ERR! [email protected] check-python-syntax: cd python && tox -e qa && cd ..
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Fehler beim Skript [email protected] check-python-syntax.
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR! /Users/.npm/_logs/2019-02-01T02_38_44_448Z-debug.log
npm ERR! Code ELIFECYCLE
npm ERR! Fehler 1
npm ERR! [email protected] qa: npm run check-python-syntax && npm run check-php-syntax
npm ERR! Ausgangszustand 1
npm ERR!
npm ERR! Fehler beim [email protected] qa-Skript.
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR! /Benutzer/.npm/_logs/2019-02-01T02_38_44_481Z-debug.log
npm ERR! Code ELIFECYCLE
npm ERR! Fehler 1
npm ERR! [email protected] build-ohne-docs: npm run export-exchanges && npm run vss && npm run check-js-syntax && npm run browserify && npm run transpile && npm run qa
npm ERR! Ausgangszustand 1
npm ERR!
npm ERR! Fehler beim Skript [email protected] build-within-docs.
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR! /Users/.npm/_logs/2019-02-01T02_38_44_510Z-debug.log
npm ERR! Code ELIFECYCLE
npm ERR! Fehler 1
npm ERR! [email protected] : npm run build-without-docs && npm run pandoc-all && npm run update-badges
npm ERR! Ausgangszustand 1
npm ERR!
npm ERR! Fehler beim Build-Skript [email protected] .
npm ERR! Dies ist wahrscheinlich kein Problem mit npm. Oben befindet sich wahrscheinlich eine zusätzliche Protokollausgabe.

npm ERR! Ein vollständiges Protokoll dieses Laufs finden Sie in:
npm ERR!

und es bringt mich zu der Situation, die Sie erwähnt haben:

v:ccxt fcl$ python3 example/py/websocket-playground.py kraken ob ETH/XTC limit:1
Aufgabenausnahme wurde nie abgerufen
Zukunft:exception=AttributeError("'Kraken'-Objekt hat kein Attribut 'on'")>
Traceback (letzter Aufruf zuletzt):
Datei "examples/py/websocket-playground.py", Zeile 43, in main
@exchange.on('err')
AttributeError: 'Kraken'-Objekt hat kein Attribut 'on'
Kraken erfordert die Freigabe aller Ressourcen mit einem expliziten Aufruf der .close()-Coroutine. Wenn Sie die Austauschinstanz innerhalb Ihrer asynchronen Coroutine erstellen, fügen Sie Ihrem Code exchange.close() an einer Stelle hinzu, wenn Sie mit dem Austausch fertig sind und die Austauschinstanz nicht mehr benötigen (am Ende Ihrer asynchronen Coroutine). ).
Nicht geschlossene Clientsitzung
client_session:

@Fcl69 Bitte überprüfen Sie, ob die Datei exchanges.json im ccxt-Ordner generiert wurde. Wenn ja, versuchen Sie es erneut

npm run transpile

Dies sind aktuelle Börsen, die eine Orderbook-Websocket-Verbindung unterstützen:

  • binanz
  • bitfinex2
  • bitmex
  • Bitstempel
  • bittrex
  • cex
  • cobinhood
  • Münzprüfer
  • Coinbaseprime
  • Coinbasepro
  • Tor
  • Zwillinge
  • Hadax
  • hitbtc2
  • huobipro
  • Krake
  • lbank
  • Flüssigkeit
  • okay
  • Poloniex
  • der Ozean
  • der Stein
  • hochbit
  • Zum Beispiel

Bitte, weiß jemand, wessen Austausch der nächste sein könnte?

Es ist total geil zu sehen, was ihr hier leistet – danke dafür.

Wie denkst du alle (insbesondere @lfern und @kroitor) darüber, mit diesem Projekt größer zu werden? Es ist ein bisschen anstrengend, dies alles in einem Problemthread behandelt zu sehen. Vielleicht eine Wiki-Seite mit dem, was bereits funktioniert und was nicht, und vielleicht eine grobe Anleitung oder so etwas könnte hilfreich sein.

Nochmals vielen Dank für Ihre Mühe!

@lfern

exchanges.json ist da:

v:ccxt fcl$ ls exchanges.json
exchanges.json

"npm run transpile" geht gut:

v:ccxt fcl$ npm transpile ausführen

[email protected] transpile /Users/Documents/_personal/_work/ccwd/bin/ccwd/ccxt_lfern/ccxt
Knoten transpilieren

Transpilieren von _1btcxe.js (transpileDerivedExchangeFile @ transpile.js:696)
Transpilieren von acx.js (transpileDerivedExchangeFile @ transpile.js:696)
Transpilieren von allcoin.js (transpileDerivedExchangeFile @ transpile.js:696)
....

Transpilieren von zaif.js (transpileDerivedExchangeFile @ transpile.js:696)
Transpilieren von zb.js (transpileDerivedExchangeFile @ transpile.js:696)
Transpilieren von ./js/test/base/functions/test.number.js (transpilePrecisionTests @ transpile.js:896)
→ ./python/test/test_decimal_to_precision.py (transpilePrecisionTests @ transpile.js:945)
→ ./php/test/decimal_to_precision.php (transpilePrecisionTests @ transpile.js:946)
Transpilieren von ./js/test/base/functions/test.datetime.js (transpileDateTimeTests @ transpile.js:859)
→ ./python/test/test_exchange_datetime_functions.py (transpileDateTimeTests @ transpile.js:883)
→ ./php/test/test_exchange_datetime_functions.php (transpileDateTimeTests @ transpile.js:884)
Transpilieren von ./python/test/test_async.py → ./python/test/test.py (transpilePythonAsyncToSync @ transpile.js:778)
Erfolgreich transpiliert. (@transpile.js:975)

aber dann geht es sowieso nicht:

v:ccxt fcl$ python3 example/py/websocket-playground.py kraken ob ETH/XTC limit:1
Aufgabenausnahme wurde nie abgerufen
Zukunft:exception=AttributeError("'Kraken'-Objekt hat kein Attribut 'on'")>
Traceback (letzter Aufruf zuletzt):
Datei "examples/py/websocket-playground.py", Zeile 43, in main
@exchange.on('err')
AttributeError: 'Kraken'-Objekt hat kein Attribut 'on'
Kraken erfordert die Freigabe aller Ressourcen mit einem expliziten Aufruf der .close()-Coroutine. Wenn Sie die Austauschinstanz innerhalb Ihrer asynchronen Coroutine erstellen, fügen Sie Ihrem Code exchange.close() an einer Stelle hinzu, wenn Sie mit dem Austausch fertig sind und die Austauschinstanz nicht mehr benötigen (am Ende Ihrer asynchronen Coroutine). ).
Nicht geschlossene Clientsitzung
client_session:
^CClosing Loop
nach abgeschlossen
v:ccxtfcl$

OK, @ Fcl69 Ich denke, jetzt müssen Sie Python-Abhängigkeiten installieren:

pip3 install -e python

Ich habe es getan und wieder transpiliert, aber das gleiche Zeug:

v:ccxt fcl$ python3 example/py/websocket-playground.py kraken ob ETH/XTC limit:1
Aufgabenausnahme wurde nie abgerufen
Zukunft:exception=AttributeError("'Kraken'-Objekt hat kein Attribut 'on'")>
Traceback (letzter Aufruf zuletzt):
Datei "examples/py/websocket-playground.py", Zeile 43, in main
@exchange.on('err')
AttributeError: 'Kraken'-Objekt hat kein Attribut 'on'
Kraken erfordert die Freigabe aller Ressourcen mit einem expliziten Aufruf der .close()-Coroutine. Wenn Sie die Austauschinstanz innerhalb Ihrer asynchronen Coroutine erstellen, fügen Sie Ihrem Code exchange.close() an einer Stelle hinzu, wenn Sie mit dem Austausch fertig sind und die Austauschinstanz nicht mehr benötigen (am Ende Ihrer asynchronen Coroutine). ).
Nicht geschlossene Clientsitzung
client_session:

=(

Entschuldigung @Fcl69 . Ich habe diesen Zweig auf eine saubere Linux-Distribution heruntergeladen und mit diesen Schritten habe ich meine Entwicklungsumgebung konfiguriert:

git clone https://github.com/lfern/ccxt.git
cd ccxt/
git checkout -t origin/feature/websockets-multiple
npm install
pip3 install -e python/
npm run transpile
npm run export-exchanges
npm run transpile
python3 examples/py/websocket-playground.py kraken ob ETH/XBT 

Ich musste von python3.5 auf python3.6 upgraden und pip3 auf diese Python-Version installieren, aber wenn python3.6 oder höher auf Ihrem System installiert ist, sollte es funktionieren

@Fcl69 Ich habe gerade mein Projekt überprüft (Sie haben übrigens mein anderes Projekt in Java verlinkt, der richtige Link ist https://github.com/firepol/ccxt-websockets-db-updater ), einige Probleme behoben, die ob_tester.py betreffen https://www.youtube.com/watch?v=0UIvIBUiqQQ

Vielleicht war es in der Readme nicht klar, aber wenn Sie keine --verbose und keine --debug Option angeben, gibt es keine Ausgabe. Entschuldigung, wenn das nicht klar war. Versuchen Sie also einfach, es wie im Video von Grund auf neu einzurichten. Wenn Sie wie ich Linux verwenden, können Sie einfach den Installationscodeblock kopieren und einfügen.

Beachten Sie auch, dass ob_tester.py die DB nicht füllt: Es stellt nur eine Verbindung zu den Websockets her und tut nichts.
ob_updater.py füllt die DB.

Übrigens, falls Sie Probleme bei der Verwendung meines ccxt-websockets-db-updater -Projekts haben, können Sie gerne ein Problem in meinem Repository https://github.com/firepol/ccxt-websockets-db-updater schreiben und ich werde versuchen zu helfen Sie, um die Dinge zum Laufen zu bringen.

Außerdem sehe ich immer wieder die gleichen Probleme, dass Leute vergessen zu transpilieren usw. und tatsächlich habe ich bereits vor langer Zeit ein transpiliertes Repository erstellt, um den Einstieg zu erleichtern (ich verwende es als Abhängigkeit in meinem ccxt-websockets-db-updater -Programm): https://github.com/firepol/ccxt-websockets Beachten Sie, dass dies nicht geeignet ist, wenn Sie das CCXT-Projekt ändern möchten, es ist "schreibgeschützt" gedacht, nur um lferns Arbeit zu "verbrauchen" ;)

@lfern Ich habe huobipro mit der neuesten Version Ihres Zweigs in meinem Projekt ausprobiert (versuchen Sie es gerne, vielleicht können Sie damit Ihre Änderungen in Python in einem fortgeschritteneren Szenario testen), aber es scheint nicht zu funktionieren. Ich bekomme keine Ausgabe.

Siehe Anleitung unter https://github.com/firepol/ccxt-websockets-db-updater (siehe auch mein Video)

Arbeitsanschluss (mit Ausgang):

./ob_tester.py -e binance -s eth/btc --verbose --debug

Huobipro (es braucht keine API-Keys, oder?), funktioniert nicht, vielleicht kannst du es dir ansehen?

./ob_tester.py -e huobipro -s eth/btc --verbose --debug

Kraken, gleich, kein Fehler, aber keine Ausgabe:

./ob_tester.py -e kraken -s btc/usd --verbose --debug

Erwartet: siehe Websockets-Ausgabe, wie in Binance. Ergebnis: nichts...

Ideen?

@lfern @firepol Ich konnte das Skript mit einem anderen Setup starten.

Vielen Dank für Ihre Hilfe. Ich werde weiter graben.

@firepol Huobipro hat einige Transpilationsfehler und die gunzip-Methode von exchange.py war falsch. Es scheint jetzt gut zu funktionieren.

Hey @lfern , zwei Probleme mit Poloniex:

  1. In poloniex.js:1191 gibt es einen Fehler, der zu Python übergeht, wo die Kanal-ID nicht in eine Zeichenfolge umgewandelt und die Kontext-ID nicht an emit() übergeben wird. So sollte es sein:
    1191 this.emit ('err', new ExchangeError (this.id + '._websocketOnMessage() failed to get symbol for channelId: ' + channelId.toString ()), contextId);

  2. Ich bin auf das Obige im Rahmen eines anderen Problems gestoßen, bei dem ich BTC/USD oder BTC/USDT nicht abonnieren kann. Ich bekomme zum Beispiel:
    ExchangeError: poloniex._websocketOnMessage() failed to get symbol for channelId: 121

Lassen Sie mich wissen, wenn ich noch etwas überprüfen kann.
Prost

Vielen Dank für die Mühe, die in diesen Zweig gesteckt wurde! Gibt es eine Readme-Datei für den Zweig origin/feature/websockets-multiple ?

Ich habe es zum Laufen gebracht, aber ich habe mich gefragt, was die API war? Speziell,

  • Was sind die gültigen Werte für den Parameter event für websocketSubscribe ? _(sieht aus wie 'ob', wird noch etwas unterstützt?_
  • Wie verwendet man die Methode websocketFetchOrderBook ?
  • Die Daten im Orderbuch-Callback für Bitfinex hat das gesamte Orderbuch. Ist dies ein gemeinsames Format für alle Börsen?

Außerdem ist mir aufgefallen, dass die updateBidAsk -Methode insofern problematisch aussieht, als die Gebote/Briefe in einem Array gespeichert werden. Bei vollen Orderbüchern wird es viel Suchen geben, um sicherzustellen, dass die Artikel in der richtigen Reihenfolge gespeichert sind. Ich denke, das Ersetzen des Arrays durch einen Binärbaum wäre eine viel effizientere Lösung.

Hallo @npomfret , alle Credits gehen an @lfern und andere Mitwirkende, ich bin auch nur ein "Verbraucher" dieser Branche. Aber lass mich dir helfen, da ich ein paar Minuten Zeit habe ;)

Ja, es gibt eine Readme-Datei, und ich glaube, Sie können einige Antworten finden, indem Sie sie lesen:

https://github.com/lfern/ccxt/blob/feature/websockets-multiple/WEBSOCKETS.md

Ws-Funktionen:

  • ob: Orderbuch
  • ti: Ticker
  • tr: Handel
  • oh: ohlcv

Andere Fragen kann ich nicht beantworten, aber bis dahin haben Sie etwas zu lesen. Hoffe das hilft, Prost

Danke @maayank , lass es mich überprüfen

Hey @lfern , zwei Probleme mit Poloniex:

  1. In poloniex.js:1191 gibt es einen Fehler, der zu Python übergeht, wo die Kanal-ID nicht in eine Zeichenfolge umgewandelt und die Kontext-ID nicht an emit() übergeben wird. So sollte es sein:
    1191 this.emit ('err', new ExchangeError (this.id + '._websocketOnMessage() failed to get symbol for channelId: ' + channelId.toString ()), contextId);
  2. Ich bin auf das Obige im Rahmen eines anderen Problems gestoßen, bei dem ich BTC/USD oder BTC/USDT nicht abonnieren kann. Ich bekomme zum Beispiel:
    ExchangeError: poloniex._websocketOnMessage() failed to get symbol for channelId: 121

Lassen Sie mich wissen, wenn ich noch etwas überprüfen kann.
Prost

@npomfret , websocketFetchOrderBook-Funktion gibt eine Kopie des aktuellen internen Orderbuchs zurück, das von der Börse verwaltet wird. Ich denke, diese Funktion ist nicht der beste Weg, um Orderbuchinformationen zu erhalten. Es ist besser, die ausgegebenen 'ob'-Ereignisse abzuhören, wenn Updates von der Websocket-Verbindung empfangen werden. Einige Beispiele finden Sie im Beispielordner in den Sprachen Python, JS und PHP (Dateien mit dem Präfix "websocket-").

In Bezug auf das Orderbuchformat denke ich, dass alle ein ähnliches Format haben. Bei einigen von ihnen können Sie die Tiefe auswählen, sodass Sie Updates bis zu dieser Tiefe erhalten. In einigen Fällen müssen Sie mithilfe der REST-API einen Schnappschuss erhalten und Aktualisierungen von Websocket-Verbindungen erhalten ... Wie auch immer, jede Börsenimplementierung versucht, eine interne Kopie des Börsenauftragsbuchs zu verwalten und "ob" -Ereignisse an den Abonnenten auszugeben, wenn eine Aktualisierung empfangen wird.

Und ja, Sie haben Recht, wie Sie Askd/Bids im bestellten Array aktualisieren. Dies war von Anfang an eine Aufgabe, die wir verbessern mussten, aber wir wollten überprüfen, ob die Art und Weise, wie wir Websockets implementieren, gut funktionieren würde.

Vielen Dank für die Mühe, die in diesen Zweig gesteckt wurde! Gibt es eine Readme-Datei für den Zweig origin/feature/websockets-multiple ?

Ich habe es zum Laufen gebracht, aber ich habe mich gefragt, was die API war? Speziell,

  • Was sind die gültigen Werte für den Parameter event für websocketSubscribe ? _(sieht aus wie 'ob', wird noch etwas unterstützt?_
  • Wie verwendet man die Methode websocketFetchOrderBook ?
  • Die Daten im Orderbuch-Callback für Bitfinex hat das gesamte Orderbuch. Ist dies ein gemeinsames Format für alle Börsen?

Außerdem ist mir aufgefallen, dass die updateBidAsk -Methode insofern problematisch aussieht, als die Gebote/Briefe in einem Array gespeichert werden. Bei vollen Orderbüchern wird es viel Suchen geben, um sicherzustellen, dass die Artikel in der richtigen Reihenfolge gespeichert sind. Ich denke, das Ersetzen des Arrays durch einen Binärbaum wäre eine viel effizientere Lösung.

@maayank Ich denke, Poloniex ist behoben. Bitte überprüfen Sie es

Hey @lfern , zwei Probleme mit Poloniex:

  1. In poloniex.js:1191 gibt es einen Fehler, der zu Python übergeht, wo die Kanal-ID nicht in eine Zeichenfolge umgewandelt und die Kontext-ID nicht an emit() übergeben wird. So sollte es sein:
    1191 this.emit ('err', new ExchangeError (this.id + '._websocketOnMessage() failed to get symbol for channelId: ' + channelId.toString ()), contextId);
  2. Ich bin auf das Obige im Rahmen eines anderen Problems gestoßen, bei dem ich BTC/USD oder BTC/USDT nicht abonnieren kann. Ich bekomme zum Beispiel:
    ExchangeError: poloniex._websocketOnMessage() failed to get symbol for channelId: 121

Lassen Sie mich wissen, wenn ich noch etwas überprüfen kann.
Prost

Danke @lfern und @firepol

Ich habe zuvor Binärbäume verwendet, um Auftragsbücher zu implementieren, es ist sehr einfach. Ich denke, das Paket, das ich erwähnt habe, ist dasjenige, das coinbasepro auf ihrer Website verwendet.

Funktioniert gut. Wie immer vielen Dank @lfern :)

Hallo, ich versuche, einige Beispiele zu finden, wie man eine Verbindung zum Websocket für Bitmex in Python herstellt. Bei Bedarf helfe ich gerne beim Hinzufügen von Funktionen für den Austausch. Von welchem ​​Zweig sollte ich für die aktuellsten Python-Beispiele ausgehen?

Hallo @furryboffin , sieh dir das an: https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Beispiele etc. lesen Sie hier: https://github.com/lfern/ccxt/blob/feature/websockets-multiple/WEBSOCKETS.md

Lesen Sie „Bevor Sie in Python oder PHP testen“ (Sie müssen transpilieren, um die Python-Dateien zu generieren).

Zu Ihrer Bequemlichkeit habe ich ein Git-Repository erstellt, das den neuesten Code aus dem Zweig von lfern enthält (bereits transpiliert): https://github.com/firepol/ccxt-websockets

Genießen

Hallo,

Fehler „CloudFlare“, wenn der Code mehrere Stunden lang ausgeführt wird. Dies wurde mehrfach reproduziert. Ich führe den Beispielcode von Python aus:

example/py/websocket-playground.py kraken ob ETH/XBT

  1. Bitte fragen Sie, ob es einen implementierten (oder geplanten) Mechanismus gibt, der dies verhindern soll? (Ich habe im Allgemeinen über eine Anforderung für einige Keepalive gelesen, z. B. Ping?)
  2. Wenn es auftritt - Was sollte der empfohlene Ansatz sein, um diese Ausnahme zu behandeln? Sollte eine Abmeldung und erneute Anmeldung ausreichen?

Netzwerkfehler: CloudFlare WebSocket-Proxy wird neu gestartet
Datei "examples/py/websocket-playground.py", Zeile 64, inloop.run_forever()
Datei "/usr/lib/python3.6/asyncio/base_events.py", Zeile 427, in run_forever self._run_once()
Datei "/usr/lib/python3.6/asyncio/base_events.py", Zeile 1440, in _run_once handle._run()
Datei "/usr/lib/python3.6/asyncio/events.py", Zeile 145, in _run self._callback( self._args)Datei "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/asyncio/websocket.py", Zeile 100, in connection_lost self._connectionLost(exc)Datei "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/websocket/protocol.py", Zeile 3365, in _connectionLost WebSocketProtocol._connectionLost(self, reason)Datei "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/websocket/protocol.py", Zeile 1105, in _connectionLost self._onClose(self.wasClean, self.remoteCloseCode, self .remoteCloseReason)Datei "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/asyncio/websocket.py", Zeile 181, in _onClose res = self.onClose(wasClean, Code, Grund)Datei "/home/user/Projects/ccxt/python/ccxt/async_support/websocket/websocket_connection.py", Zeile 43, in onClose self.event_emitter.emit('err', Exception(reason))Datei „/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/pyee/__init__.py“, Zeile 151, in Emitresult = f( args, *kwargs)Datei "/home/user/Projects/ccxt/python/ccxt/async_support/base/exchange.py", Zeile 782, in websocket_connection_error self.emit('err', NetworkError(error), conxid)Datei "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/pyee/__init__.py", Zeile 151, in emit result = f( args, **kwargs)
Datei "examples/py/websocket-playground.py", Zeile 47, in websocket_error traceback.print_stack()
Schlussschleife
nach abgeschlossen

Ich würde gerne einen Beitrag leisten, entweder durch Debugging oder wenn Sie mir einen Hinweis auf die allgemeine Richtung geben können, in der dies untersucht wird ...

Prost!

Hallo @aviad21 . Theoretisch sendet Kraken jede Sekunde eine Nachricht (https://www.kraken.com/features/websocket-api#message-heartbeat) und es scheint, dass CloudFlare Sockets nach 100 oder 1000 Sekunden Inaktivität schließen könnte, also sollte dieser Fehler nicht auftreten stattfinden. Vielleicht können wir eine Ping-Anfrage einbauen, wenn wir in kurzer Zeit kein Paket erhalten.

Wie auch immer, Sie können vom Austausch ausgegebene Ausnahmen abfangen und entscheiden, was dann zu tun ist:

  • Versuchen Sie immer, die Verbindung sofort wieder herzustellen
  • Warten Sie einige Zeit, wenn der vorherige Fehler vor kurzem aufgetreten ist.

Sehen Sie sich Beispiele/py/websocket-recover-connection.py und websocket-recover-connection2.py an. Diese Skripte simulieren einen NetworkError und warten 5 Sekunden, bevor sie die Websocket-Verbindung wiederherstellen. Grundsätzlich:

 @exchange.on('err')
    async def websocket_error(err, conxid):
        # log error
...
        # close websocket if necesary
        exchange.websocketClose(conxid)
       # analyze what to do now
        if isinstance(err, ccxt.NetworkError):
            # wait 5 seconds
            await asyncio.sleep(5)
            try:
                # clean current context data
                exchange.websocketCleanContext(conxid)
                # subscribe all symbols again
                await doSubscribe(exchange, symbols, {
                    'limit': limit,
                })
            except Exception as ex:
                print(ex)
                sys.stdout.flush()
        else:
...

Oder Sie können eine neue Austauschmethode ausprobieren, die versucht, sich wieder mit Websocket zu verbinden und das abonnierte Symbol erneut zu abonnieren (es ist noch nicht vollständig getestet).

async def websocket_error(err, conxid):
        #log error
        if isinstance(err, ccxt.NetworkError):
            # close if necesary
            exchange.websocketClose(conxid)
            #wait 5 seconds
            await asyncio.sleep(5)
            try:
                await exchange.websocketRecoverConxid(conxid)
            except Exception as ex:
                print(ex)
                sys.stdout.flush()
        else:

@lfern , ich freue mich über die Antwort, danke.
Nachdem ich mehrere Stunden lang versucht habe, dem oben genannten Problem auf den Grund zu gehen, kann ich die folgenden Beobachtungen zusammenfassen:

  • Nach einer gewissen Zeit, in der alles gut läuft, hören alle websocket_ob() -Ereignisse auf, alle zusammen aufzutreten
  • websocket_error() wird auch nicht empfangen (d.h. mit Ausnahme des oben genannten 'CloudFlare', das als Symptom des eigentlichen Problems erscheint ...)
  • Ich habe mehrere Symbole einer bestimmten Börse abonniert. Wenn das Problem auftritt, erhalten alle Symbole keine websocket_ob() -Updates mehr
  • Dies reproduziert sich wiederholt auf: Poloniex (höchste Reproduktionsrate), Huobipro, Kraken.
  • Dies wurde in den letzten 24 Stunden noch nicht reproduziert auf: binance, bitstamp, coinbasepro.
  • (dh jeder Austausch läuft separat auf einem dedizierten Python-Prozess. Prozesse laufen gleichzeitig auf demselben Computer. Kein RAM oder hohe CPU-Probleme ...)
  • Dies wird sowohl auf meinem PC als auch auf der GCP-Instanz Python 3.6.7 reproduziert
  • Ich führe die asyincio-Protokollierung im Debug-Modus aus, sehe aber nichts Besorgniserregendes

Ein weiterer Hinweis darauf, dass etwas schief läuft, wird beobachtet, wenn ich versuche, mich von dieser Situation zu erholen.
Da es kein websocket_error() gibt - Nach einer Zeitüberschreitung von 60 Sekunden, in der nichts empfangen wird, versuche ich Folgendes auszuführen: websocketClose() , dann websocketCleanContext() , asyncio.sleep(5) und schließlich doSubscribe() , wie Sie oben erwähnt haben.

Eine erste Ausnahme wird ausgelöst, wenn websocketClose() wird:

2019-03-15 13:09:54,345 - INFO: handle_log: websocketClose conxid: default
2019-03-15 13:09:54,345 - ERROR: handle_log: GENERIC (non ccxt.BaseError) exception while websocketClose: 'NoneType' object has no attribute 'close'
Traceback (most recent call last):
  File "examples/py/websocket-generic-orderbook-poloniex.py", line 107, in handle_log
    exchange_ctx.websocketClose(conxid)
  File "/home/user/Projects/ccxt/python/ccxt/async_support/base/exchange.py", line 728, in websocketClose
    websocket_conx_info['conx'].close()
  File "/home/user/Projects/ccxt/python/ccxt/async_support/websocket/websocket_connection.py", line 107, in close
    self.client._closeConnection(True)
  File "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/asyncio/websocket.py", line 128, in _closeConnection
    self.transport.close()
AttributeError: 'NoneType' object has no attribute 'close'

Und wenn dann die Ausführung von doSubscribe() erreicht wird, tritt eine weitere Ausnahme auf. Es liegt an dem Aufruf von exchange.py _websocket_ensure_conx_active() , der erneut versucht, die Verbindung zu schließen:

2019-03-15 13:09:59,388 - ERROR: exception close location 002: 'NoneType' object has no attribute 'close'
Traceback (most recent call last):
  File "/home/user/Projects/ccxt/python/ccxt/async_support/base/exchange.py", line 652, in _websocket_ensure_conx_active
    conx.close()
  File "/home/user/Projects/ccxt/python/ccxt/async_support/websocket/websocket_connection.py", line 107, in close
    self.client._closeConnection(True)
  File "/home/user/Projects/ccxt/venv/lib/python3.6/site-packages/autobahn/asyncio/websocket.py", line 128, in _closeConnection
    self.transport.close()
AttributeError: 'NoneType' object has no attribute 'close'

Wenn ich den close() -Versuchen unter _websocket_ensure_conx_active() einen try-except hinzufüge, kann ich den Status wiederherstellen und mich erneut anmelden.
Leider ... das Problem tritt hin und wieder auf (z. B. bei Poloniex könnte es alle 30 Minuten oder so sein, bei Huobi und Kraken einmal in mehreren Stunden ...) - also muss ich die eigentliche Ursache verstehen und lösen es.
Irgendwelche Hinweise, wie ich das weiter debuggen kann?

Hallo @aviad21 , wenn Sie sagen, dass Sie die Prozesse gleichzeitig ausführen, kann ich Sie fragen, ob Sie das ähnlich machen wie ich in meinem Programm (basierend auf lfern branch) https://github.com/firepol/ccxt-websockets-db-updater (siehe ob_updater.py Ich verwende eine .py-Datei und asyncio, um alle Austauschvorgänge und alle Paare zu wiederholen)? Wäre interessant zu wissen, ob Sie das Problem auch mit meiner ob_updater.py reproduzieren können ...

Hallo @firepol

Wenn Sie sagen, dass Sie die Prozesse gleichzeitig ausführen, kann ich Sie fragen, ob Sie das ähnlich machen wie ich in meinem
Programm...

Ich wollte sagen, dass ich mehrere Python-Skripte gleichzeitig ausführe, die jeweils unabhängig voneinander gestartet werden:

python examples/py/websocket-generic-orderbook-krken.py &
python examples/py/websocket-generic-orderbook-poloniex.py &
python examples/py/websocket-generic-orderbook-huobipro.py &

(Jedes davon basiert auf dem Beispiel ccxt\examples\py\websocket-playground.py )

Hey @lfern , ich glaube, es gibt einen Fehler mit Poloniex oder der Python-Basis-/Austauschklasse. Es aktualisiert derzeit das Orderbuch nicht beim Löschen von Updates, dh wenn es ein (Price = p, Amount = 0) Update gibt.

Dies kann auf 3 Arten nachgewiesen werden:

  1. Eine leichte Modifikation des ursprünglichen Poloniex-Orderbook-Beispiels: https://github.com/maayank/ccxt_polo_bug/blob/master/websocket-poloniex-orderbook.py
    Im Wesentlichen abonniert es BTC/USDT mit einem Limit von 100 und beendet es mit einer Nachricht, wenn einer der Top-10-Bids/Asks-Preise gelöscht wird (im Gegensatz zur Festlegung seines Betrags).
    Es hört nie auf (z. B. habe ich ~ 3 Stunden lang getestet)
  2. Das Setzen einer Drucknachricht auf den Ausführungszweig, der die Zeile in der Datenstruktur des internen Orderbuchs löscht, und das Greifen danach (oder auf ähnliche Weise das Setzen eines Haltepunkts) zeigt, dass der Code dieses Zweigs nie aufgerufen wird. Siehe diese Kopie von async_support/base/exchange.py unter https://github.com/maayank/ccxt_polo_bug/blob/fe43543f88cd4079d167700119f910ddfb359d6d/exchange.py#L344
  3. Soweit ich das beurteilen kann, geht es um folgendes Problem:
    A. _websocket_handle_ob ruft (nicht-async-)exchange.parse_order_book auf
    B. Was self.parse_bids_asks aufruft, das Elemente mit Betrag == 0 filtert
    C. Später in der Poloniex-Klasse ruft _websocket_handle_ob_delta_cache (async-)exchange.mergeOrderBookDelta auf, das updateBidAsk aufruft, das wiederum erwartet, dass value==0 Elemente zum Signalisieren des Löschens vorhanden sind
    D. Git, der die nicht-asynchronen Austauschklassen „js“ und „python“ beschuldigt, zeigt, dass erstere im März 2018 zu einer einfachen Karte (ohne den Filternebeneffekt) wurden.

Ich bin mir nicht sicher, wie ich es selbst beheben soll, da es möglicherweise grundlegend ist.
FYI, lassen Sie mich wissen, wenn ich weiter helfen kann.

Hallo @furryboffin , sieh dir das an: https://github.com/lfern/ccxt/tree/feature/websockets-multiple

Beispiele etc. lesen Sie hier: https://github.com/lfern/ccxt/blob/feature/websockets-multiple/WEBSOCKETS.md

Lesen Sie „Bevor Sie in Python oder PHP testen“ (Sie müssen transpilieren, um die Python-Dateien zu generieren).

Zu Ihrer Bequemlichkeit habe ich ein Git-Repository erstellt, das den neuesten Code aus dem Zweig von lfern enthält (bereits transpiliert): https://github.com/firepol/ccxt-websockets

Genießen

DANKE!

Hallo @kroitor ,
Dem Kommentar von @maayank folgend, scheint es, dass Orders mit Nullwert das zwischengespeicherte Orderbuch nicht aktualisieren und damit verbundene Preise nicht aus dem Orderbuch entfernt werden.

Möglicherweise wurde der Python-Ursprung davon in der folgenden zusätzlichen Bedingung eingeführt:
https://github.com/ccxt/ccxt/blob/45febed9b792ab33c9454626e468e8e9672dad37/python/ccxt/base/exchange.py#L1233 ... wo war die Absicht , "keine" Werte herauszufiltern?

Wenn ja, um das Herausfiltern gültiger 'amount==0'-Einträge zu vermeiden, sollten Sie Folgendes verwenden:

if bidask[price_key] is not None and bidask[amount_key] is not None:
...
if (price_key in bidask) and (amount_key in bidask) and (bidask[price_key] is not None and bidask[amount_key] is not None):

Woher kommt der Zeitstempel im Orderbuch-Feed von gdax/coinbase pro? Ich frage, weil ich von Zeit zu Zeit Updates mit sehr alten (mehr als 10 Sekunden) Zeitstempeln erhalte.

wie kann ich websocket in huobipro und zb für 'ob' und trade verwenden?
Können Sie detaillierte Schritte unternehmen?
Vielen Dank

wie kann ich websocket in huobipro und zb für 'ob' und trade verwenden?
Können Sie detaillierte Schritte unternehmen?
Vielen Dank

Hallo @317459062 , da ich in der anderen Ausgabe geantwortet habe, die Sie im falschen Repository geöffnet haben (das nur der Zweig von lfern ist, der Einfachheit halber in Python transpiliert), hier ein Link zu meinem kleinen Projekt, in dem ich versucht habe, ein praktisches Beispiel für die Vorgehensweise zu erstellen Verwenden Sie die Arbeit von lfern, um die neuesten Auftragsbücher in einer Datenbank zu speichern: https://github.com/firepol/ccxt-websockets-db-updater

Sie können es leicht in Aktion sehen. Befolgen Sie die Anweisungen in der Readme-Datei, um zu beginnen, und führen Sie dann diesen Befehl aus:

python ob_tester.py -e huobipro -s BTC/USDT --debug --verbose

Ich habe es gerade getestet und der Tester funktioniert. Informationen zum Speichern der Daten in einer Datenbank finden Sie unter Verwendung ob_updater.py . Die Fehlerbehandlung fehlt, also ist es noch in Arbeit, aber hoffentlich kann es Ihnen den Einstieg erleichtern. Prost.

Hallo @lfern , es scheint einen Fehler im _transpiled_ Python-Code von Kraken zu geben: Orderbuch-„Gebote“-Updates werden nicht immer gehandhabt.

Von Zeit zu Zeit sendet Kraken ein Orderbuch-Update, das sowohl „Asks“ als auch „Bids“ in einer einzigen Nachricht enthält, z. B.:

[0,{"a":[["5035.90000","7.19104284","1554559551.265576"]]},{"b":[["5029.00000","0.00000000","1554559551.278368"],["3601.00000","0.03400000","1554235030.583914"]]}]

Der relevante _transpiled_ Code in ccxt\async_support\kraken.py scheint nur Daten vom ersten Element von msg zu verarbeiten:

    def _websocket_on_message(self, contextId, data):
        msg = json.loads(data)
        event = self.safe_string(msg, 'event')
        status = self.safe_string(msg, 'status')
        if event is None:
            # channel data
            chanId = msg[0]
            data = msg[1]       ### <-- need to take into account a possible msg[2] as well

Bitte teilen Sie mir mit, ob ich hierzu weitere Informationen bereitstellen soll. Danke

Bearbeiten: Das Hauptproblem ist, dass 'a' und 'b' möglicherweise als zwei getrennte Wörterbücher innerhalb einer einzigen Liste ankommen. Wie 'as' und 'bs', die als zwei Schlüssel eines einzigen Wörterbuchs ankommen. Gesehen in den Beispielnutzlasten von Kraken. Dieser Beispiel-Python-Code wird es beheben:

if len(msg) is 3:
    data.update(msg[2])

(Sollte wahrscheinlich unter der Zeile if event == 'ob': platziert werden)

Hey @lfern , wollte dich wissen lassen, dass ich ein paar Events zur Coinbase/GDAX-Börse hinzugefügt habe (Ticker, Trades und Heartbeat). Bereit, eine PR zu machen, sobald ich es aufgeräumt habe. Ich stoße jedoch auf ein kleines Problem und kann wait4readyEvent nicht herausfinden.

Für wait4ready :

(node:1558) UnhandledPromiseRejectionWarning: Error: WebSocket is not open: readyState 0 (CONNECTING)
    at WebSocket.send (.../node_modules/ws/lib/websocket.js:314:19)
    at WebsocketConnection.send (.../node_modules/ccxt/js/base/websocket/websocket_connection.js:81:28)
    at WebsocketConnection.sendJson (.../node_modules/ccxt/js/base/websocket/websocket_base_connection.js:37:14)
    at coinbasepro.websocketSendJson (.../node_modules/ccxt/js/base/Exchange.js:2106:35)
    at coinbasepro._websocketSubscribe (.../node_modules/ccxt/js/gdax.js:1032:16)
    at Promise (.../node_modules/ccxt/js/base/Exchange.js:2323:26)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)

Auch wenn der Austausch ansonsten gut zu funktionieren scheint, würde ich wirklich gerne das Verbindungsrätsel lösen.

@lfern von dem, was ich aus den Kommentaren hier verstehe, ist die Websocket-API ziemlich stabil.

Gibt es Pläne, dies bald mit der Hauptversion von ccxt zusammenzuführen?

@lfern von dem, was ich aus den Kommentaren hier verstehe, ist die Websocket-API ziemlich stabil.

Gibt es Pläne, dies bald mit der Hauptversion von ccxt zusammenzuführen?

Weiß nicht, ob es stabil genug ist, siehe ccxt/ccxt#4335

Hallo @bugs181 , Jemand hat einige Probleme mit langsamen Verbindungen gemeldet, und ich denke, es gibt einen Fehler, der diese Ausnahme auslöst, wenn Sie versuchen, einen zweiten Aufruf der Abonnementmethode durchzuführen, bevor ein erster Aufruf zurückgegeben wurde. Wenn Sie einen öffentlichen Testzweig für dieses Feature haben, könnte ich es mir ansehen.

Hey @lfern , wollte dich wissen lassen, dass ich ein paar Events zur Coinbase/GDAX-Börse hinzugefügt habe (Ticker, Trades und Heartbeat). Bereit, eine PR zu machen, sobald ich es aufgeräumt habe. Ich stoße jedoch auf ein kleines Problem und kann wait4readyEvent nicht herausfinden.

Für wait4ready :

(node:1558) UnhandledPromiseRejectionWarning: Error: WebSocket is not open: readyState 0 (CONNECTING)
    at WebSocket.send (.../node_modules/ws/lib/websocket.js:314:19)
    at WebsocketConnection.send (.../node_modules/ccxt/js/base/websocket/websocket_connection.js:81:28)
    at WebsocketConnection.sendJson (.../node_modules/ccxt/js/base/websocket/websocket_base_connection.js:37:14)
    at coinbasepro.websocketSendJson (.../node_modules/ccxt/js/base/Exchange.js:2106:35)
    at coinbasepro._websocketSubscribe (.../node_modules/ccxt/js/gdax.js:1032:16)
    at Promise (.../node_modules/ccxt/js/base/Exchange.js:2323:26)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)

Auch wenn der Austausch ansonsten gut zu funktionieren scheint, würde ich wirklich gerne das Verbindungsrätsel lösen.

Ich habe versucht, den Websocket-Zweig zu verwenden, aber ich konnte die Dokumentation nicht verstehen, und aus irgendeinem Grund ist der Code für mich nicht selbsterklärend. Hätte jemand etwas dagegen, mich in die richtige Richtung zu schubsen, um ein Beispiel zu zeigen, wie ich zB den WS-Ticker für BitMEX in PHP zum Laufen bekomme? Pusesdo-Code würde wahrscheinlich funktionieren, solange er die richtigen Methoden verwendet. Hoffe jemand kann mich in die richtige Richtung schubsen. Danke!

@btc-zz , nur ein Anstoß (besonders wenn ich den PHP-Code nie verwendet habe), aber sobald Sie den Websockets-Zweig geklont haben, müssen Sie den js-Code mit npm in PHP transpilieren (dh kompilieren). Damit:

git clone https://github.com/lfern/ccxt.git
cd ccxt
git checkout remotes/origin/feature/websockets-multiple
npm install opencollective
npm install ws
npm run postinstall
npm run export-exchanges
npm run transpile

Es könnte nach zusätzlichen node.js-Modulen fragen - YMMV.

@lfern

Ich denke, es gibt einen Fehler, der diese Ausnahme auslöst, wenn Sie versuchen, einen zweiten Aufruf der Abonnementmethode durchzuführen, bevor ein erster Aufruf zurückgegeben wurde.

Das klingt nach dem, was ich tue. Ich habe jedoch bemerkt, dass await exchange.websocketSubscribe einfach hängt. Das Versprechen wird sich niemals lösen. Ich hatte angenommen, dass die ws-Implementierung die Abonnements in die Warteschlange stellen würde. In den meisten Fällen wird nach dem Verbindungsfehler das Abonnement erneut versucht und es funktioniert einwandfrei. Es gab einige Fälle, in denen das Abonnieren des Heartbeat-Kanals fehlschlug und der Knoten nach einiger Zeit geschlossen wurde.

@ bugs181 Wenn websocketSubscribe für immer hängt, dann ist etwas in der js-Implementierung falsch, Sie sollten eine Timeout-Ausnahme erhalten. Möglicherweise haben Sie eine langsame Verbindung oder müssen auf eine vom Server gesendete Nachricht warten, bevor Sie ein Abonnement an den Server senden. Möglicherweise ändert der gdax-Websocket-Server das Protokoll. Ich würde versuchen, einige Tests durchzuführen. Verwenden Sie die js-Version?

@ bugs181 Ich habe gerade die aktuelle gdax js-Version getestet und es scheint, dass sie sich richtig verbindet. Vielleicht können wir uns auf den Websocket-Zweig festlegen und einige Tests durchführen.

@lfern Ich habe gerade den Code getestet, den ich hatte, und er funktioniert heute gut. Tatsächlich seltsam. Es ist möglich, dass es von einer langsamen Verbindung kam (wir haben hier seit ungefähr 2 Wochen Stürme).

Bearbeiten:
Gibt es einen Linting-Regelsatz, den ich für PRs befolgen soll? Ich habe ein paar Dinge an Ihrem Programmierstil bemerkt und möchte sicherstellen, dass wir uns einigen können.

@ bugs181 Nicht wirklich, befolgen Sie die allgemeinen Regeln von ccxt und achten Sie darauf, dass js-Code direkt in Python und PHP transpiliert wird.

Bearbeiten:
Gibt es einen Linting-Regelsatz, den ich für PRs befolgen soll? Ich habe ein paar Dinge an Ihrem Programmierstil bemerkt und möchte sicherstellen, dass wir uns einigen können.

@lfern Scheint, als hätte Cobinhood ihre WS-API oder so etwas geändert. Es gibt die Hälfte der Zeit eine Zeitüberschreitung

feature/websocket-multiple mit aktueller ccxt/master-Version zusammengeführt.

@xCuri0 Wie viel Zeit, um einen Timeout-Fehler zu erhalten? Testen des Ereignisses ohne Fehler für 1 Stunde.

@lfern in etwa 75% der Fälle kann es nicht mit Timeout-Fehler abonniert werden. Tritt nicht auf, wenn ich manuell mit wscat eine Verbindung herstelle

Wie verwende ich jetzt die Websocket-API? und gibt es einige docs?

@guotie WEBSOCKET.md im Zweig feature/websocket-multiple . Sie können sich auch die Beispiele ansehen. Afaik Das Wiederverbinden bei einem Netzwerkfehler in WS funktioniert nicht, außer dass es nach ein paar Stunden getrennt wird, es sei denn, Sie haben perfektes Internet

Keine Ahnung warum, aber wenn ich einen Netzwerkfehler simuliere, indem ich WiFi für eine Weile ausschalte, kann es sich wieder verbinden. Ein echter Netzwerkfehler gibt AttributeError: 'NoneType' object has no attribute 'close' aus, wenn versucht wird, die Verbindung wiederherzustellen

@kroitor Was sind die Anforderungen für die Zusammenführung des Websocket-Zweigs mit dem Master?

Ich habe den Zweig feature/websocket-multiple nicht gefunden. @xCuri0

@guotie auf lferns CCXT gibt es

OK danke

Das einzige Problem mit dem ws-Zweig scheint jetzt der PHP-Build zu sein. Hoffentlich wird es behoben, damit es mit dem Master zusammengeführt werden kann

Gibt es hierzu Neuigkeiten ?

@kroitor Was fehlt, um integrieren zu können? Viele Leute freuen sich auf die Websockets

@kroitor Könnten Sie bitte sagen, wann Websockets in ccxt verfügbar sein werden?

@qwasko1212 Ich werde hier innerhalb einer Woche oder so ein Update posten. Bitte warte. Thx für deine Geduld!

Hallo zusammen und ein großes Dankeschön an alle CCXT-Benutzer und Mitwirkenden! Wir wissen Ihr Engagement sehr zu schätzen!

Zunächst einmal möchten wir der Community dafür danken, dass sie es uns ermöglicht hat, so weit zu kommen. Ihr seid alle großartige Menschen, und ohne euch wäre dieses Projekt nicht in der Position, in der es heute steht. Auch wenn sich CCXT auf RESTful-APIs konzentriert hat, haben wir Ihre Begeisterung für WebSockets immer geschätzt und verstanden. Der ständige Strom von Kommentaren, die Interesse am Status von WebSockets bekunden, ist nicht unbemerkt geblieben, obwohl wir zu dieser Angelegenheit größtenteils geschwiegen haben.

Es ist klar, dass CCXT nicht länger nur REST bleiben kann. Die Community hat lange gewartet und unser Schweigen hat zu Frustration und sogar zu Zweifeln geführt, dass wir daran gearbeitet haben, dieses Feature hinzuzufügen. Ich entschuldige mich dafür, dass ich nicht allen geantwortet habe, aber ich wollte eine aussagekräftige Antwort geben und nicht nur ein leeres Versprechen. Wir konzentrieren uns sehr auf die eigentliche Arbeit der Wartung und Verbesserung von CCXT, daher hoffen wir auf Ihr Verständnis.

Die Streaming-Unterstützung innerhalb von CCXT befindet sich seit einiger Zeit in der Entwicklung, und wir sind sehr nah dran, eine Architektur zu haben, die unsere Kriterien für Benutzerfreundlichkeit, Hot-Swapping, Vereinheitlichung und Portabilität erfüllt. Alles wurde intern von Grund auf nach den gleichen hohen Standards codiert, für die CCXT bekannt ist, wobei Erweiterbarkeit ein zusätzliches Ziel ist.

In den letzten zwei Jahren ist CCXT exponentiell gewachsen, und der Umfang der erforderlichen Wartungsarbeiten und des Supports ist proportional damit gewachsen. Als MIT-lizenziertes Open-Source-Projekt haben wir alles selbst finanziert, aber in diesem Umfang können wir das nicht fortsetzen. Ohne die notwendigen Ressourcen, um die Bibliothek angesichts eines sich schnell verändernden Krypto-Universums zu warten, würde sie bald an Funktionalität verlieren und an Nützlichkeit verlieren. Ohne Weiterentwicklung würden neue Integrationen stagnieren. Nichts davon ist gut für die Bibliothek, die Community oder die Entwicklung der Kryptowährungsinfrastruktur, um mit der traditionellen Finanzierung zu konkurrieren.

Das bringt uns zu CCXT Pro. CCXT Pro ist ein professionelles Add-On für CCXT, das WebSockets und vieles mehr unterstützt. CCXT wird als Open-Source-Projekt unter der MIT-Lizenz weitergeführt und von Ihnen, der Community, in Verbindung mit einem besser finanzierten CCXT-Entwicklerteam unterstützt. CCXT Pro wird von einem privaten Repository auf kostenpflichtiger Basis gehostet, aber mit der Möglichkeit für Top-CCXT-Beitragende, kostenlosen Zugang zu erhalten.

Dies gleicht unseren festen Glauben an den Wert und die Kraft von Community-orientierten Open-Source-Projekten aus und geht gleichzeitig auf die Realität begrenzter Ressourcen und einer wachsenden Nachfrage nach einem höheren Maß an Service und Reaktionsfähigkeit von professionellen Händlern, größeren Unternehmen und Finanzinstituten ein Verwenden Sie CCXT für unternehmenskritische Arbeiten. Diese kommerziellen Benutzer möchten sofortigen Zugriff auf Support, kompilierte Sprachen, niedrige Latenzen, zusätzliche Handelsprotokolle und natürlich WebSocket-Fähigkeit.

Das Erstellen einer kommerziellen Lizenz und das Bezahlen dieser CCXT Pro-Benutzer ermöglicht es uns, die wichtige Arbeit an CCXT fortzusetzen, und ist unserer Meinung nach ein ethischer Weg, die Community und ihre Mitwirkenden zu unterstützen. Wir gehen davon aus, dass einige Leute dagegen sein werden, CCXT Pro zu einem kommerziellen Projekt zu machen, und wir sind an Ihrer Meinung interessiert, insbesondere wenn Sie aktiv mitgearbeitet haben. Wir möchten unsere Mitwirkenden mit CCXT Pro-Lizenzen belohnen und werden in Kürze einen Kanal eröffnen, über den entsprechende Anfragen gestellt werden können.

Die Veröffentlichung von CCXT Pro ist für das dritte Quartal dieses Jahres geplant. Wir werden bald weitere Details zur Roadmap zu CCXT Pro veröffentlichen.

Mit herzlichem Dank und Anerkennung!

Gut zu hören @kroitor ! Dies ist die richtige Entscheidung. Bitte stellen Sie sicher, dass diejenigen mit einer professionellen Lizenz weiterhin aus Quellen bauen können. Mir persönlich geht es nicht darum, für Software zu bezahlen, aber ich kann mir die Sicherheitsrisiken des Handels mit proprietärer Software nicht leisten.

Bitte stellen Sie sicher, dass diejenigen mit einer professionellen Lizenz weiterhin aus Quellen bauen können.

Die Lizenznehmer haben Zugriff auf das Quellcode-Repository von CCXT Pro auf GitHub und können aus Quellen bauen. Mitwirkende haben die Möglichkeit, eine kostenlose Lizenz zu erhalten.

Danke @kroitor. Irgendeine Ahnung, wie viel CCXT Pro kosten wird?

@zanoo werden wir ein einfaches Preisraster für verschiedene Arten oder Ebenen von Kunden anbieten. In Anbetracht des Zwecks der Lib, Geld zu verdienen, wird der Startplan für einzelne Entwickler erschwinglich sein – vergleichbar mit Ihrem monatlichen Kabel-/Sat-TV-Abonnement.

Mit CCXT Pro kommuniziert der Benutzer direkt ohne Zwischenhändler mit Börsen. Selbst wenn Ihre Lizenz abläuft, funktioniert CCXT Pro weiter. Es ist jedoch in Ihrem besten Interesse, eine Lizenz zu haben, die Ihnen Zugriff auf das geschützte Repository gewährt – einschließlich der neuesten Updates, Bugfixes, dedizierter Unterstützung, neuer Austauschvorgänge, Methoden und Verbesserungen.

@kroitor von CCXT Pro, sichere Unternehmen, die Funktionen und schnelle Anpassungen an der Bibliothek benötigen, werden davon profitieren, daher denke ich, dass Sie sie entsprechend in Rechnung stellen sollten. Mittlere Unternehmen, die Sie fast nie belästigen/fragen, aber dank CCXT Geld verdienen, sollten zahlen, aber viel weniger.

Wenn Sie sogar kleine Fische (Privatpersonen) bezahlen lassen wollen, wäre es meiner Meinung nach unfair (Menschen können CCXT möglicherweise zum Handeln verwenden, also ja "um Geld zu verdienen", aber letztendlich investieren sie ihr Geld und es ist mit ihrem Risiko, dass sie verdienen Geld, nicht direkt bei CCXT). Zu bedenken, dass es Bots wie 3commas, cryptohopper, gekko, gunbot etc. gibt, die sehr günstig kosten und tatsächlich einige AI / Algos haben, mit denen die Leute Geld verdienen.

Auch wenn Sie dies nur für "Top-CCXT-Beitragende" kostenlos lassen möchten, stellt sich die Frage: Wer sind die besten CCXT-Beitragenden, sicher diejenigen, die die Drecksarbeit machen. Was ist mit Leuten, die dies testen und viele Fehlerberichte (wie ich) und nützliche Ideen einreichen?

Eigentlich sollten Top-Beitragende (z. B. wie lfern) nicht nur eine kostenlose Lizenz erhalten, sondern auch eine Bezahlung verdienen. Ich meine, wie wollen Sie sonst aktive Beiträge anregen? Wenn du mir keinen Cent bezahlst, behalte ich meinen Code für mich, warum ihn kostenlos freigeben und du verdienst damit Geld und bittest mich vielleicht sogar, eine Lizenz dafür zu bezahlen, weil ich kein "Top" wäre Mitwirkender, aber nur ein "gelegentlicher" Mitwirkender?

Ich denke, es wäre fair, eine persönliche Stufe für Leute zu behalten, die kein Geschäft haben und dies als "Hobby" unter 10 USD/Monat nutzen. Oder noch besser, kostenlos. Ich meine: für westliche Länder sind 10 USD noch ok, aber ich kann mir vorstellen, dass einige Entwickler in Entwicklungsländern gerne 10 USD/Monat sparen würden...

... letztendlich denke ich, dass man Leuten, die es nicht kommerziell nutzen, eine kostenlose Lizenz geben sollte. Wenn zB ein Entwickler seinen eigenen Bot auf Basis von CCXT programmiert, ist das nicht kommerziell. Sollte eine kostenlose "nicht-kommerzielle" Lizenz sein.

Ich habe ein paar Sachen basierend auf CCXT codiert und es ist Open Source, würdest du Leute wie mich dafür bezahlen lassen wollen? Im Ernst, das würde mich daran erinnern, dass Apple von Entwicklern verlangt, 99 USD/Jahr zu zahlen, selbst wenn sie die Veröffentlichung kostenloser Apps planen. Lächerlich!

Wenn ein Entwickler einen Bot oder eine Software basierend auf CCXT erstellt hat und seine Software verkaufen möchte, dann stimme ich zu, dass er eine kommerzielle Lizenz bezahlen muss. Hoffentlich sollte es auch dafür eine Stufe geben. Stellen Sie sich noch einmal einen kleinen Entwickler vor, der versucht, ein auf CCXT basierendes Tool zu codieren und versucht, es zu verkaufen, aber niemand wird es am Anfang kaufen, vielleicht ein paar Exemplare pro Jahr. Es gibt viele Entwickler, die versuchen, ein bisschen Geld zu verdienen, nachdem sie viele, viele Stunden in etwas investiert haben und nicht viel in Marketing investiert haben, um es zu einem super kommerziellen Produkt zu machen ... Ich möchte sicher nicht 50-70 USD/Monat für ein " kommerzielle Lizenz" (z. B. Coinmarketcap berechnet 70 USD/Monat, ein lächerlich hoher Preis für einen kleinen Entwickler, der vielleicht 2-3 Kopien einer App zu je 3 USD verkaufen kann) und entfernen Sie lieber die CCXT-Abhängigkeit und verwenden Sie stattdessen native APIs. Es wäre ein Rückschritt und sehr enttäuschend.

Ich hoffe, Sie werden solche Aspekte berücksichtigen und kostenlose Lizenzen für nichtkommerzielle Leute oder Leute machen, die es kommerziell nutzen wollen, aber auch keine großen Gewinne daraus ziehen ... und sich dabei auf die Ehrlichkeit der Leute verlassen. Siehe zB jetbrains, syntevo. Bis Sie mit ihren Tools gemeinnützig sind, zahlen Sie nichts. An dem Tag, an dem Sie anfangen, Geld zu verdienen, bezahlen Sie die Lizenzen. Es ist fair genug.

Ich hoffe sehr, dass CCXT für Gelegenheitsnutzer kostenlos bleibt. Lassen Sie die Unternehmen & gewerblichen Nutzer zahlen! Vielen Dank

@kroitor von CCXT Pro, sichere Unternehmen, die Funktionen und schnelle Anpassungen an der Bibliothek benötigen, werden davon profitieren, daher denke ich, dass Sie sie entsprechend in Rechnung stellen sollten. Mittlere Unternehmen, die Sie fast nie belästigen/fragen, aber dank CCXT Geld verdienen, sollten zahlen, aber viel weniger.

Ja!

Wenn Sie sogar kleine Fische (Privatpersonen) bezahlen lassen wollen, wäre es meiner Meinung nach unfair (Menschen können CCXT möglicherweise zum Handeln verwenden, also ja "um Geld zu verdienen", aber letztendlich investieren sie ihr Geld und es ist mit ihrem Risiko, dass sie verdienen Geld, nicht direkt bei CCXT). Zu bedenken, dass es Bots wie 3commas, cryptohopper, gekko, gunbot etc. gibt, die sehr günstig kosten und tatsächlich einige AI / Algos haben, mit denen die Leute Geld verdienen.

Vergessen Sie nicht, dass das ursprüngliche CCXT mit all seiner Funktionalität unter dem MIT bleiben wird und immer noch kostenlos bleibt, also sind Leute, die es verwenden, nicht betroffen.

Der kostenpflichtige CCXT Pro-Teil wird der professionelle Teil sein, der Streaming beinhaltet, was höhere Geschwindigkeiten bedeutet, um wettbewerbsfähiger zu sein. Dieser Teil (der noch nicht veröffentlicht wurde) wird bezahlt und ist ein optionales Add-On. Sie können entweder auf dem kostenlosen CCXT aufbauen oder nahtlos zur kommerziellen Version wechseln und CCXT Pro verwenden, um etwas schneller und wettbewerbsfähiger zu sein.

Dieser kostenpflichtige Teil basiert nicht auf der Arbeit von @lfern , sondern wird intern vom CCXT-Entwicklerteam von Grund auf neu codiert. Aber @lfern verdient zweifellos eine kostenlose Lizenz. Und Lizenznehmer haben Zugriff auf den Quellcode.

Auch wenn Sie dies nur für "Top-CCXT-Beitragende" kostenlos lassen möchten, stellt sich die Frage: Wer sind die besten CCXT-Beitragenden, sicher diejenigen, die die Drecksarbeit machen. Was ist mit Leuten, die dies testen und viele Fehlerberichte (wie ich) und nützliche Ideen einreichen?

Top-Beitragende sind Personen, die auf diese oder jene Weise wesentlich zum Projekt beigetragen haben. Entweder mit Code oder mit Testen und Berichten (wir würden übrigens auch gerne Tester anregen ;)) oder auf andere Weise. Plz, keine Sorge, wir werden nicht versehentlich Leute vermissen, die ihre Mühe in dieses Projekt gesteckt haben. Da wir wissen, dass Sie im Laufe des Jahres tatsächlich viel dabei geholfen haben, werden wir das natürlich berücksichtigen.

Eigentlich sollten Top-Beitragende (z. B. wie lfern) nicht nur eine kostenlose Lizenz erhalten, sondern auch eine Bezahlung verdienen. Ich meine, wie wollen Sie sonst aktive Beiträge anregen?

Genau das möchten wir zusammen mit den anderen Dingen tun – wir werden Mitwirkende belohnen und vielleicht sogar Mitwirkende einladen, sich dem Projekt anzuschließen. Mit anderen Worten, der ganze Zweck, CCXT Pro zu einem kommerziellen Projekt zu machen, besteht darin, sowohl CCXT als auch CCXT Pro am Leben zu erhalten. Denn... siehe Antwort auf die nächste Frage...

Wenn du mir keinen Cent zahlst, behalte ich meinen Code für mich, warum ihn kostenlos freigeben und du verdienst damit Geld und bittest mich vielleicht sogar, eine Lizenz dafür zu bezahlen,

... warum sollte ich CCXT weiterhin pflegen? Warum sollte sich das CCXT-Entwicklerteam die Mühe machen, den Code zu veröffentlichen und zu pflegen? ) Warum sollten wir anderen beim Aufbau ihrer Projekte helfen? Ich habe ziemlich viel Code veröffentlicht, den ich selbst erstellt habe, damit Sie ihn kostenlos verwenden können, und ich habe keine Zahlung von Ihnen verlangt. ) Warum sollte ich das tun, denken Sie? ))

Für mich ist eine bessere Einstellung umgekehrt – es kommerziell zu machen, wird uns helfen, die Mitwirkenden angemessen zu motivieren. Und auch hier bleibt das ursprüngliche CCXT kostenlos. CCXT Pro wird jedoch bezahlt. Und im Idealfall sind sie interoperabel, was bedeutet, dass Sie hin und her wechseln können, ohne auch nur Ihren bestehenden Userland-Code zu ändern.

Ich denke, es wäre fair, eine persönliche Stufe für Leute zu behalten, die kein Geschäft haben und dies als "Hobby" unter 10 USD/Monat nutzen. Oder noch besser, kostenlos. Ich meine: für westliche Länder sind 10 USD noch ok, aber ich kann mir vorstellen, dass einige Entwickler in Entwicklungsländern gerne 10 USD/Monat sparen würden...

Wir werden unser Bestes tun, um es für Einzelpersonen erschwinglich zu machen. Unsere Startstufe wird Ihrer Schätzung nahe kommen. Bitte beachten Sie jedoch, dass wir möglicherweise $ 9 pro Arbeitsplatz und Monat ausgeben müssen, um den Zugriff auf Quellen zu ermöglichen und für GitHub-Benutzer zugänglich zu bleiben (um mit der vorhandenen Infrastruktur einfach zu verwenden zu sein) (https:// github.com/pricing), ohne andere Kosten und ohne den Aufwand der Entwickler.

... letztendlich denke ich, dass man Leuten, die es nicht kommerziell nutzen, eine kostenlose Lizenz geben sollte. Wenn zB ein Entwickler seinen eigenen Bot auf Basis von CCXT programmiert, ist das nicht kommerziell. Sollte eine kostenlose "nicht-kommerzielle" Lizenz sein.

Wenn es sich um eine nicht-kommerzielle Nutzung handelt, dann sollte sie (wenn Sie logischerweise daran denken) perfekt in die Kategorie der Zwecke von CCXT passen, die frei bleibt und unter der MIT-Lizenz weiterentwickelt wird. Also diejenigen, die nicht-kommerzielle Software und kostenlose Tools und sogar kommerzielle Bots auf Basis von CCXT erstellen – diese können immer noch alles kostenlos genießen und sind nicht betroffen. Aber es gibt auch Benutzer, die etwas mehr genießen möchten als andere – es ist ethisch vertretbar, ihnen zusätzliche Geschwindigkeit in Rechnung zu stellen.

Wenn Sie an irgendeinen Zweck des Streamings denken – das ist rein kommerziell. Können Sie mindestens einen nichtkommerziellen Zweck für die Verwendung eines etwas schnelleren Tools nennen, wenn eine kostenlose Version desselben Tools existiert, wobei alle anderen gleich sind? Wenn es sich um einen Bot handelt, dann ist dies in jeder Hinsicht mit Sicherheit eine kommerzielle Nutzung. Denn der reine Zweck eines Bots ist offensichtlich, kommerziell zu sein, „um Geld zu verdienen“. Warum sollten Sie höhere Geschwindigkeiten benötigen, außer um einen schnelleren Bot zu erstellen? Alle anderen Zwecke, einschließlich des historischen Trackings, müssen nicht wirklich sofort erfolgen, mit anderen Worten, Sie würden CCXT Pro nur benötigen, wenn Sie "etwas mehr Geld als der Durchschnitt verdienen" möchten. Wenn Sie keinen schnelleren Bot benötigen, können Sie den CCXT unter MIT weiter verwenden. Absolut kostenlos ) Und das ehrlich, offen und fair.

Ich habe ein paar Sachen basierend auf CCXT codiert und es ist Open Source, würdest du Leute wie mich dafür bezahlen lassen wollen?

Natürlich nicht. Denn CCXT bleibt kostenlos.

Im Ernst, das würde mich daran erinnern, dass Apple von Entwicklern verlangt, 99 USD/Jahr zu zahlen, selbst wenn sie die Veröffentlichung kostenloser Apps planen. Lächerlich!

Stimme dir bei diesem Beispiel voll und ganz zu. Darum:

  • Wir werden eine "CCXT bRO"-Lizenz haben, die für die nichtkommerzielle und akademische Nutzung kostenlos ist und für unsere Mitwirkenden kostenlos ist, die eine kostenlose Lizenz erhalten können, indem sie Code zum CCXT Pro-Repo beitragen.
  • Top-Beitragende des CCXT-Repositorys erhalten außerdem ihre kostenlosen bRO-Lizenzen für CCXT Pro. Wir werden dazu weitere Details bereitstellen.
  • CCXT wird unter MIT völlig kostenlos bleiben und wird sogar noch besser gepflegt, wenn Mitwirkende bessere Anreize bekommen.
  • CCXT wird von CCXT Pro subventioniert (sonst ist es nicht nachhaltig).
  • CCXT Pro berechnet im Grunde nur den Vorteil, der die Wartung, das schnelle Hinzufügen neuer Integrationen, die Entwicklung, den Support und die zugrunde liegenden Kosten umfasst.

Wenn ein Entwickler einen Bot oder eine Software basierend auf CCXT erstellt hat und seine Software verkaufen möchte, dann stimme ich zu, dass er eine kommerzielle Lizenz bezahlen muss. Hoffentlich sollte es auch dafür eine Stufe geben. Stellen Sie sich noch einmal einen kleinen Entwickler vor, der versucht, ein auf CCXT basierendes Tool zu codieren und versucht, es zu verkaufen, aber niemand wird es am Anfang kaufen, vielleicht ein paar Exemplare pro Jahr. Es gibt viele Entwickler, die versuchen, ein bisschen Geld zu verdienen, nachdem sie viele, viele Stunden in etwas investiert haben und nicht viel in Marketing investiert haben, um es zu einem super kommerziellen Produkt zu machen ...

Die Lizenz richtet sich hauptsächlich an größere Fische. Ein schlechter Entwickler hat also die Möglichkeit, so lange zu kämpfen, wie er möchte, und unser Plan für Anfänger wird erschwinglich sein. Die CCXT Pro-Lizenz richtet sich an Entwicklungsunternehmen, die keine Probleme mit Marketing haben und die CCXT Pro verwenden, um erfolgreiche Produkte und Dienstleistungen zu entwickeln. Was wiederum fair ist.

Ich möchte sicher nicht 50-70 USD/Monat für eine "kommerzielle Lizenz" ausgeben (z. B. berechnet Coinmarketcap 70 USD/Monat,

Unser Plan für Anfänger ist weit davon entfernt. Keine Sorgen.

lächerlich hoher Preis für einen kleinen Entwickler, der vielleicht 2-3 Kopien einer App zu je 3 USD verkaufen kann) und lieber die CCXT-Abhängigkeit entfernen und stattdessen native APIs verwenden. Es wäre ein Rückschritt und sehr enttäuschend.

Wir verstehen das, deshalb haben wir nicht die Absicht, dem Projekt ins Bein zu schießen, indem wir die Eintrittsschwelle zu hoch anheben.

Ich hoffe, Sie werden solche Aspekte berücksichtigen und kostenlose Lizenzen für nichtkommerzielle Leute oder Leute machen, die es kommerziell nutzen wollen, aber auch keine großen Gewinne daraus ziehen ... und sich dabei auf die Ehrlichkeit der Leute verlassen.

Wir denken das Gleiche.

Siehe zB jetbrains, syntevo. Bis Sie mit ihren Tools gemeinnützig sind, zahlen Sie nichts. An dem Tag, an dem Sie anfangen, Geld zu verdienen, bezahlen Sie die Lizenzen. Es ist fair genug.

Da bin ich ganz bei dir.

Ich hoffe sehr, dass CCXT für Gelegenheitsnutzer kostenlos bleibt. Lassen Sie die Unternehmen & gewerblichen Nutzer zahlen! Vielen Dank

CCXT wird für gelegentliche Benutzer kostenlos bleiben, außerdem wird es sogar für kommerzielle Benutzer und für die Unternehmen kostenlos bleiben.

CCXT Pro wird eine kommerzielle Lizenz haben, aber für Anfänger, professionelle Händler, Unternehmen und Wale erschwinglich sein.

Wir werden in ein oder zwei Wochen weitere Details veröffentlichen. Bleib dran!

Wow, das sind riesige Neuigkeiten, ich habe mein Projekt in den letzten Monaten nicht weitergeführt, also habe ich nicht wirklich an ccxt-Diskussionen oder -Entwicklungen teilgenommen ... bin mir noch nicht sicher, ob mir diese Änderungen gefallen oder nicht ;-) Es muss einen Startpreis für geben kleine wachsende Unternehmen (ohne eines Tages zu einem riesigen Kostenblock zu werden), sonst würde ich es mir zweimal überlegen, CCXT zu verwenden. Zumindest für die kostenlose Version musste ich Tests (unter Verwendung eines aktiven Exchange-Kontos und sehr kleiner Fiat-Mengen, um alle Objekte und Antworten zu testen), Verbesserungen usw. selbst schreiben, da sie weit entfernt von stabilen und einheitlichen Objekten war. Ich hoffe, Sie haben TypeScript zum Umschreiben verwendet ;-) Und sobald es um Geld geht, ist gutes QM sehr wichtig. Besser weniger unterstützte Börsen, aber stabilere Lib-API. Es gibt nichts Schlimmeres, als riesige Geldbeträge wegen einer fehlerhaften Bibliothek zu verlieren.

@kroitor vielen Dank für die Antwort. Eigentlich denke ich, dass man all diese Punkte in eine FAQ fassen und sie so schnell wie möglich auf der ccxt-Website/Blog/Twitter veröffentlichen und sie im Laufe der Zeit aktualisieren sollte, um einen zentralen Ort zu haben und nicht einen Thread wie diesen zum Scrollen zu finden verstreute Informationen hier und da.

Dieser Thread ja, es geht um Streaming und jetzt verstehe ich, dass es 2 verschiedene Versionen des Projekts geben wird, normale Rest-API und Pro = Websocket/Streaming-Version ... jetzt verstanden.

Für mich ist es ein No-Go, Gelegenheitsnutzern mehr als 9 USD/Monat zu berechnen. Vor allem, wenn Sie denken, dass Sie 9 USD/Monat pro Sitzung verschwenden müssen, um die Github-Lizenz zu bezahlen. Ich meine, komm schon (diese Github-Teamlizenz ist teurer als die "böse" Apple-Entwicklerlizenz!). Ich verstehe, dass es bequemer ist, auf Github zu bleiben, aber wie bereits erwähnt (und Sie schienen dem zuzustimmen), können Sie, wenn Sie sich auf die Ehrlichkeit der Leute verlassen, einfach ein neues Repo erstellen und den Quellcode öffentlich zugänglich lassen (nur die Lizenz muss). klar sein), keine Notwendigkeit, 9 USD für Mitglieder zu zahlen und es von allen herunterladen zu lassen. Sie bleiben also immer noch auf Github, müssen aber keine 9 USD/Monat für Leute zahlen, die dies gelegentlich nutzen.

Wenn Sie Angst haben, dass Leute wie diese die Quelle herunterladen und verwenden, ohne für die Lizenz zu bezahlen, dann bedeutet das, dass Sie dem zahlenden Publikum nicht vertrauen ... (die Prämisse war, dass Sie der Ehrlichkeit der Leute vertrauen).

Sie können ein separates System für die Lizenzen erstellen/verwenden. Ich bin sicher, es gibt viele Möglichkeiten, dies zu erreichen. Wahrscheinlich sogar Krypto als Zahlungsmittel akzeptieren, da dies ein Kryptoprojekt ist, warum nicht?

Schließlich können Sie ein weiteres Repo erstellen, ccxt-enterprise, in dem VIP-Leute (Unternehmen) den großen Scheck bezahlen und ihr spezielles Github-Konto dazu bringen, Fehler/Probleme zu melden, denen Sie eine höhere Priorität einräumen (falls Sie dies benötigen). Könnte eine Lösung sein, oder? So müssen alle kleinen Fische nicht berücksichtigt werden und Sie können diese 9 USD / Monat für sie überspringen ... eigentlich scheint mir dieses "Team" -Feature von Github nicht wirklich notwendig zu sein, und es erhöht nur die Kosten zu einem Projekt, das für gelegentliche/nicht-kommerzielle Nutzer möglichst günstig bleiben soll.

Um einen Einzelfall zu nennen, in dem Websockets für nicht-kommerzielle Zwecke benötigt werden: Benachrichtigungen.
Als Händler überwache ich gerne Preise mit meinem eigenen Bot und möchte benachrichtigt werden, wenn ein bestimmter Preis erreicht ist. Ja, schließlich möchte ich etwas automatisieren, wenn ein Preis ausgelöst wird ;) Es ist "kommerziell" ... aber wenn ich nur mit Taschengeld spiele und 20 USD Gewinne pro Monat mache, sollte ich eine Lizenz von 10-20 USD bezahlen und im Grunde 0 Gewinne für mich haben, um die von meinem kleinen Testbot verbrauchten Stromkosten zu decken? Ich denke, bis zu einem kleinen Gewinnbetrag können wir die Nutzung immer noch als "nicht kommerziell" betrachten. Bis zu 100 USD/Monat Nettogewinn (nach Gebühren, Steuern...) Ich würde sagen, noch nicht kommerziell, es ist nur Taschengeld... nach 100 USD/Monat kommerziell. Fair genug?

Eine weitere nichtkommerzielle Verwendung wäre auch die Erstellung eines Bots für Bildungszwecke, Open Source, um meine Programmierkenntnisse zu zeigen. Tatsächlich würde ich gerne einen Python-Job finden, ich bin es leid, Stellenangebote in C# zu erhalten, also möchte ich zeigen, dass ich in der Python-Entwicklung aktiv bin ;) Ich denke, viele Studenten könnten sich damit identifizieren (sie können erstellen darauf basierende Projekte erstellen und sie in ihren Lebenslauf aufnehmen oder in ihrer Bachelor-/Masterarbeit usw. verwenden), können sie ein Projekt auf Basis von CCXT pro erstellen, aber sie sollten dafür 0 bezahlen (ich bestehe darauf, 0, nicht sogar die 9 USD, um Github zu bezahlen - das brauchen wir nicht), die einzige Bedingung wäre, ihr Projekt als Open Source zu veröffentlichen. Denken Sie darüber nach: Jedes Open-Source-Projekt, das auf CCXT basiert, ist Werbung für CCXT. Gleiches gilt für CCXT Pro. Sie können mit CCXT und CCX Pro eine Liste bemerkenswerter Projekte erstellen, neue Programmierer oder Unternehmen können sich diese Projekte ansehen und diesen Code sogar für ihre eigenen Implementierungen verwenden.

Das sind meine 2 Cent Bedenken und Ideen. Sonst ... Ich bin ziemlich aufgeregt darüber. Werde versuchen, mein(e) kleine(n) Projekt(e) basierend auf CCXT wiederzubeleben und eines Tages in der Zukunft Open Source zu machen ;)

Gibt es einen Zeitplan, wann CCXT Pro zur Verwendung/zum Herunterladen verfügbar sein wird?

Für mich ist es ein No-Go, Gelegenheitsnutzern mehr als 9 USD/Monat zu berechnen. Vor allem, wenn Sie denken, dass Sie 9 USD/Monat pro Sitzung verschwenden müssen, um die Github-Lizenz zu bezahlen. Ich meine, komm schon (diese Github-Teamlizenz ist teurer als die "böse" Apple-Entwicklerlizenz!). Ich verstehe, dass es bequemer ist, auf Github zu bleiben, aber wie bereits erwähnt (und Sie schienen dem zuzustimmen), können Sie, wenn Sie sich auf die Ehrlichkeit der Leute verlassen, einfach ein neues Repo erstellen und den Quellcode öffentlich zugänglich lassen (nur die Lizenz muss). klar sein), keine Notwendigkeit, 9 USD für Mitglieder zu zahlen und es von allen herunterladen zu lassen. Sie bleiben also immer noch auf Github, müssen aber keine 9 USD/Monat für Leute zahlen, die dies gelegentlich nutzen

Den Lebensunterhalt von ccxt-Entwicklern auf die Ehrlichkeit der Menschen zu setzen, ist nicht etwas, wozu wir bereit sind. Ihr Argument, dass einige Leute von der Zahlung befreit werden sollten, weil sie unseren Code nur gelegentlich verwenden, macht keinen Sinn. Angenommen, ich möchte mit dem Zug fahren, aber ich fahre nur einmal im Monat mit dem Zug. Bedeutet das, dass ich kein Ticket bezahlen soll? Wie @kroitor sagte, wird die Startstufe sehr erschwinglich sein (wahrscheinlich mehr als 9 $ pro Monat), aber jeder, der schon einmal einen Bot geschrieben hat, weiß, dass der Handel selbst mit der kleinsten Menge an Krypto in diesen volatilen Märkten das 10-fache verliert / gewinnt Betrag innerhalb weniger Tage.

Wenn Sie Angst haben, dass Leute wie diese die Quelle herunterladen und verwenden, ohne für die Lizenz zu bezahlen, dann bedeutet das, dass Sie dem zahlenden Publikum nicht vertrauen ... (die Prämisse war, dass Sie der Ehrlichkeit der Leute vertrauen).

Es ist nicht so, dass wir Menschen nicht vertrauen, wir vertrauen sehr darauf, dass die meisten Menschen in einer solchen Situation unehrlich sein werden (selbst ich würde nicht bezahlen)

Um einen Einzelfall zu nennen, in dem Websockets für nicht-kommerzielle Zwecke benötigt werden: Benachrichtigungen.
Als Händler überwache ich gerne Preise mit meinem eigenen Bot und möchte benachrichtigt werden, wenn ein bestimmter Preis erreicht ist.

Verwenden Sie dann den regulären ccxt und fragen Sie den Ticker ab. Es ist nicht schwer. Und 100 ms spielen für die Benachrichtigungen auf Ihrem Telefon keine Rolle, da es 100-mal so lange dauert, bis Sie etwas manuell gehandelt haben.

Es ist "kommerziell" ... aber wenn ich nur mit Taschengeld spiele und 20 USD Gewinne pro Monat mache, sollte ich eine Lizenz von 10-20 USD bezahlen und im Grunde 0 Gewinne für mich haben, um die Stromkosten zu decken, die von meinem kleinen Test verbraucht werden bot?

Realistischerweise ist dies die Wahl des Benutzers, die Tatsache, dass Sie mit extrem schnellem ws-Code wenig Gewinne erzielt haben, ist nicht unsere Schuld, es bedeutet nur, dass Sie einen besseren Bot hätten entwerfen sollen (wir wissen, dass es schwierig ist ...)

Bot für Bildungszwecke, Open Source, um meine Programmierkenntnisse zu zeigen. Tatsächlich würde ich gerne einen Python-Job finden, ich bin es leid, Stellenangebote in C# zu erhalten, also möchte ich zeigen, dass ich in der Python-Entwicklung aktiv bin;) Ich denke, viele Studenten könnten sich damit identifizieren

Ich bin auch Student, und wir werden auf jeden Fall erwägen, kostenlose Bildungslizenzen an jeden zu vergeben, der nachweisen kann, dass er sich in der Bildung befindet, indem er eine Bildungs-E-Mail-Adresse besitzt, aber wir möchten nicht, dass dieses System missbraucht wird (z meine Uni-E-Mail für immer behalten).

@frosty00 Sie verschwenden immer noch 9 USD/Monat für einen Github-Sit pro Person. Sie könnten dies stattdessen als Rabatt für Ihre Benutzer geben.

Bahnticket ist eigentlich ein gutes Beispiel: Wenn ich den Zug 3 Mal im Monat benutze, denke ich, dass es fair ist, 3 Tickets zu kaufen und kein Monatsabonnement ;) Zu beachten: In einigen Ländern zahlen Senioren nicht für öffentliche Verkehrsmittel. In einigen Städten wie Tallinn (Estland) sind die öffentlichen Verkehrsmittel kostenlos. Also ja, in einer gierigen Welt, in der wir für alles bezahlen müssen, ist es immer noch möglich, kostenlose Sachen anzubieten, wenn man will.

Für alle Ihre anderen Punkte. Ich würde nicht darüber diskutieren.

Am Ende war ich vielleicht ein bisschen zu dramatisch, aber wenn Sie ein gutes Produkt liefern können, wie Sie es gesagt haben, wäre es wahrscheinlich für die meisten Benutzer ok, sogar mehr als 9 USD/Monat zu zahlen.

Für die wenigen, die nicht zufrieden sein werden, werden vermutlich kostenlose Alternativen wie https://github.com/bitrich-info/xchange-stream oder der Open-Source-Fork von @lfern zur Verfügung stehen.

Ich freue mich auf CCXT Pro.

@firepol Wenn das rein auf Ehrlichkeit basierende System funktioniert, sollten @kroitor und die Entwickler genug Geld verdienen, um diesen Schritt nicht machen zu müssen. Die Indexseite listet mehrere Optionen zum Sponsoring auf, sogar kleine Beträge, so dass jeder, der mit CCXT ernsthaft Geld verdient, wahrscheinlich bereits spenden sollte. Ich verstehe diesen Schritt und denke, dass er fair und machbar ist, wie Kroitor sagt, unter einer Bedingung. Aus meiner Sicht kann dies nur funktionieren, wenn CCXT Pro ausschließlich ein Add-on zu CCXT bleibt. Damit meine ich, dass beispielsweise die Websocket-Implementierung dieselben Austauschklassen von "Basis" CCXT verwenden sollte, sodass alle Updates und Verbesserungen für Pro zwangsläufig auch in CCXT vorgenommen werden. Sobald das zwei getrennte Projekte werden, kann ich mir kaum vorstellen, dass es funktioniert. Ich vertraue voll und ganz darauf, dass das Entwicklerteam alle Absichten hat, CCXT auch dann weiter zu unterstützen, warum sollten sie es sonst jetzt unterstützen. Sobald Sie jedoch zahlende Kunden für ein separates Produkt haben, werden natürlich zuerst alle Prioritäten mit diesem Produkt gesetzt. Vielleicht würde CCXT als Gemeinschaftsprojekt weiterleben, aber selbst das ist nicht sicher. Wie auch immer, so wie ich es verstehe, ist die Add-On-Funktion genau der Plan, daher denke ich, dass dies eine gute Entscheidung ist und CCXT insgesamt nur besser machen wird.

Die Tatsache, dass CCXT Pro direkt und ohne Zwischenhändler mit den Börsen interagieren kann, ist meiner Ansicht nach alles, was zählt. Der Zugriff auf den Quellcode hat mich davon überzeugt.

Ich wünschte, das CCXT-Team würde allein aus der CCXT-Basisbibliothek ein höheres Einkommen erzielen, ich vermute, CCXT wird von mehr und größeren Benutzern verwendet, als wir uns vorstellen können, und ich kann nur sehen, dass es im Laufe der Jahre mit dem Kryptomarkt wächst.

Ich finde es sinnvoll, kommerzielle Unternehmen, die ein gewisses Maß an Konsistenz erwarten, entsprechend zu belasten, im Gegensatz zu einzelnen Entwicklern, die das Tool bescheidener verwenden, das Risiko eingehen, auf Fehler zu stoßen, und wahrscheinlich entweder durch Commits, Vorschläge oder Fehlerberichte beitragen.

Streaming könnte eine optionale kostenpflichtige Lizenz rechtfertigen; Es ist schwer zu sagen, wie viel Unterschied es für Kleinanleger machen würde. Aber es war sicherlich eine ernsthafte Arbeit für das Team, und jede Arbeit verdient eine Gegenleistung.

Habe einige Fragen.
Werden wir vor dem Kauf des Produkts Zugriff auf das CCXT Pro-Handbuch haben, um alle Feinheiten von CCXT Pro zu verstehen? oder vielleicht wird es in das Basishandbuch aufgenommen?

Welche Technologie hat CCXT für die PHP-Streaming-Bibliothek gewählt? Es gibt viele Lösungen, Reactphp, Amphp, Ratchet ... können wir ein paar Erkenntnisse darüber gewinnen, welche Lösung für die Verwendung mit CCXT-Streams bevorzugt wurde/wird? Konnten Sie einige Benchmarks durchführen, um festzustellen, welche Lösung am besten zu dieser Art von Tool passt? Und was ist mit der Serverseite, müssten wir einen bestimmten Prozess/Daemon in einer anderen Sprache erstellen, um den Stream zu verarbeiten, wenn er auf den WS-Server übertragen wird?

@AadaEa

Werden wir vor dem Kauf des Produkts Zugriff auf das CCXT Pro-Handbuch haben, um alle Feinheiten von CCXT Pro zu verstehen?

Jawohl. Wir machen sie so weit wie möglich nahtlos kompatibel, daher kann sich herausstellen, dass der größte Teil des Handbuchs bereits vorhanden ist ))

oder vielleicht wird es in das Basishandbuch aufgenommen?

Auch das ist möglich, ja.

Welche Technologie hat CCXT für die PHP-Streaming-Bibliothek gewählt? Es gibt viele Lösungen, Reactphp, Amphp, Ratchet ...

Für PHP verwenden wir einige Komponenten von Ratchet und einige Teile von Reactphp.

Können wir ein paar Erkenntnisse darüber gewinnen, welche Lösung für die Verwendung mit CCXT-Streams bevorzugt wurde/wird?

Idealerweise möchten Sie anstelle dieses Kommentars einen Link zum CCXT Pro-Handbuch – das würde natürlich alle Ihre Fragen beantworten ) Allerdings kann ich im Moment nicht viel sagen, wir werden weitere Updates auf dem Weg (in Zeitrahmen) veröffentlichen oben erwähnt).

Konnten Sie einige Benchmarks durchführen, um festzustellen, welche Lösung am besten zu dieser Art von Tool passt?

Ja, wir haben recherchiert) Wenn ein Teil davon zu einem Engpass wird, werden wir ihn optimieren.

Und was ist mit der Serverseite, müssten wir einen bestimmten Prozess/Daemon in einer anderen Sprache erstellen, um den Stream zu verarbeiten, wenn er auf den WS-Server übertragen wird?

Sowohl CCXT als auch CCXT Pro sind clientseitige Tools, was bedeutet, dass der Client CCXT und/oder CCXT Pro verwendet, um eine Verbindung zu den REST-APIs der Börsen oder zu ihren WS-Servern herzustellen. CCXT kann von einem Browser, von der Befehlszeile, von Node, Python oder PHP gestartet werden, es kann als Skript geplant werden, kann innerhalb eines Webservers ausgeführt werden, und Ihr Server kann auch ein Client für Exchanges sein. Es hängt also davon ab, wie Sie Ihre Dinge einrichten und wie sie sich zueinander verhalten. CCXT Pro wird keinen WS-Server enthalten.

Wenn Sie einen Datenstrom von einer Börse zu Ihrem Server empfangen und an Ihre Clients weiterleiten möchten, handelt es sich im Grunde um einen Multiplexing-Proxy. Dafür würden Sie CCXT auf Ihrem Server verwenden, um die Daten abzurufen, und Sie würden sie dann je nach den Anforderungen Ihrer Anwendung, Ihres Projekts oder Systems mit Userland-Code an Ihre Clients streamen. Das Bereitstellen von Websockets liegt derzeit außerhalb unseres Aufgabenbereichs. CCXT Pro ist als effizienter Client ( ccxt-connects-to-exchanges ) konzipiert, um Daten von den Börsen zu empfangen und Daten über Streaming-Kanäle an die Börsen zu senden, aber es ist nicht dafür ausgelegt, als eigenständiger Streaming-Server zu dienen Vielzahl anderer Clients (kein clients-connecting-to-ccxt ). Ihre Clients können sich mit Ihrem Server verbinden, aber der Umgang mit ihnen geht über die Zwecke von CCXT Pro hinaus. Wenn Sie also diese spezifische Verwendung meinen, ja, dann müssen Sie möglicherweise einige Funktionen mit den vorhandenen npm-Modulen oder mit Ihrem eigenen Code hinzufügen, um ein WS-Multiplexing-Intermediary-Proxy-Server für Ihre Clients zu sein.

Wenn Sie jedoch meinen, allgemeinen Code zu starten, der CCXT Pro auf einem beliebigen Server oder Computer verwendet, auf dem er gestartet wird – dann ja, er ist so konzipiert, dass er von überall aus funktioniert, genau wie CCXT. Gemäß unseren grundlegenden Portabilitätsprinzipien müssen Sie nicht in anderen Sprachen codieren, um CCXT Pro-Streaming in PHP auf Ihrer Serverseite zu verwenden. Sie werden nur PHP verwenden. Oder Knoten. Oder Python. Es ist besser für Sie, wenn Sie mehr als eine Programmiersprache beherrschen, aber Sie müssen nicht mehr als eine Sprache beherrschen, um CCXT Pro in vollem Umfang nutzen zu können.

Wir hatten eine andere Definition oder ich war nicht klar, was ich "Serverseite" nenne, war tatsächlich ein gehosteter Server, auf dem eine Kopie der CCXT-Bibliothek über PHP läuft, die Daten sammelt und eine Reihe von Anweisungen mit Cron-Jobs ausführt, was auch möglich ist ein Client aus einer anderen Sicht aufgerufen werden :P Nicht sehen, die Verwendung eines Multiplexing-Proxy.

Was ich mir schwer vorstellen konnte, war, wie CCXT ein permanent geöffnetes Skript haben würde, das es PHP ermöglicht, Daten in Echtzeit zu interpretieren und Anweisungen basierend auf der Eingabe auszuführen, und das keine Lecks oder Abstürze erzeugt; vielleicht durch den Einsatz von Supervisor. Was das richtige Verhalten durch Ratsche erreichen würde. Die effiziente Handhabung dieser Art von Echtzeitprozessen kann schnell recht komplex werden und erfordert Kenntnisse auf Betriebssystemebene.

Ich kann es kaum erwarten, mehr darüber zu erfahren!

Ich bin Entwickler und betreibe ein Ein-Personen-Startup, das kommerzielle Trading-Bots herstellt, die natürlich CCXT (in NodeJS) verwenden. Bisher musste ich andere Bibliotheken zum Streamen verwenden, und für jede Börse gibt es eine andere. Ich würde gerne CCXT-Streaming nutzen können, aber das hängt vom Preis ab. Ich habe Problemumgehungen (die anderen Bibliotheken oder das Schreiben selbst), aber sie haben auch Kosten. Ich bin nicht dagegen, für den Support zu bezahlen, aber ich bin mir nicht sicher, ob das Pro-Add-on-Modell für mein sehr kleines, aber wachsendes Unternehmen funktionieren wird. Es wird wichtig sein, dass es für mein Unternehmen kosteneffektiv ist, alle Quellen zum Debuggen erhält und die Freiheit hat, es auf einer beliebigen Anzahl von Computern auszuführen, ohne dass die Nutzung gemessen oder anderweitig eingeschränkt wird. Bitte zögern Sie nicht, mich zu kontaktieren, um frühe Pläne zu besprechen, und ich würde gerne Feedback geben und sogar Beta-Tests durchführen.

Hey @kroitor , ich und mein Kollege @Alescontrela sind bereit, bei der Entwicklung zu helfen. Wir betreiben derzeit ein kleines Framework mit der Absicht, genau das Problem zu lösen, für das CCXT Pro entwickelt wurde. CryptoBook (universelle API für Krypto-Austausch sowie WebSocket-Unterstützung). Wir können einige unserer Bemühungen als Entwickler und Tester auf CCXT Pro verteilen, da wir der Meinung sind, dass es lohnender sein könnte, Anstrengungen zu bündeln, als an separaten Projekten zu arbeiten. 👍🏼

Wäre es möglich, gate.io ws api v3 (https://gateio.io/docs/websocket/index.html#depth-subscription) zu implementieren?

@npomfret hoffentlich, ja, wir werden uns darum kümmern, es hinzuzufügen.

Hallo Kroitor,
Vielen Dank für all Ihre Bemühungen.
Können Sie mir bitte mitteilen, wann Websocket-API, Echtzeit-Orderbookfetcher, Kauf- und Verkaufsdetails in Echtzeit hinzugefügt werden?
Ich brauche eine Websocket-Version, ist sie implementiert?
Grüße,

Hallo. Der Kraken-WS-Feed explodiert für einige Märkte mit Cannot read property 'data' of undefined . Versuchen Sie es zum Beispiel mit XTZ/BTC.

Der Fehler liegt in:

_contextGetSymbolData(conxid, event, symbol) {
    return this.websocketContexts[conxid]['events'][event][symbol]['data'];
}

Das Ereignis ob sieht voraussichtlich in etwa so aus:

{ 'XTZ/BTC':
   { subscribed: true,
     subscribing: false,
     data: { depth: '50', limit: 200, ob: [Object], rawData: [Object] },
     params: {} } }

Aber nach ein paar Sekunden (oder manchmal sofort) erhält es so etwas:

{ 'XTZ/BTC':
   { subscribed: false,
     subscribing: true,
     data: { 'sub-nonces': [Object], limit: undefined, depth: 1000 } } }

Ich kann den genauen JSON nicht ausdrucken, weil hier irgendwo eine kreisförmige Struktur ist.

Mein Code funktioniert mit anderen Märkten (z. B. XTZ/ETH). Ich abonniere nicht zweimal oder wieder abonniere, abonniere mehrere Märkte oder ähnliches.

@npomfret verwendest du iferns Fork? Es hat viele Fehler, die wahrscheinlich nicht behoben werden, da ein weiterer Websocket-Fork entwickelt wird

Benutzt du Iferns Fork?

Ich bin ja.

Ein weiterer Websocket-Fork wird entwickelt

OK! Danke

Wie ist der Status auf ccxt pro? wann wird mit der Freigabe gerechnet?

@xCuri0 es befindet sich in sehr aktiver Entwicklung und wir werden innerhalb von ein oder zwei Wochen eine eigenständige Ankündigung veröffentlichen. Die Veröffentlichung ist für Q3, diesen September, geplant.

@kroitor Welche Börsen werden bei der Veröffentlichung unterstützt? Werden wir in der Lage sein, weitere Austausche beizutragen und hinzuzufügen?

@xCuri0

@kroitor Welche Börsen werden bei der Veröffentlichung unterstützt?

Wir werden weitere Details in den kommenden Ankündigungen veröffentlichen. Viele von ihnen werden verfügbar sein, wir werden die wichtigsten Börsen nach Volumen und Reputation priorisieren.

Werden wir in der Lage sein, weitere Austausche beizutragen und hinzuzufügen?

Ja, siehe diesen Kommentar: https://github.com/ccxt/ccxt/issues/56#issuecomment -508280756

Ich warte auch auf die Ankündigung über die "Pro" (kostenpflichtige) Version. 15 Tage sind vergangen, gib uns bitte mehr Infos ;-D Wenn der Preis stimmt, werde ich die Pro-Version kaufen, sobald sie veröffentlicht wird.

@kroitor Update zum Status von ccxt pro?

@Teneon

Ich warte auch auf die Ankündigung über die "Pro" (kostenpflichtige) Version. 15 Tage sind vergangen, gib uns bitte mehr Infos ;-D Wenn der Preis stimmt, werde ich die Pro-Version kaufen, sobald sie veröffentlicht wird.

Ich kann im Moment nicht das vollständige Preisraster offenlegen. Wie oben erwähnt, ist der einfachste Plan jedoch mit einem monatlichen Kabelfernsehabonnement vergleichbar, das etwa 20 bis 25 US-Dollar kostet. Frühbuchern bieten wir außerdem einen Rabatt von etwa einem Viertel des Preises an, der auf 15-20 $ pro Monat reduziert wird. Top-Beitragende erhalten eine kostenlose CCXT bRO-Lizenz.

Was Sie erhalten:

  • Streamen
  • Zugriff auf den Quellcode
  • Fehlerbehebungen, Updates und Support
  • neue Börsen (schnellere Integrationen)
  • neue Funktionalität

@xCuri0

@kroitor Update zum Status von ccxt pro?

An diesem Punkt haben wir die Arbeit am Lizenzierungssubsystem abgeschlossen, das auf GitHub-Repositories operiert. Diese Komponente war geschäftskritisch, da der Quellcode von CCXT Pro den Lizenznehmern zur Verfügung stehen wird und wir bis zu einem gewissen Grad Schutz der geistigen Rechte anstreben. Der Plan war, CCXT Pro diesen Monat herauszubringen. Wir sind immer noch mit einigen Teilen des Kerncodes beschäftigt, aber die meiste harte Arbeit ist getan. Sie haben vielleicht bemerkt, dass die Häufigkeit der Aktualisierungen dieses MIT CCXT-Repos in letzter Zeit abgenommen hat, das hängt direkt damit zusammen, da wir jetzt die meiste Zeit damit verbringen, CCXT Pro zu veröffentlichen, hat dies unsere oberste Priorität. Wir hoffen, die Veröffentlichung in ungefähr 4 Wochen ankündigen zu können, und ich werde weitere Details zu unseren Fortschritten veröffentlichen, je näher wir dem Ziel kommen.

Danke!

@kroitor , wird das neue WS-Framework "Handelsereignisse" bereitstellen?

@maayank , es wird keine Ereignisse geben, nur aufgelöste Versprechen. In js und python rufen Sie also ein binance.fetchWsTicker und es wird ein Promise / Future zurückgegeben, das abgeschlossen wird, sobald die Nachricht eingetroffen ist. Aus der Sicht des Benutzers wird es also nahtlos mit dem Rest von ccxt zusammenarbeiten. einfach await binance.fetchWsTicker(symbol, etc) . In PHP werden wir Rückrufe verwenden, aber der abgeleitete Austauschcode bleibt transpilierbar dank einer cleveren Codierung durch das ccxt-Entwicklerteam ;)

kurz gesagt, ja.

@kroitor Was ist mit den Preisen für Studenten? Von obiger Nachricht haben Sie gesagt, dass Sie freien Zugang zu Ihrer Bibliothek gewähren werden. Wie validieren Sie Studenten?

@frosty00 Was ist, wenn Sie Ereignisse verwenden möchten? Ich denke, ccxt pro sollte Unterstützung für sie hinzufügen

@xCuri0 basiert auf ähnlichen Prinzipien wie Generatoren und ist, einfach ausgedrückt, funktional eine Obermenge, die das Ereignismodell abdeckt, mit anderen Worten, es ist in seinem Kern flexibel genug. Wenn Sie also Ereignisse wünschen, können Sie ganz einfach einen ereignisähnlichen Wrapper erstellen, und wir werden wahrscheinlich einige Beispiele für die Verwendung als Schnittstelle im Callback-Stil hinzufügen.

Wird die CCXT Pro-Version Echtzeit-Preisdaten haben? oder nur Orderbücher und Salden. Benötige es für eine App, an der ich arbeite, und würde Websockets gegenüber Polling bevorzugen.
So etwas wie ccxws , nur mehr Austausch unterstützt.

@amitkukadia

Wird die CCXT Pro-Version Echtzeit-Preisdaten haben? oder nur Orderbücher und Salden.

Können Sie auflisten, welche Informationen Sie meinen, wenn Sie _"Preisdaten"_ sagen?
Im Allgemeinen wird CCXT Pro so viele Arten von Streams wie möglich unterstützen, einschließlich:

  • Ticker
  • Auftragsbücher
  • öffentliche Trades (Fills)
  • andere öffentliche Streams, falls vorhanden
  • Kontoaktualisierungen
  • Balance-Updates
  • private Gewerbe
  • Bestellaktualisierungen
  • andere private Streams, falls vorhanden
  • ...

OHLCV und Handelsabfüllungen. Scheint abgedeckt zu sein. Danke @kroitor .

Hallo @kroitor ,
Gibt es Neuigkeiten zu CCXT Pro? Der September neigt sich dem Ende zu. Es wäre in Ordnung, auch wenn es sich um eine Beta-Version handelt. Wir würden gerne die API und einige Dokumente sehen, damit wir mit dem Experimentieren und Implementieren beginnen können. Es muss nicht von Anfang an perfekt sein? Aktualisieren Sie uns zumindest alle paar Tage mit Informationen, das ist viel besser als Schweigen.

Mit freundlichen Grüße!

Es wird keine Ereignisse geben, nur eingelöste Versprechen. In js und python rufen Sie also ein binance.fetchWsTicker und es wird ein Promise / Future zurückgegeben, das abgeschlossen wird, sobald die Nachricht eingetroffen ist.

@frosty00 Wird es möglich sein, einen Ticker zu abonnieren oder für ein Anlagepaar oder alle Paare zu handeln?
etwas wie

binance.on('trade', data =>{
    console.log(data)      
})

Irgendwelche Updates zu CCXT Pro im Oktober? @kroitor

@amitkukadia , dieses Websocket-Beispiel ist nicht Teil der zukünftigen Implementierung von ccxt pro. Aber es wäre schön, wenn ccxt pro diese Funktion implementieren würde.

@lfern wir werden diese Funktion auf jeden Fall implementieren und eine Demo mehrerer Börsenauftragsbücher auf der ccxt pro-Website hosten. Aus irgendeinem Grund umgeht Websocket die Same-Origin-Richtlinie in den meisten Browsern, die xss-Angriffe stoppen soll, so viel zur Browsersicherheit ...

@xCuri0 es kommt bald; Wir arbeiten daran. Ich würde schätzen, dass es im nächsten Monat veröffentlicht werden könnte, dies hängt jedoch von vielen Faktoren ab, sodass wir kein genaues Veröffentlichungsdatum nennen können.

@amitkukadia Ja, es wird möglich sein, Ticker und Trades zu abonnieren (das ist eines der Hauptverkaufsargumente)

@frosty00 Das hört sich toll an!
Haben Sie bereits eine spezielle Website für CCXT pro?

Ich habe https://developers.shrimpy.io verwendet, ihr WS war für 16 Austausche kostenlos, aber jetzt verlangen sie 350+/Monat dafür, wenn Sie 100 Münzen (6 pro Austausch) abonnieren, ist das viel zu viel MEINER BESCHEIDENEN MEINUNG NACH.

Bei Shrimpy musste ich die Buchaktualisierungen verfolgen und kündigen und neu abonnieren, wenn ich eine Sequenz verpasste, das war ziemlich unpraktisch. Werden Sie es ähnlich handhaben oder automatisieren, sodass die Software wie jede Minute einen Buchschnappschuss generiert/anfordert?

Werden Sie es ähnlich handhaben oder automatisieren, sodass die Software wie jede Minute einen Buchschnappschuss generiert/anfordert?

Der gesamte Prozess wird automatisiert, sodass Sie keine Orderbuch-Deltas oder -Updates handhaben müssen, sondern nur das neueste gesamte Orderbuch-Objekt. Wir stellen auch sicher, dass beim Umgang mit inkrementellen Daten keine Sequenzen oder Nonces übersprungen werden.

Unterstützt der Ifern-Fork Binance-Orderbuchparameter (https://www.binance.com/en/support/articles/360032916632), mit denen Tiefe und Häufigkeit angegeben werden können?

@npomfret Ich habe es gerade hinzugefügt. Scheint zu funktionieren, müsste aber getestet werden.
Dieses Beispiel zum Testen eines teilweisen Orderbuchs;

node examples/js/websocket-playground.js binance partob ETH/BTC obdepth:20 obinterval:100ms

Und dieses für 100 ms Orderboo-Intervall

node examples/js/websocket-playground.js binance ob ETH/BTC obinterval:100ms limit:5

Unterstützt der Ifern-Fork Binance-Orderbuchparameter (https://www.binance.com/en/support/articles/360032916632), mit denen Tiefe und Häufigkeit angegeben werden können?

Wir gehen davon aus, dass einige Leute dagegen sein werden, CCXT Pro zu einem kommerziellen Projekt zu machen, und wir sind an Ihrer Meinung interessiert

Ich bin von diesen Leuten 😄
Ich werde meine Meinung veröffentlichen, solange Sie daran interessiert sind, zuzuhören
Ich bezahle, wenn ich durch die Integration der Bibliothek Gewinn erziele – was ist, wenn mein Projekt noch eine Idee oder Beta ist
Ich werde jetzt kein Geld generieren - warum also bezahlen?
Wie wäre es mit einer kostenlosen Testversion mit langer Zeit, 6 Monate oder Jahr?
um sicherzustellen, dass die Person, die den Code kauft, sich genug Zeit nimmt, um ihr Projekt zu entwickeln und zu veröffentlichen, bevor sie Geld generiert und bezahlt.

Wie wäre es mit einer kostenlosen Testversion mit langer Zeit, 6 Monate oder Jahr?
um sicherzustellen, dass die Person, die den Code kauft, sich genug Zeit nimmt, um ihr Projekt zu entwickeln und zu veröffentlichen, bevor sie Geld generiert und bezahlt.

Sie übersehen einen "ziemlich wichtigen" Punkt. Es gibt Menschen, die hart daran arbeiten, diese großartige Bibliothek zu entwickeln und zu teilen, und sie sollten für ihre Arbeit bezahlt werden. CCXT ist eine großartige Bibliothek, sie ist live, wird gepflegt und ist für uns alle kostenlos. Ich denke, Sie können CCXT Pro als nächsten Schritt ansehen, und es wird wahrscheinlich ein Benutzerhandbuch geben, auf das Sie kostenlos zugreifen können, um Ihr Projekt zu entwickeln. Wenn Sie CCXT verwenden, vertrauen und mögen, wissen Sie, was Sie von CCXT Pro erwarten können. Die Gebühr/Kosten, die Sie zahlen müssen, sind ein anderes Thema, und es liegt an Ihnen, abzuschätzen, ob Sie einen ROI und Gewinne erzielen können.

Ich zahle, wenn ich durch die Einbindung der Bibliothek Gewinn erziele

Ein noch besserer Ansatz wäre, einfach nach den Gewinnen zu fragen, die Sie haben möchten ...

Ein noch besserer Ansatz wäre, einfach nach den Gewinnen zu fragen, die Sie haben möchten ...

Ich verstehe Sie und ich kann es mir möglicherweise nicht leisten, zu zahlen, bevor ich Geld generiert habe.
jedoch kein Problem - ich habe eine andere Bibliothek gefunden, die ich mit CCXT verwenden kann.

Ich denke, das wird eine gute Mischung

Ich schätze diese Open-Source-Projekte sehr und möchte sie unterstützen, sei es mit einem finanziellen Beitrag oder mit einer anderen Form des Beitrags.

Einfach gesagt, mein Projekt wird ohne diese Open-Source-Projekte nicht live und nutzbar sein.
Vielleicht fehlt mir einfach das Budget :blush:

@frodoe7 Welche Bibliothek verwendest du? shrimpy.com bietet jetzt 19/Monat-Pläne für 17 Austausch-Websockets an, die alle Kanäle streamen. Ich denke also, dass der ccxt pro einen ähnlichen Preis haben könnte. Shrimpy ist einfach nicht so bequem zu integrieren, Sie müssen verpasste Orderbuchaktualisierungen nachverfolgen, und außerdem gibt es ein Abonnementlimit pro Client, also müssen Sie umfangreiche Logik schreiben, um damit umzugehen, und Abonnements auf verschiedene IPs verteilen.

@KlausGlueckert , Nicht Shrimpy
dieses: https://www.npmjs.com/package/ccxws
es unterstützt weniger Austausch, aber das ist für mich zunächst in Ordnung

Ich verstehe Sie und ich kann es mir möglicherweise nicht leisten, zu zahlen, bevor ich Geld generiert habe.
jedoch kein Problem - ich habe eine andere Bibliothek gefunden, die ich mit CCXT verwenden kann.

@frodoe7 Ich habe keine Ahnung, was Ihr Projekt ist, und was ich unten schreibe, ist vielleicht eine Verschwendung Ihrer Zeit zum Lesen oder sogar ein Off-Topic, aber ich schreibe es mit aller Güte im Herzen, und es ist, was ich habe über mehrere Jahre gelernt.

Jede Börse ist ein anderes „Tier“, mit ihrem eigenen Gebührenplan, unterschiedlicher Genauigkeit für jede Währung und jedes Paar, unterschiedlichen Mindest- und Höchstbeträgen sowie unterschiedlichen Händlern mit ihrer eigenen (manchmal kollektiven) Mentalität und unterschiedlichen täglichen Volumina für jedes Paar , usw. usw. Und selbst wenn Sie wissen, wie eine Börse "funktioniert", und Sie damit tatsächlich Geld verdienen können, erwarten Sie, dass sich all dies ändert. Ich habe es oft gesehen. Ein stets aktuelles Auftragsbuch zu haben, ist nicht wirklich wichtig, da es nicht garantiert, dass Ihre Aufträge so ausgeführt werden, wie Sie es erwarten. Wir sind nicht die Einzigen, die die richtigen Orders „verbrauchen“... Außerdem garantiert eine solide Anwendungslogik nicht, dass es die richtige Logik für den Austausch ist, an dem Sie arbeiten. Handel ist Handel; es ist nicht 1+1=2. Es ist ein Rennen gegen andere Händler, die mehr Geld, besseren Code, schnellere Maschinen haben und in schnelleren Netzwerken sitzen. Und dann haben Sie Pumps und Dumps, Sie haben Preise, die steigen, steigen, steigen und dann fallen, fallen und fallen, und alles andere, was Sie sich nicht vorstellen können, wird tatsächlich passieren. Es sei denn natürlich, Sie haben die perfekte Logik für alle Bedingungen und Situationen sowie superschnelle Maschinen, die im Rechenzentrum jeder Börse neben ihren API-Servern stehen. Wenn ja, dann beneide ich dich :)

Wenn Sie kein erfahrener Händler und erfahrener Entwickler für den Handel sind, sollten Sie damit rechnen, Geld zu verlieren, bevor Sie Geld verdienen können. Und selbst wenn Sie mit Ihrem ersten Umtausch sofort anfangen, Geld zu verdienen, stehen die Chancen gut, dass Sie mit dem zweiten verlieren werden. Wenn die Gebühr, die wir für die Pro-Version zahlen müssen, ähnlich der ist, die in früheren Beiträgen erwähnt wurde, ist dies nur ein Bruchteil der anfänglichen Verluste. Vertrau mir.

Nach all dem oben Gesagten schlage ich vor, dass Sie CCXT so verwenden, wie es ist (ohne Websocket-Unterstützung), und wenn die Pro-Version veröffentlicht wird, müssen Sie nur ein paar Anrufe ersetzen. Wenn Sie feststellen, dass Sie bei bestimmten Börsen an die Grenzen stoßen, brauchen Sie keine Websockets.

Nur meine 2c

Nach all dem oben Gesagten schlage ich vor, dass Sie CCXT so verwenden, wie es ist (ohne Websocket-Unterstützung), und wenn die Pro-Version veröffentlicht wird, müssen Sie nur ein paar Anrufe ersetzen. Wenn Sie feststellen, dass Sie bei bestimmten Börsen an die Grenzen stoßen, brauchen Sie keine Websockets.

In meinem Projekt gibt es bereits ein Problem, und es ist jetzt zwingend erforderlich, Websocket zu verwenden. Ich kann sogar die Veröffentlichung von CCXT Pro kaum erwarten

@lfern danke für die Binance-Verbesserungen, probiere sie jetzt aus - sieht toll aus.

@lfern hast du schon darüber nachgedacht, einen RBTree anstelle eines Arrays zum Speichern der Daten zu verwenden? Ich probiere es bei meinem Projekt aus und es ist gut gelaufen. Es ist ziemlich einfach zu implementieren und ich nehme an, dass es effizienter ist als die Verwendung eines Arrays (aber ich habe die Theorie nicht getestet). Gerne teile ich meinen Code öffentlich, wenn Sie interessiert sind.

@npomfret Während ich auf die offizielle Websocket-Implementierung warte, werde ich natürlich versuchen, es im Websocket-Multiple-Zweig zu ändern, wenn es wirklich einfach ist.

@lfern schau dir das an: https://gist.github.com/npomfret/a52fab1144090204425f984ea132e45e

Ich kann nicht versprechen, dass der RBTree schneller ist, aber ich vermute, dass er es ist.

@npomfret das sieht ziemlich interessant aus. Wir verwenden TreeMap für jede Seite des Buches mit einem benutzerdefinierten Sortierer. Ich bin mit RBTree nicht so vertraut, aber ich frage mich, warum Sie es über TreeMap verwenden würden? Ich kann aus Erfahrung sagen, dass die Verwendung der TreeMap eine viel bessere Option war als Arrays für ein Live-Orderbuch während starker Preisbewegungen

Ah, sorry, ich dachte, Sie würden immer noch Arrays verwenden, habe den Code eine Weile nicht gelesen. Ich weiß nicht, wie effizient TreeMap ist, fürchte ich. Ein rot/schwarzer Baum hat ein gut verstandenes Leistungsprofil ( O log (n) für Suchen und Löschen), vielleicht ist TreeMap dasselbe.

Ein RBTree ist sehr einfach, ich habe eine NPM-Klasse verwendet, aber Sie könnten es in 10 Minuten selbst schreiben, da bin ich mir sicher.

[Bearbeiten] Ha, es ist dasselbe - die Leistung wird ganz unten in den Dokumenten erwähnt. Also sinnlos wechseln.

@lfern hast du schon darüber nachgedacht, einen RBTree anstelle eines Arrays zum Speichern der Daten zu verwenden?

Warum sollten Sie dies verwenden, anstatt eine normale Hashmap zu verwenden, die nach Preisen indiziert ist, die O (1) ist? Das Speichern und Abrufen von Daten aus einem Binärbaum ist mindestens log (N) asymptotisch, daher ist es nicht wirklich sinnvoll - https://docs.google.com/presentation/d/1FVENq6nVfWEHohE8j3oQC6uutxWOghacBfJixFV3KQU/edit#slide =id. g5240c8ba42_0_1460

@ frosty00 Ich bin kein Experte für Datenstrukturen (mir fehlt die formelle Ausbildung und ich muss beschämt zugeben, dass ich nie richtig darüber recherchiert habe), also korrigieren Sie mich bitte, wenn ich falsch liege.

Für das, was ich online gesehen habe, sind Hashmaps in der Regel besser für das Einfügen/Aktualisieren/Löschen einzelner Elemente, während selbstausgleichende Bäume eine bessere Leistung für das Iterieren über Bereiche aufweisen. Basierend darauf würde ich sagen, dass die Entscheidung für das eine oder andere von Ihrem Lese-Anwendungsfall abhängen würde (in unserem Fall holen wir immer das oberste X nach jedem Einfügen/Aktualisieren/Löschen, daher ist ein RBTree sinnvoller).

Auf der anderen Seite würden Hashmaps normalerweise auf der Grundlage des Hash-Buckets funktionieren, aber dies ist anfällig für Geschwindigkeitsverluste, wenn in einem einzelnen Bucket hohe Konzentrationen vorhanden sind, während andere Buckets zu wenige Elemente enthalten.

@lfern (oder @frosty00 ?) Lange Zeit kein Update von meiner Seite, ich habe versucht, den aktuellen Stand von lferns websockets-multiple -Zweig zu transpilieren. Ich erhalte viele Fehler in Python, wenn ich ob_updater.py in meinem https://github.com/firepol/ccxt-websockets-db-updater-Projekt ausführe... Ich habe versucht, einige davon manuell zu beheben (siehe letzte Commits im Dev-Zweig meines anderen Repos, wo ich normalerweise die transpilierten Dateien committe: https://github.com/firepol/ccxt-websockets/tree/dev), um zu sehen, ob ich mein Programm zum Laufen bekomme, aber am Ende dort ist immer ein weiterer Syntaxfehler, der auftaucht. Hier die Syntaxfehler, die ich bekommen habe und wie ich sie behoben habe:

Datei "\venv\lib\site-packagesccxt\kucoin.py", Zeile 1623
lastSeqId++
^
SyntaxError: Ungültige Syntax

Lösung : Suchen Sie alle „++“ und ersetzen Sie sie durch „+= 1“

Datei "..,\venv\lib\site-packagesccxt\poloniex.py", Zeile 1301
anders:
^
IndentationError: einen eingerückten Block erwartet

Lösung : ein Kommentar reicht für Python nicht, in Python füge ich zB "pass" hinzu, verwende idealerweise kein leeres elif oder sonst einen Block, sondern setze einen Kommentar davor oder danach... wenn du wirklich einen leeren Block brauchst, deklariere eine Dummy-Variable wie foo = 'foo' oder so ...

Datei "...\venv\lib\site-packagesccxtasync_support\baseexchange.py", Zeile 1059
Antwort = warte auf getattr(this_param, method)(*params)
^
SyntaxError: „await“ außerhalb der asynchronen Funktion

Lösung : keine Ahnung ... du musst eine Lösung dafür finden ...

Danke

Leute, bitte legt ein Veröffentlichungsdatum für CCXT Pro fest und veröffentlicht es dann zu einem bestimmten Datum, was auch immer ihr habt, es wird mit Sicherheit immer einige Fehler von Anfang an geben, aber lasst uns das später erledigen, wir müssen anfangen zu implementieren und zu experimentieren, auch wenn es nicht von Anfang an perfekt ist! Falls die Veröffentlichung von "ccxt pro" ins Jahr 2020 verschoben wird, sagen Sie es bitte! Wir sollten dann vielleicht das Paket "ccxws" zwischenzeitlich in unser Projekt einbauen. Aber wenn "ccxt pro" um die Ecke steht, habe ich keine Lust, "ccxws" nur für ein oder zwei Wochen zu implementieren und dann "ccxt pro" neu zu implementieren. Also bitte, es ist wichtig für uns und wahrscheinlich alle anderen, damit wir vorausplanen können.

Leute, bitte legt ein Veröffentlichungsdatum für CCXT Pro fest und veröffentlicht es dann zu einem bestimmten Datum, was auch immer ihr habt, es wird mit Sicherheit immer einige Fehler von Anfang an geben, aber lasst uns das später erledigen, wir müssen anfangen zu implementieren und zu experimentieren, auch wenn es nicht von Anfang an perfekt ist!

Wir stimmen Ihnen voll und ganz zu und es ist unsere höchste Priorität, seit wir es angekündigt haben.

Falls die Veröffentlichung von "ccxt pro" ins Jahr 2020 verschoben wird, sagen Sie es bitte!

Wir sind entschlossen, es nicht ins Jahr 2020 verschieben zu lassen, und jetzt sind wir uns ziemlich sicher, dass dies nicht der Fall sein wird. Von hier aus kann es 2 bis 4 Wochen dauern, bis die erste Version bereitgestellt wird, wenn nichts anderes auftaucht. Aber wie auch immer, es wird noch vor Ende dieses Jahres veröffentlicht.

Aber wenn "ccxt pro" um die Ecke steht, habe ich keine Lust, "ccxws" nur für ein oder zwei Wochen zu implementieren und dann "ccxt pro" neu zu implementieren.

Es steht vor der Tür und wir arbeiten sehr hart daran, es so schnell wie möglich zu liefern, ernsthaft. Wir können das genaue Datum nicht sagen, da wir möglicherweise früher liefern können. Es wird jedoch sofort veröffentlicht, wenn es fertig ist. Wenn Sie dennoch das genaue Datum wünschen, gehen Sie von „vor Ende 2019“ aus.

@firepol Ich glaube, ich habe alle Python-Fehler behoben, die Sie im Zweig websockets-multiple gemeldet haben. Bitte überprüfen Sie es

@kroitor Haben Sie Informationen zur Lizenzierung und zum Gebührenplan, die Sie teilen können, bevor Pro veröffentlicht wird?

@WoK-E haben wir zu diesem Thema hier gepostet:

Wir werden Sie vor der Veröffentlichung über das Preisraster auf dem Laufenden halten, sobald wir es haben (unser Ziel ist es, in erster Linie ein gutes und flexibles technisches Design für die Benutzer einzuführen).

@kroitor wird CCXT pro ordnungsgemäße Behandlung von Diff-Orderbook-Nachrichten haben, die außerhalb der Reihenfolge eintreffen?

EDIT: Ignorieren Sie diese Frage. Ich habe gerade deinen Beitrag oben gesehen. Danke.

@frodoe7 Sie können immer selbst Web-Sockets für ein oder zwei Austausche implementieren, während Sie abwarten, ob es sich lohnt, für CCXT Pro zu bezahlen. Ich habe genau das getan, während ich darauf warte, dass es veröffentlicht wird, und es ist wirklich nicht so schwierig. Ich habe öffentliche (Orderbücher) und private (meine Trades und Orders) WS-Feeds, die für 6 Börsen arbeiten, und ich kann nicht sagen, dass eine davon besonders schwierig war.

Irgendwelche Informationen darüber, wann CCXT Pro veröffentlicht wird? Der 01.01.2020 rückt näher!

@n01ukn0w Wir sind jetzt näher als je zuvor an der endgültigen Veröffentlichung und werden in Kürze den Beta-Test ankündigen.

@n01ukn0w Wir sind jetzt näher als je zuvor an der endgültigen Veröffentlichung und werden in Kürze den Beta-Test ankündigen.

So aufregend, dass ich diesem Thema seit Monaten viel Aufmerksamkeit schenke und mich darauf freue, das Pro zum allerersten Mal auszuprobieren.

Es wäre schön, Ausschnitte von Verwendungen für verschiedene JS-Frameworks zu haben, insbesondere für Angular/Typescript.
Wenn es mit Dingen wie Nativescript umgehen kann, wäre das großartig! Obwohl nach meinen letzten Tests die ws npm-Bibliothek nicht gut mit NS spielt. Sie fragen sich, was für das Streaming unter der Haube verwendet wird?

@kroitor : auch so aufgeregt und vielen Dank für die ganze Arbeit!!! ein paar fragen vorab:

  • Wird es von Anfang an einen Python-Wrapper geben?
  • Wird ccxt pro Auftragsbuchsequenzen automatisch handhaben? (keine manuelle Verbindung, Wiederverbindungslogik usw.)
  • Wird ccxt pro automatisch aktuelle Auftragsbücher im Speicher handhaben? Einige Börsen bieten nur REST-API-Orderbuch-Snapshots, sodass Sie Ihre eigene Logik erstellen müssen, um die REST-Snapshots zu erstellen und sie mit den Websocket-Orderbuch-Updates zu aktualisieren :(
  • Wenn Sie Input oder Feedback benötigen, lassen Sie es mich wissen, ich habe vor kurzem shrimpy.io integriert, und es löst einfach nicht alle Probleme, die ein Entwickler hat, ccxt pro könnte so viel besser sein als alles, was atm verfügbar ist

@KlausGlückert

Wird es von Anfang an einen Python-Wrapper geben?

Ja.

Wird ccxt pro Auftragsbuchsequenzen automatisch handhaben? (keine manuelle Verbindung, Wiederverbindungslogik usw.)

Ja, und die anderen Arten von Datenfeeds auch.

Wird ccxt pro automatisch aktuelle Auftragsbücher im Speicher handhaben? Einige Börsen bieten nur REST-API-Orderbuch-Snapshots, sodass Sie Ihre eigene Logik erstellen müssen, um die REST-Snapshots zu erstellen und sie mit den Websocket-Orderbuch-Updates zu aktualisieren :(

Ja, das wird auch gehandhabt.

Wenn Sie Input oder Feedback benötigen, lassen Sie es mich wissen, ich habe vor kurzem shrimpy.io integriert, und es löst einfach nicht alle Probleme, die ein Entwickler hat, ccxt pro könnte so viel besser sein als alles, was atm verfügbar ist

Thx viel für Ihre Unterstützung, werde Sie wissen lassen, wenn überhaupt!

Falls die Veröffentlichung von "ccxt pro" ins Jahr 2020 verschoben wird, sagen Sie es bitte!

Wir sind entschlossen, es nicht ins Jahr 2020 verschieben zu lassen, und jetzt sind wir uns ziemlich sicher, dass dies nicht der Fall sein wird. Von hier aus kann es 2 bis 4 Wochen dauern, bis die erste Version bereitgestellt wird, wenn nichts anderes auftaucht. Aber wie auch immer, es wird noch vor Ende dieses Jahres veröffentlicht.

Aber wenn "ccxt pro" um die Ecke steht, habe ich keine Lust, "ccxws" nur für ein oder zwei Wochen zu implementieren und dann "ccxt pro" neu zu implementieren.

Es steht vor der Tür und wir arbeiten sehr hart daran, es so schnell wie möglich zu liefern, ernsthaft. Wir können das genaue Datum nicht sagen, da wir möglicherweise früher liefern können. Es wird jedoch sofort veröffentlicht, wenn es fertig ist. Wenn Sie dennoch das genaue Datum wünschen, gehen Sie von „vor Ende 2019“ aus.

@kroitor - wie sieht der Release jetzt aus? Ich gehe davon aus, dass es nicht vor 2020 passieren wird, also was ist das nächste Ziel? Halten Sie die Leute besser auf dem Laufenden, auch wenn sich das Ziel bewegt, als überhaupt keine Updates zu haben - in diesem Fall hat man das Gefühl, dass überhaupt nichts passieren wird, da sich Ihre Prioritäten möglicherweise auf etwas anderes geändert haben

@juso die Arbeit daran bewegt sich sehr aktiv auf die Veröffentlichung zu (es ist jetzt eine Frage von Tagen). Wir haben bereits ein funktionierendes transpilierbares Repo und werden Anfang Januar Beta-Tester einladen. Der Mangel an Updates bedeutet nicht, dass sich unsere Prioritäten geändert haben, im Gegenteil – es ist immer noch unsere oberste Priorität und wir sind so damit beschäftigt, dass wir nicht zu oft Updates posten können, außer „fast geschafft“. Ein weiterer Aspekt ist, dass wir ein stabil funktionierendes Produkt herausbringen wollen. Unser aktueller Fortschritt liegt bei 85-90 %. Wir werden in den kommenden Tagen weitere Neuigkeiten veröffentlichen und das Preisraster bekannt geben.

@kroitor wo/wie werden Sie Neuigkeiten zu CCXT Pro und/oder Einladungen für Betatester veröffentlichen? Wird es in diesem Thread sein?

@WoK-E Wir werden einen eigenständigen Ankündigungsthread eröffnen und hier auch Links posten, um alle in dieser Ausgabe zu benachrichtigen.

Frohes Neues Jahr euch allen! Habe gerade ein kleines Update/eine Zwischen-Roadmap für Q1 hier veröffentlicht: https://github.com/ccxt/ccxt/issues/6332. Wir tun alles, was wir können, um es diesen Monat einzuführen.

Wir haben die Saldo-API, wie hier in Ausgabe Nr. 36 beschrieben, vereinheitlicht. Jetzt kann Ihre Feature-Anfrage einfach implementiert werden ) Wir werden zuerst eine Dirty-Balance-Methode hinzufügen, die das Gleichgewicht auf einer Marktinstanz speichern würde. Und wenn wir bereit sind, die Websocket-Implementierungen zu veröffentlichen, werden wir sie natürlich automatisch aktualisieren lassen. Den Kontakt halten! )

Haben Sie durchgeblättert, nachdem Sie das Update über ccxt pro-Pläne gesehen haben, und konnten nicht anders, als diese/Ihre Antwort auf jemanden zu bemerken, der nach dem Abfragen der API in Intervallen gefragt hat? Und ich möchte nur darauf hinweisen, dass Binance einen Websocket-Endpunkt für Handels- und Kontodaten hat. Sie müssen nur den „userData“-Stream abonnieren: https://github.com/binance-exchange/binance-official-api-docs/blob/master/user-data-stream.md

Falls es jemanden interessiert, ich habe dies für meine Binance-Websocket-Anforderungen verwendet. Ich hoffe, Sie finden es genauso hilfreich wie ich: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api /

@HoDaDor genau darum geht es bei CCXT Pro, die WebSockets für das Streaming zu verwenden: https://github.com/ccxt/ccxt/issues/6332#issuecomment -586626802 (heute)

Hallo, liebe CCXT-Benutzer!

Heute bringen wir Ihnen die gute Nachricht.

Wir haben CCXT Pro mit Unterstützung für WebSockets veröffentlicht!
Bitte sehen Sie sich die Ankündigung hier an: #6543

Danke an alle, die so geduldig darauf gewartet haben.
Wie immer wird Ihr Feedback sehr geschätzt!

Endlich schließen wir diese Ausgabe )

Mit freundlichen Grüßen, CCXT-Entwicklerteam

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen