Die Ressourcen sind geladen. Beförderung...

Eine Strategievorlage ermöglicht Ihnen, WebSocket Market nahtlos zu nutzen

Schriftsteller:FMZ~Lydia, Erstellt: 2024-10-30 14:23:04, Aktualisiert: 2024-11-01 10:37:04

img

Dies ist eine von FMZ offiziell entwickelte WebSocket-Marktvorlage.https://www.fmz.com/strategy/470349

Warum brauchen wir WebSocket?

Derzeit basiert die FMZ-Strategie hauptsächlich auf der traditionellen REST-API-Einkapselung. Jeder Schritt des API-Zugriffs erfordert eine Netzwerkverbindung und Marktdaten werden durch Umfragen erhalten. Diese Methode ist einfach und einfach zu bedienen und für die meisten Bedürfnisse vollständig ausreichend.

Das REST-Protokoll hat jedoch ein inhärentes Verzögerungsproblem. Wenn mehrere Handelspare und mehrere Austauschstrategien erforderlich sind, wird das Verzögerungsproblem vergrößert. Obwohl die Go-Funktion der Plattform gleichzeitig ausgeführt werden kann, besteht das Verzögerungsproblem immer noch, was es schwierig macht, die Bedürfnisse des relativ hochfrequenten Strategiehandels zu erfüllen.

Derzeit sind auch die Server der Börsen stark belastet. Sie alle liefern ein komplettes WebSocket-Protokoll und empfehlen es den API-Nutzern. Im Vergleich zum REST-Protokoll bietet WebSocket eine anhaltende Zwei-Wege-Verbindungsmethode, die es den Börsen ermöglicht, Daten in Echtzeit an den Client zu schicken, häufige Anfragen und Antworten zu vermeiden, wodurch die Latenz erheblich reduziert wird. Im Allgemeinen, wenn die Verzögerung beim Zugriff auf die REST-API etwa 20 ms beträgt, beträgt die Verzögerung beim Schieben von Daten durch WebSocket etwa 2 ms. Darüber hinaus ist die Verbindung zum WebSocket-Protokoll nicht durch die Plattformzugangsfrequenz begrenzt und es ist möglich, Dutzende von Handelsparen gleichzeitig zu abonnieren.

Einführung in die WebSocket-Tickervorlage

Die FMZ Quant Trading Plattform unterstützt seit langem das WebSocket-Protokoll, und es ist relativ bequem zu rufen, aber für Anfänger ist es immer noch zu kompliziert, mehrere Abonnements zu verarbeiten, mehrere Exchange-Tickers zu abonnieren und sie effizient und bequem in den gesamten Strategieprozess zu integrieren. Diese öffentliche WebSocket-Echtzeit-Ticker-Datenbeschleunigungsvorlage löst dieses Problem. Sie ist sehr einfach zu bedienen und vollständig kompatibel mit dem aktuellen eingekapselten API-Aufruf. Für die meisten der ursprünglichen REST-Strategien können Sie sie einfach ändern und direkt verwenden, um Ihre Strategie zu beschleunigen.

Hauptmerkmale:

  • Unterstützung für mehrere Börsen: Diese Strategie unterstützt WebSocket-Verbindungen mehrerer Börsen, wie Binance, OKX, Bybit, Bitget usw. Benutzer können die Verpackungsmethode dieser Vorlage befolgen, um selbst mehr Börsen zu unterstützen.
  • Anpassungsfähige Abonnements: Er ermöglicht die Abonnement von spezifischen Marktkanälen (wie Tiefe, Trades usw.) und eine effiziente Verarbeitung der eingegangenen Daten für die sofortige Verwendung in Handelsstrategien.
  • Erweiterte Fehlerbearbeitung: eingebaute Fehlerverfolgung und WebSocket-Wiederanschlussmechanismus zur Gewährleistung der Zuverlässigkeit und Kontinuität des Datenflusses.

Eine kurze Einführung in das Umsetzungsprinzip

Beachten Sie, dass diese Strategie TypeScript verwendet. Wenn Sie nur mit JavaScript vertraut sind, kann es ein wenig seltsam erscheinen. TypeScript führt ein Typensystem und reichere Sprachfunktionen auf Basis von JavaScript ein. Für Anwendungen wie den quantitativen Handel, die komplexe Logik verarbeiten müssen, kann die Verwendung von TypeScript mögliche Fehler reduzieren und die Lesbarkeit und Wartbarkeit des Codes verbessern. Daher wird empfohlen, es kurz zu lernen.

Darüber hinaus nutzt die Strategie den asynchronen Mechanismus der FMZ-Plattform. Der Kinderthread kann Nachrichten über die __threadPostMessage-Funktion an den Hauptthread senden. Diese Methode ist asynchron und eignet sich zur Benachrichtigung des Hauptthreads über Datenaktualisierungen, die im Kinderthread generiert werden. Der Hauptthread und der Kinderthread können Daten über die __threadGetData- und __threadSetData-Funktionen austauschen. Diese Methode ermöglicht Threads den Zugriff auf und die Änderung geteilter Zustände. Wenn Sie über Multithreading in Kombination mit der Plattformdokumentation lernen möchten, ist diese Strategie auch ein gutes Lernbeispiel.

Das Hauptprinzip dieser Strategie besteht darin, sich über WebSocket mit den gängigen digitalen Währungsaustauschen zu verbinden und Marktdaten (z. B. Tiefeninformationen und Transaktionsinformationen) in Echtzeit zu erhalten, um Datenunterstützung für quantitative Handelsentscheidungen zu bieten.

1. WebSocket-VerbindungseinstellungenDie FunktionsetupWebsocketwird verwendet, um eine WebSocket-Verbindung zu initialisieren und Marktdaten zu empfangen.main_exchanges, der die Verbindung anzeigt.

  • MyDial Funktion: Erstellen Sie eine WebSocket-Verbindung, erfassen Sie die Verbindungszeit und geben Sie die Schließzeit beim Schließen der Verbindung an.
  • updateSymbols Funktion: Überprüfen Sie regelmäßig, ob es neue Anträge auf Zeichnung gibt, und aktualisieren Sie die aktuelle Liste der Handelspare, sofern erforderlich.

2. DatenverarbeitungDas Objektsupportsdefiniert die unterstützten Schaltplätze und ihre Verarbeitungsfunktionen (z. B.Binance) Die Verarbeitungsfunktion für jeden Austausch ist für die Parsierung der empfangenen Nachricht und die Extraktion der relevanten Daten verantwortlich.

  • processMsg Funktion: Verarbeitung von Nachrichten aus den Börsen, Identifizierung verschiedener Datentypen (z. B. Tiefenaktualisierungen, Transaktionen usw.) und Formatierung in ein einheitliches Ereignisobjekt.

3. AbonnementdatenBei jeder Verbindung wird das System die relevanten Marktdatenkanäle basierend auf dem aktuellen Handelspaar abonnieren.

  • getFunction Funktion: Erhalten Sie die entsprechende Verarbeitungsfunktion nach dem Tauschnamen.
  • this.wssPublic Funktion: Initialisieren Sie die WebSocket-Verbindung und beginnen Sie, Daten zu empfangen.

4. ThreadmanagementStarten Sie einen Thread für jeden Austausch, empfangen Sie Daten in Echtzeit und verarbeiten Sie die Daten über Rückruffunktionen.

  • threadMarket Funktion: Erhält Daten in einem Kind-Thread, analysiert und speichert die neuesten Tiefen- und Transaktionsinformationen.

5. Die Datenerfassungsmethode neu schreibenUmschreiben der Methoden für die Gewinnung von Tiefen- und Handelsinformationen für jede Börse, wobei Daten, die in Echtzeit aktualisiert werden, vorrangig zurückgegeben werden.

Wie man die Vorlage verwendet

  1. Initialisierung: Verwendung$.setupWebsocket()die WebSocket-Verbindung des Ziel-Austauschs zu initialisieren.
  2. Abonnement: Das System abonniert automatisch relevante Kanäle (wie Tiefe, Handel usw.) für die von Ihnen gehandelten Produkte.
  3. Datenerfassung: Mit der Anrufung derGetDepth()undGetTrades()Funktionen, die Markttiefe und Transaktionsprotokolle werden automatisch mit Hilfe von WebSocket-Echtzeitdaten zurückgegeben.
  4. Fehlerbearbeitung: Die Strategie umfasst einen Tracking-Mechanismus, um Verbindungs- und Datenfehler zu protokollieren, und versucht, sich automatisch wieder zu verbinden, wenn die Verbindung verloren geht.

Wenn die EventLoop() -Funktion in die Strategie aufgenommen wird, wird sie in einen Triggermechanismus umgewandelt. Wenn wss Daten aktualisiert werden, erhält sie automatisch sofort und wartet, wenn es keine neuesten Daten gibt. Sie entspricht einer intelligenten Sleep-Funktion. Natürlich können Sie auch Sleep direkt verwenden.

function main() {
    $.setupWebsocket()
    while (true) {
        exchanges.map(e=>{
            Log(e.GetName(), e.GetDepth())
            Log(e.GetName(), e.GetTrades())
        })
        EventLoop(100) // trigger by websocket
    }
}

Siehe meinen vorherigen Leitfaden für Multi-Währungs-Handelsstrategien:https://www.fmz.com/bbs-topic/10508, die leicht geändert werden kann, um WebSocket zu unterstützen:

function MakeOrder() {
    for (let i in Info.trade_symbols) {
        let symbol = Info.trade_symbols[i];
        let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
        let buy_amount = 50 / buy_price;
        if (Info.position[symbol].value < 2000){
            Trade(symbol, "buy", buy_price, buy_amount, symbol);
        }
    }
}

function OnTick() {
    try {
        UpdatePosition();
        MakeOrder();
        UpdateStatus();
    } catch (error) {
        Log("loop error: " + error);
    }
}

function main() {
    $.setupWebsocket()
    InitInfo();
    while (true) {
        let loop_start_time = Date.now();
        if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
            OnTick();
            Info.time.last_loop_time = Date.now();
            Info.time.loop_delay = Date.now() - loop_start_time;
        }
        Sleep(5);
    }
}

Mehr