[TOC]

Grundlegende Anweisungen

Wie man anfängt

Was kann die FMZ Quant Trading Platform tun?

FMZ Quant Trading Plattform ist die professionellste quantitative Community im Bereich des quantitativen Handels. Hier können Sie quantitative Strategien lernen, schreiben, teilen, kaufen und verkaufen; Sie können Online-Backtesting durchführen und Simulationsbots verwenden, um simulierten Handel durchzuführen; Sie können auch Live-Handel ausführen, veröffentlichen und beobachten. Wir unterstützen fast alle Mainstream-Digitalwährungsaustausch.

Vollständige Reihe von Tutorials

Graphische Tutorials:

Wenn es ein Problem gibt, können Sie jederzeit Fragen stellen und im Forum diskutieren, ein Ticket einreichen oder sich an einen Administrator in der Telegramm-Gruppe wenden (Telegramm), wird die Frage generell schnell beantwortet.

Unterstützung von ChatGPT für Entwicklungshilfe

Die FMZ Quantitative Trading Platform hat ChatGPT als Entwicklungshilfe-Tool übernommen, auf das man klicken kann, indem man ChatGPT in der Abkürzung in der Dashboard klickt, um auf dieSeite des ChatGPT Hilfswerkzeugs.

Welche Programmiersprachen stehen zur Verfügung, um meine Strategien umzusetzen?

FMZ Quant Trading-Plattform unterstützt die NutzungJavaScript, TypeScript, Python, C++, Pine MylanguageundBlockly VisualizationStrategieentwurf zu schreiben.

Es unterstütztTypeScriptSprache, setzen Sie es noch aufJavaScriptStrategie, wenn wir Strategien erstellen, dann schreiben wir// @ts-checkam Anfang des Strategiecodes oder klicken Sie auf die SchaltflächeTypeScriptin der oberen rechten Ecke des Strategiebearbeitungsbereichs umzuschaltenTypeScriptDie Plattform erkennt den Code alsTypeScriptautomatisch und bieten Ihnen die entsprechende Kompilierungs- und Typprüfungshilfe für:

  • Typsicherheit:TypeScriptDie statische Typprüfung kann Ihnen helfen, mögliche Fehler beim Schreiben von Code zu finden und die Codequalität zu verbessern.
  • Automatische Codeausfüllung:TypeScriptDas Typensystem von Microsoft macht es schneller, die Attribute und Methoden zu finden, die Sie beim Schreiben von Code benötigen, wodurch die Entwicklungseffizienz verbessert wird.
  • Klarere Codestruktur: mitTypeScript, können Sie Ihren Code besser organisieren und pflegen, so dass er leicht zu lesen und zu verstehen ist.
  • Leistungsstarke objektorientierte Programmierfunktionen:TypeScriptbietet leistungsstarke objektorientierte Programmierfunktionen, wie Schnittstellen, Klassen, Generics und so weiter, die Ihnen helfen, robusteren und wiederverwendbareren Strategiecode zu schreiben.

Sie müssen nur eine dieser Sprachen beherrschen. Zusätzlich zur Unterstützung der Art und Weise, Strategien zu entwerfen, indem Sie Code schreiben, können Sie auch Strategien mit visuellen Modulen (Blockly) erstellen.

BlocklyVisualisierungstutorials:

SetzenPythonÜbersetzer, der vomPythonStrategieprogramm

Strategie inPython, wenn die Docker-Systemumgebung sowohlPython2undPython3Installiert, können Sie diePythonAusführungszeit auf der ersten Linie der Strategie, wie z. B.#!python3und#!python2, so dass das System den Interpreter automatisch findet. Und Sie können auch einen absoluten Pfad angeben, wie:#!/usr/bin/python3.

Was ist Docker?

Docker kann als Ausführer Ihrer Handelsstrategie verstanden werden, der für komplexe Datenanfragen, Datenempfang, Netzwerkverbindungen, Logpostback usw. verantwortlich ist. Der Docker läuft auf Ihrem Server, auch wenn die FMZ Quant Trading Plattform Website einen Netzwerkfehler hat, wird dies den Betrieb Ihres Dockers nicht beeinflussen. Der Docker kann aufLinux, Fenster, Mac-Betriebssystem, Android, Raspberry Pi ARM Linuxund andere Systeme.Docker-Seite, Installation und Aktualisierung von Linux Docker. Die von dem Docker verwalteten Bots und Logs werden im Verzeichnis gespeichert/logs/storageDie Akte ist einSqliteDatenbankdatei mitdb3, die direkt von derSqliteFür eine Datei mit Erweiterungdb3In der echten Bot-Datenbank ist der Dateiname die Bot-ID.

Unterstützte Protokolle

  • Blockchain-Assets: In unserer Plattform werden jetzt mehr als 50 Blockchain-Assets (Kryptowährung) unterstützt.
  • Zugang zum allgemeinen Protokoll:Allgemeines Protokoll

Strategie Sicherheit

Wenn Handelsstrategien auf der FMZ Quant Trading Plattform entwickelt werden, sind die Strategieinhalte nur für die FMZ-Kontoinhaber sichtbar.PythonDie Strategie-Inhalte werden in einem Paket, das in den Strategie-Code geladen wird, so dass die Strategie-Inhaltslokalisierung realisiert werden kann.

Die SicherheitPythonCode: Weil...Pythonist eine Open-Source-Sprache, die extrem einfach zu dekompilieren ist, wenn die Strategie nicht für den persönlichen Gebrauch, sondern für die Vermietung ist, können Sie die Strategie auf Ihrem eigenen eingesetzten Docker laufen und mieten Sie es in Form von Unterkonto oder vollständige Docker-Management, wenn Sie besorgt über Strategie-Leckage sind.

Die Verschlüsselung vonPythonStrategiecode: Standardmäßig:PythonStrategiecode ist nicht verschlüsselt, wenn er vom Autor verwendet wird, und verschlüsselt, wenn er an Dritte vermietet wird. Durch die Bearbeitung des folgenden Codes am Anfang derPythonSie können festlegen, ob Sie den Strategiecode für den persönlichen Gebrauch oder die Vermietung verschlüsseln möchten.PythonDie Versionen, die die Verschlüsselung von Strategiecodes unterstützen, sind wie folgt:Python 2.7, Python 3.5undPython 3.6.

  • Strategie-Autoren laufen es selbst und verschlüsseln den Strategie-Code für andere zu verwenden durch Registrierungscode: Geben Sie an#!pythonals die Version des Python-Interpreters, und dann verwenden,um zu halten getrennt; Eingabe der Verschlüsselung Befehlencrypt. Wenn Sie die Version vonPython, hinzufügen#!,encrypt directly.
 #!python,encrypt

Oder...

  #!encrypt
  • Es wird die Strategie-Codes nicht verschlüsseln, wenn Strategie-Autoren für ihren eigenen Gebrauch laufen und mit anderen über den Registrierungscode teilen:
  #!python, not encrypted

Oder...

  #!not encrypted

Code verwendenos.getenv('__FMZ_ENV__')um festzustellen, ob der Verschlüsselungscode gültig ist; die Rückgabe der Zeichenfolge"encrypt"Es ist nur für den echten Bot gültig, und der Backtest verschlüsselt nicht diePythonStrategiecodes.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

Schlüssel zur Sicherheit

Die sensiblen Daten, wie Kontoinformationen und verschlüsselte Zeichenfolgen in den auf der FMZ Quant Trading Plattform konfigurierten Strategieparametern, werden im Webbrowser verschlüsselt. Alle auf der FMZ Quant Trading Plattform gespeicherten Informationen sind verschlüsselt (keine Klartextdaten), und nur Benutzer private Geräte können die Informationen entschlüsseln und verwenden, was die Sicherheit sensibler Daten erheblich verbessert. Bitte geben Sie die Strategien nicht weiter oder verkaufen Sie die Strategien nicht, wenn andere sensiblen Informationen im Strategiecode, Parameter-Einstellungen und Strategiebeschreibungen usw. enthalten sind.

  • Unsere Plattform unterstützt die lokalisierte Konfiguration sensibler Informationen, wie Exchange-Kontoinformationen und geheimen Schlüssel Auf der Seite, auf der die Plattform Austauschinformationen konfiguriert, unterstützen alle verschlüsselten Textfeldsteuerungen mit Masken die Möglichkeit, den Dateipfad für das Laden der lokalen Datei des Dockers zu konfigurieren.RSA KEYAuthentifizierungsmethode des Austauschs als Beispiel, um detailliert zu erklären, wie sensible Informationen lokal auf dem Gerät, auf dem sich das Dockerprogramm befindet, konfiguriert werden.
  1. Erstellen Sie RSA-Public-Key und Private-Key. Zum Beispiel können Sie öffentliche und private Schlüssel im FormatPKCS#8, gibt es viele Werkzeuge zur Verfügung für die Schaffung, wieopenssl.
  2. ErstellenRSA KEYund den öffentlichen Schlüssel hochladenSchritt 1während der Schöpfung.
  3. Speichern Sie den inSchritt 1in demselben Verzeichnis des Dockers im FormattxtSie werden in einem anderen Pfad im Verzeichnis des Dockerprogramms gespeichert.
  4. Bei der Konfiguration des Austauschs auf der FMZ-PlattformRSA KEYErstellt durch den Austausch im Bearbeitungsfeld der KonfigurationAccess Key.
  5. Bei der Konfiguration des Austauschs auf der FMZ-Plattform füllen Sie den Pfad destxtDatei in der gleichen Ebene Verzeichnis des Docker in derSchritt 3im Bearbeitungsfeld der KonfigurationSecret Key. Zum Beispiel, wenn der Dateiname platziert ist:rsaKey.txt, und die Datei und der Docker werden in demselben Level-Verzeichnis ausgefüllt:file:///rsaKey.txt. Wenn die Datei im Verzeichnis neben dem Verzeichnis des Docker-Programms istrsa_key, füllen Sie aus:file:///rsa_key//rsaKey.txtWenn SiersaKey. txtWenn Sie diese Anweisungen an anderer Stelle auf Ihrem Computer oder Server entsprechend befolgen, sollte beachtet werden, dass diese Datei nur in gleichwertigen Verzeichnissen oder Unterverzeichnissen in Bezug auf Docker platziert werden kann.

Dies macht es sicherer zu lokalisieren und speichern Sie den privaten Schlüssel, können Sie sich aufVideoerläuterungfür detaillierte Verfahren.

Backtest-System

Was ist ein Backtestsystem und wofür wird es verwendet?

Nachdem Sie die Gestaltung einer quantitativen Handelsstrategie abgeschlossen haben, wie können Sie die grundlegende Situation Ihrer Strategie kennen, wie die Logik der Strategie und die Richtung der Rendite der Strategie? Natürlich können wir nicht direkt echtes Geld verwenden, um die Strategie auf dem realen Handelsmarkt auszuführen, aber wir können historische Daten verwenden, um Ihre Strategie zu testen und die Gewinne Ihrer Strategie in den historischen Daten zu kennen.

Sind die Daten des Backtestsystems korrekt und wie steht es mit der Genauigkeit der Backtestergebnisse?

Die FMZ Quant Trading Plattform teilt das Backtest-System intatsächliche MarktstufeundSimulationsstufe. Das reale Marktniveau ist, um komplett nach den vollständigen historischen Daten zu backtest; während die Simulation-Level-backtest erzeugttickDiese Daten basieren beide auf den tatsächlichen historischen Daten, aber die tatsächlichen Marktdaten sind genauer und die Ergebnisse glaubwürdiger.Beschreibung des FMZ-Backtest-Mechanismus. Allerdings ist Backtesting nur die Leistung der Strategie nach historischen Daten. Die historischen Daten können den zukünftigen Markt nicht vollständig repräsentieren. Der historische Markt kann sich wiederholen, oder es kann auch zum Schwarzen Schwan führen. Daher sollten die Ergebnisse des Backtests rational und objektiv behandelt werden.

Fragen, die beim Backtesting verschiedener Programmiersprachstrategien zu beachten sind:

Der Rücktest vonJavaScriptundC++Handelsstrategien wird im Browser durchgeführt, und der echte Marktbot oderWexAppIm Rahmen der Evaluierung derWexAppDie Anwendungen werden von den Herstellern der Produkte und Dienstleistungen unterstützt. Der Rücktest vonPythonDer Marktbetrieb und der Backtest beruhen beide auf derPythonWenn einige Bibliotheken benötigt werden, müssen sie manuell installiert werden (nur gängige Bibliotheken werden auf öffentlichen Servern unterstützt).

Backtestdaten im System

Es gibt zwei Arten von FMZ Quant Trading Plattform Backtest: Simulations-Level-Backtest und Real-Markt-Level-Backtest.tickJede K-Linien-Periode erzeugt 12 Backtesting-Zeitpunkte.ticksDer Backtest-Mechanismus von FMZ erlaubt es der Handelsstrategie, mehrmals auf einer einzigen K-Linie zu handeln, wodurch die Situation vermieden wird, in der der Handel nur am Schlusskurs ausgeführt werden kann. Es ist genauer, wobei die Geschwindigkeit des Backtests berücksichtigt wird.die Verbindung.

Strategie-DEBUG-Methode im Backtesting-System

JavaScript-Strategie-Backtesting-Debugging in Chrome DevTools

Im Backtesting-System unterstützte Austausch

  • Verschlüsselte Währung (Kryptowährung)

    Name Typ Anweisungen
    Bitfinex Gegenstand des Spot-Austauschs Unterstützung begrenzter Handelspare wie:BTC_USD, ETH_USDundLTC_USD, etc. (beachten Sie, dass die Kurswährung der HandelspareUSDin Dollar)
    Binance Gegenstand des Spot-Austauschs Unterstützung begrenzter Handelspare wie:BTC_USDT, ETH_USDT, ETH_BTCundLTC_BTC, usw.
    OKX Gegenstand des Spot-Austauschs Unterstützung begrenzter Handelspare wie:BTC_USDT, ETH_USDT, ETH_BTCundLTC_BTC, usw.
    Weiß nicht. Gegenstand des Spot-Austauschs Unterstützung begrenzter Handelspare wie:BTC_USDT, ETH_USDT, ETH_BTCundLTC_BTC, usw.
    OKX Futures Futures-Börseobjekt Unterstützung begrenzter Handelspare wie:BTC_USDundETH_USD, etc.; die Kurswährung der Handelspare istUSD; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractTypeDer Vertrag ist ein Krypto-Margin-Kontrakt. Zu den unterstützten Vertragscodes gehören:this_week, next_week, quarterundswap
    HuobiDM Futures-Börseobjekt Bei HuobiDM handelt es sich um Huobi Futures (Huobi Contract), das begrenzte Handelspare unterstützt, wie z. B.:BTC_USDundETH_USD, etc.; die Kurswährung der Handelspare istUSD; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractTypeDer Vertrag ist ein Krypto-Margin-Kontrakt. Zu den unterstützten Vertragscodes gehören:this_week, next_week, quarterundswap.
    BitMEX Futures-Börseobjekt das Handelspaar istXBT_USD; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractTypeDer Vertrag ist ein Krypto-Margin-Kontrakt; der unterstützte Vertragskode lautet:XBTUSD
    Binance Futures Futures-Börseobjekt Unterstützung begrenzter Handelspare wie:BTC_USDTundETH_USDT, etc.; die Kurswährung der Handelspare istUSD; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractType), ist der Vertrag einUSDT- Marginalvertrag; der unterstützte Vertragskode istswap
    Derbit-Optionen Futures-Börseobjekt Handelspaare sind:BTC_USDundETH_USD; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractType), ist ein Krypto-Margin-Kontrakt; spezifische Optionskontraktcodes müssen festgelegt werden

    Bei den Futures-Börsen im Backtest-System wird das Wechseln von Handelsparen in den Strategiecodes vorübergehend nicht unterstützt.

Simulationsstufe

Der Simulationsniveau-Backtest basiert auf den zugrunde liegenden K-Liniendaten des Backtestsystems und simuliert Tick-Daten im Rahmen des höchsten Preises, des niedrigsten Preises, des Eröffnungspreises und der Schlusskurswerte eines gegebenen zugrunde liegenden K-Linienbalkens nach einem bestimmten Algorithmus. Die Daten werden in Echtzeit zurückgegebentickDaten, wenn die Schnittstelle angefordert wird.Beschreibung des Mechanismus für die Rückprüfung auf der Ebene der FMZ-Quantensimulation.

Realmarktniveau

Der tatsächliche Markt-Backtest ist der tatsächlichetickFür Strategien, die auftickDie Daten des realen Marktes werden mit Hilfe des realen Marktes für Backtests näher an der Realität angezeigt.tickDaten sind echte aufgezeichnete Daten, keine simulierten. Es unterstützt Tiefendaten, Datenspiel von Marktgeschäften, benutzerdefinierte Tiefe und jede einzelne Handelsdaten. Die maximale Größe des Echtmarkt-Daten-Backtests beträgt maximal 50 MB, ohne Einschränkung des Backtest-Zeitraums innerhalb der oberen Grenze des Datensatzes. Wenn Sie den Backtest-Zeitrahmen so weit wie möglich vergrößern müssen, können Sie den Wert der Tiefen-Call-Einstellungsgeräte reduzieren und nicht jede einzelne Handelsdaten verwenden, um den Backtest-Zeitrahmen zu erhöhen.GetDepth,GetTradesIn einem Moment, in dem Marktdaten auf der ZeitleisteGetTicker,GetTrades, GetDepthundGetRecordswird die Zeit nicht mehrmals verschieben, wenn sich die Zeit auf der Backtest-Zeitleiste bewegt (was keinen Sprung zum nächsten Marktdatenmoment auslösen wird). Wiederholte Aufrufe zu einer der oben genannten Funktionen werden die Backtest-Zeit verschieben, um auf der Backtest-Zeitleiste zu bewegen (springen Sie zum nächsten Marktdatenmoment). Wenn das reale Marktniveau für den Backtest verwendet wird, wird eine frühere Zeit nicht empfohlen. Es kann in der vorzeitigen Zeitspanne keine Daten auf echtem Marktniveau geben.

Der reale Marktwert-Backtest unterstützt derzeit:

  • Binance
  • Der Wert des Zinssatzes ist zu messen.
  • HuobiDM (Huobi Futures)

Optimierung der Backtesting-Systemparameter

Die Funktion der Optimierung von Parametern des Backtestsystems der FMZ Quant Trading Plattform besteht darin, Optimierungen gemäß jeder Option zur Optimierung von Parametern während des Backtests festzulegen, und die Optionen sind wie folgt dargestellt:

  • Mindestwert: zur Begrenzung des Anfangswerts der Parameter.
  • Höchstwert: Um den Höchstwert der Parameter nach inkrementellen Änderungen zu begrenzen.
  • Schrittgröße: die inkrementelle Variable der Parameter.

Genereren Sie Parameterkombinationen und durchqueren Sie alle diese Kombinationen zum Backtest (d. h. jeder Parameterkombination einmal zurückgetestet).ZahlDer Typ kann im Backtesting-System optimiert werden.

Beispielsweise können Optionen zur Optimierung von Parametern auf der Backtestseite festgelegt werden:

img

Der Rücktest des Optimierungsmodus für Parameter:

img

Speichern von Einstellungen für Backtest

In der Strategiebearbeitungsseite können Sie in der Paginierung von Backtest (d. h. dem Backtestsystem) Optionen wie Backtestkonfigurationen und Strategieparameter festlegen, um die Strategie zu backtesten. Die Backtest-Einstellungen beziehen sich auf den Backtest-Zeitrahmen, die Austauschplattform, den Slippoint und die Servicegebühr usw.; während die Strategieparameter verwendet werden, um Parameteroptionen für Strategien festzulegen. Wenn die Strategiekonfigurationen alle eingestellt sind, können Sie die Strategie entsprechend den Einstellungen zurücktesten. Wie speichern Sie diese konfigurierten Einstellungen also für die Verwendung auf der nächsten Backtestseite (die Einstellungsoptionen während des Auffrischens der Seite werden zurückgesetzt)? Sie können auf der Strategieseite auf die Schaltfläche Save Settings klicken, und alle Backtest-Einstellungen (einsch. Backtest-Konfigurationen und Parameter-Einstellungen) werden in Form von Testcode

img

Nehmen SieJavaScriptStrategie als Beispiel, und klicken Sie auf Save Backtest Settings to Source File:

img

Es gibt kleine Unterschiede bei Save Backtest Settings to Source File zwischenJavaScript, Python, cppundMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

- Ich habe keine Ahnung.

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

Benutzerdefinierte Datenquelle

Das System verwendet dieGETMethode zur Anforderung einer benutzerdefinierten URL (öffentlich zugängliche URL), um eine externe Datenquelle für Backtest zu erhalten.

Parameter Bedeutung Erläuterung
Symbol Name des Symbols Z. B. BTC_USD_OKCoin_EN
Eid Auswechslungen wie OKCoin_EN
Runde Genauigkeit der Preise Der Preis in den zurückgegebenen Daten muss mit 1000 multipliziert und gerundet werden.
Um Quantitätsgenauigkeit Der Betrag in den zurückgegebenen Daten muss mit 100 multipliziert und gerundet werden.
Dauer Barzeit (Millisekunden) 60 000 Anzeigen der Bar, die eine Minute verlangt.
Tiefe Tiefenebenen 1-20
Handelszweige Ob Daten aufgeteilt werden müssen wahr/falsch
Von Startzeit Unix-Zeitstempel
Zu Die Endzeit Unix-Zeitstempel

Anmerkung:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

Ein Beispiel für die genäht Daten:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

Das zurückgegebene Format muss eines der folgenden zwei Formate sein (das vom System automatisch erkannt wird):

Gewöhnlicher Backtest auf Barebene

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Tick-Level-Backtestdaten (einschließlich Markttiefeninformationen, ein Array mit einem Tiefenformat von [Preis, Volumen]; es kann mehrere Tiefenstufen geben; Askes bezieht sich auf die Preiserhöhung und Bids auf die Preisumkehrung.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

Beschreibung

Feld Beschreibung
Schema Es gibt die Attribute der Spalten im Datensatz an, der für Großbuchstaben sensibel ist und nur auf time, open, high, low, close, vol, asks und bids beschränkt ist
Daten Ein Array, das Daten nach Schema speichert

Datenformat

Feld Beschreibung
Anträge/Angebote [Preis, Volumen],...]
Handel [Zeit, Richtung, Kauf, Verkauf, Preis, Volumen]

Bereitstellung von Finanzierungsraten:

Zum Beispiel ist es notwendig, zusätzliche Daten zur Finanzierungssatzrate zu haben, die von einer benutzerdefinierten Datenquelle bereitgestellt werden müssen.

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

Ein Beispiel für die Datenanfrage aus dem Backtestsystem:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

Beispiel für benutzerdefinierte Datenquelle:

Angabe der Datenquelle, URL:http://xxx.xx.x.xx:9090/dataAnpassen des Datenservers, geschrieben in golang:

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

TeststrategieJavaScriptBeispiel:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

Diagramme, die durch die benutzerdefinierten Daten im Backtestsystem erstellt wurden:

Strategie Druckinformationen:

Lokale Backtest-Engine

FMZ Quant Trading-Plattform hat für dieJavaScriptVeröffentlichungPythonVersion des lokalen Backtest-Engines, unterstützende EinstellungBasis K-Linienperiodewährend des Backtests.

Backtest-Seiten-Verknüpfungstasten

  • Kurzschaltfläche zum Wechseln zwischen Strategie Bearbeiten und Backtesting

    Verwenden Sie den Schlüssel.Ctrl +,um zurück zu wechseln Backtest Seite und Edit Strategy Seite.CtrlDrücken Sie die Taste.,.

  • Abkürzung für die Sparstrategie

    Verwenden Sie den Schlüssel.Ctrl + sSie müssen ihre Strategien retten.

  • Abkürzung für den Start der Strategie-Backtest

    Verwenden Sie den Schlüssel.Ctrl + bum Start Backtest zu ermöglichen.

Beschreibung des Codes

Eintrittsfunktionen

Funktionsname Beschreibung
main() Es ist eine Eingabefunktion.
onexit() Es handelt sich um eine Reinigungsfunktion, die bei normaler Abfahrt eine maximale Ausführungszeit von 5 Minuten hat, die nicht angemeldet bleiben kann.UnterbrechenFehler werden gemeldet.
onerror() Es handelt sich um eine abnormale Ausgangsfunktion, deren maximale Ausführungszeit 5 Minuten beträgt, die nicht deklariert werden kann.PythonundcppDiese Funktion wird nicht unterstützt.
init() Es ist eine Initialisierungsfunktion, das Strategieprogramm wird automatisch aufgerufen, wenn es ausgeführt wird, was nicht deklariert bleiben kann.
  • Beschreibung:
    1. Das Backtest-System unterstützt die Funktion nichtonerror().
    1. Wenn die Funktiononerror()ist im Bot ausgelöst, die Funktiononexit()wird nicht ausgelöst.

Ein Exit (((

onexit(), Verarbeitung von Aufräumarbeiten mit einer maximalen Ausführungszeit von 5 Minuten, die vom Benutzer realisiert wird.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

Initial

Der Benutzer implementiert die Initialisierungsfunktioninit(), die automatisch die Funktion ausführtinit()Sie werden anfangs der Strategie angezeigt, um die Initialisierungsaufgabe abzuschließen.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

Ein Fehler.

Ausführung der Funktiononerror()Diese Funktion unterstützt keine inPythonundcpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

Klassischer Strategie­rahmen

In den inJavaScript, Pythonundcpp, dieSleep()Die Funktion muss in der Hauptschleife dieser Strategien aufgerufen werden. Sie wird verwendet, um die Rückverfolgungsgeschwindigkeit zu steuern. Im Bot wird sie verwendet, um die Strategie-Umfrageintervalle zu steuern und auch die Anforderungsfrequenz des Zugriffs auf die API-Schnittstelle der Börse zu steuern.

  • Grundlegende Rahmenbeispiele für Kryptowährungsstrategien:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    Nehmen wir das einfachste Beispiel, wenn ich einen Kaufbefehl mit einem Preis von 100 und einer Menge von 1 auf der Börse jede Sekunde platzieren möchte, kann ich es so schreiben:

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

Bibliothek der Vorlagen

DieBibliothek der Vorlagenist ein wiederverwendbares Code-Modul in der FMZ Quant Trading-Plattform, das als Kategorie von Handelsstrategiecodes arbeitet.Bibliothek der Vorlagen, wird eine Vorlage auf der Seite Strategie des Kontos hinzugefügt, das sich derzeit in der FMZ Quant Trading Plattform angemeldet hat. Nach der Erstellung ist es nicht mehr möglich, die Kategorie auf eine normale Strategie zu ändern.

Vorlagenbibliothek eingeschaltetJavaScript:

img

Vorlagenbibliothek eingeschaltetPython:

img

Vorlagenbibliothek eingeschaltetcpp:

img

  • Exportfunktion von Modellbibliothek Die Exportfunktion ist eine Schnittstellenfunktion von Template library und kann mit der Strategie aufgerufen werden, die auf Template library verweist.

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • Vorlagebibliothek Parameter Template library kann auch eigene Schnittstellenparameter festlegen, die in Form globaler Variablen im Code von Template library verwendet werden.

    Vorlagebibliothek Parameter Einstellungen:

    img

    Codes der Template-Bibliothek:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    Siehe Strategie-Code inBibliothek der Vorlagenoben erwähntes Beispiel:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • Zitat Vorlagenbibliothek

    Nach Überprüfung der Referenz in der Template Spalte der Strategiebearbeitungsseite speichern Sie die Strategie.

    img

Einbaustruktur

Globale Variablen

Austausch

ExchangeDas System kann als Exchange-Objekt betrachtet werden. Standardmäßig gilt es als das erste Exchange-Objekt, das in den Strategieparametern hinzugefügt wird. Alle Dateninteraktion mit dem Exchange wird durch die Funktionen in diesem Objekt realisiert.

  • Hinzufügen von Austauschobjekten in Backtest

  • Hinzufügen von Austauschobjekten auf der Seite Bot

Die zusätzlichen Austauschgegenstände entsprechen derexchangeGegenstände im Code:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Auswechslungen

Es kann als ein Array verstanden werden, das alle Austauschobjekte wieexchangeAustauschobjekte, die mehrere Austauschobjekte enthalten können;exchanges[0]istexchange.

Die zusätzlichen Austauschobjekte entsprechenexchanges[0], exchanges[1], exchanges[2]...und so weiter im Strategiecode.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
Status der Bestellung

Das AttributStatusin derOrder structure.

Ständiger Name Definition Wert
Ausstehen des Auftrags nicht abgeschlossen 0
- Das ist nicht der Fall. abgeschlossen 1
- Das ist nicht der Fall. abgesagt 2
- Das ist nicht der Fall. Unbekannter Zustand (andere Zustände) 3

- Das ist nicht der Fall.Status kann anrufenexchange.GetRawJSON()um die ursprünglichen Bestellstatusinformationen zu erhalten, die Austauschdatei abzufragen und die spezifische Beschreibung anzuzeigen. Die Konstantennamen im Formular können direkt im Strategiecode verwendet werden, um mit dem Attribut zu vergleichenStatusin derOrderDie Konstanten werden in einem System ausgedruckt, in dem die Konstanten auf der Liste der Bestellungen aufgeführt sind.Konstante Namenund ihre entsprechendenWerte, und andere Konstantenbezeichnungen unten funktionieren auf die gleiche Weise, so dass es keine detaillierteren Beschreibungen über sie geben wird.

Art des Auftragsgeschäfts

Das AttributTypein derOrder structure.

Ständiger Name Definition Wert
Der Wert des Zertifikats wird in der Liste aufgeführt. Kaufbestellung 0
Der Wert des Zertifikats wird in der Liste aufgeführt. Verkaufsbefehl 1
Positionstyp

Das AttributTypein derPosition structure.

Ständiger Name Definition Beschreibung Anwendung Wert
PD_LONG Langfristige Position Verwendung von Kryptowährungs-Futuresexchange.SetDirection("closebuy")um die Positionrichtung zu schließen und diese Art von Positionen zu schließen Futures für Kryptowährungen 0
PD_SHORT Kurze Position Verwendung von Kryptowährungs-Futuresexchange.SetDirection("closesell")um die Positionrichtung zu schließen und diese Art von Positionen zu schließen Futures für Kryptowährungen 1
Futures-Eröffnungs- und Schlusspositionsrichtlinien

Das AttributOffsetin derOrder structure.

Ständiger Name Definition Wert
Die Ausgabe der Ausgabe wird in der Liste aufgeführt. Aufträge für offene Positionen 0
Die Ausgabe der Ausgabe wird von der Ausgabe der Ausgabe abgelehnt. Schließungspositionen 1
Strategieparameter

In den Handelsstrategiecodes werden die auf der Strategieoberfläche festgelegten Strategieparameter in Form von globalen Variablen wiedergegeben.JavaScriptIn der Strategie-Schnittstelle können die Parameterwerte, die auf der Strategie-Schnittstelle gesetzt oder geändert wurden, direkt aufgerufen werden.PythonStrategie, das SchlüsselwortglobalDie Strategie wird von der Kommission im Rahmen des Programms "Förderung und Nutzung von

Parameterarten:

img

Variable Beschreibung Anmerkungen Typ Standardwert Beschreibung
Zahl Nummerntyp Anmerkungen Nummer (n) 1 C++-Strategie ist ein Floating-Comma-Typ
String String Anmerkungen String (String) Hallo FMZ. Der Standardwert muss nicht zitiert werden. Die Eingabe wird als Zeichenfolge behandelt
Verpackung KomboBox Anmerkungen ComboBox (gewählt) 1|2|3 Die ComboBox-Variable selbst ist ein numerischer Wert, der den Index der Spalte darstellt, die durch das ComboBox-Steuerelement ausgewählt wurde.
Bool Überprüfungsmöglichkeiten Anmerkungen Boolean (wahr/falsch) - Das stimmt. Wenn geprüft, ist die Variable bool wahr; wenn nicht geprüft, ist die Variable bool falsch
Geheime Zeichenfolge Verschlüsselte Zeichenfolge Anmerkungen Verschlüsselte Zeichenfolge (String) Passwort Bei der gleichen Verwendung wie eine Zeichenfolge wird die verschlüsselte Zeichenfolge verschlüsselt gesendet und nicht in Klartext übermittelt.
  • Die Schnittstellenparameter werden im Abschnitt Strategieparameter unter dem Abschnitt Codebearbeitung der Strategiebearbeitungsseite festgelegt.
  • Schnittstellenparameter existieren als globale Variablen im Strategiecode, d. h. Schnittstellenparameter können im Code geändert werden.
  • Die Variablennamen der Schnittstellenparameter im Strategiecode (siehe oben):number, string, combox, bool, secretString.
  • Beschreibungsoption: die Namen der Schnittstellenparameter auf der Strategie-Schnittstelle.
  • Anmerkung Option: die detaillierte Beschreibung der Schnittstellenparameter; die Beschreibung wird angezeigt, wenn die Maus über die Schnittstellenparameter bewegt wird.
  • Typoption: der Typ der Schnittstellenparameter.
  • Standardwertoption: die Standardwerte der Schnittstellenparameter.

Einstellungen für Parameterabhängigkeit: Ein Parameter kann so eingestellt werden, dass ein anderer Parameter basierend auf der Auswahl des Parameters angezeigt und versteckt werden kann.numberA, die ein numerischer Typ ist.numberAangezeigt oder verborgen werden, je nachdem, ob ParameterisShowA(Boolean Typ) ist wahr oder falsch.numberAauf den Schnittstellenparametern:numberA@isShowA.

img

Auf diese Weise, wenn der ParameterisShowAist nicht geprüft, wird der ParameternumberADer Parameterwert des ComboBox-Steuerungstyps wird durch den abhängigen Teil der Parameter beurteilt, ob der Parameterwert demIndexwertSie können auch eine andere Option in der ComboBox verwenden.isShowAWenn Sie die Variablen in den Parametern setzen, schreiben Sie:numberA@combox==2. Der ParameternumberAwird angezeigt oder versteckt, je nachdem, ob der Parametercomboxwird als die dritte Option geprüft (wobei der Index 0 der ersten Option entspricht, der Index 1 der zweiten und der Index 2 der dritten).

Strategie-Schnittstellenparameter, interaktive Steuerelemente und Parametergruppenfunktion auf Vorlage: Fügen Sie einfach hinzu.(?First group)zu Beginn der Beschreibung des Parameters, mit dem die Gruppierung beginnt, wie in der folgenden Abbildung dargestellt:

img

Wenn Sie die Strategie verwenden, werden die Parameter in Gruppen angezeigt:

img

Parameter-Standardwert speichern: Die Strategieparameter sind in der Abbildung dargestellt. Während des Backtests, wenn Sie die Standardwerte der Strategieparameter speichern möchten, können Sie auf dieSave settingsSchaltfläche nach Änderung der Strategieparameter.

img

img

Sie können die Strategieparameter-Einstellungen in Form von Code speichern:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

Datenstruktur

Einige Funktionen werden von der ursprünglichenJSONDaten, die während des Anrufs angefordert wurden.JSONDaten werden im Attribut gespeichertInfoDa der Backtest nicht auf eine Plattformoberfläche zugreifen soll, haben die während des Backtests zurückgegebenen Daten kein AttributInfoIm Folgenden werden die wichtigsten Eigenschaften jeder Datenstruktur beschrieben.

Handel

Erhalten Sie die gesamte Handelsgeschichte (nicht selbst), die von der Funktion zurückgegeben wirdexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Tickern

Die Funktion "Marktnotierungen" wird zurückgegeben.exchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
Aufzeichnung

Der StandardOHLCDiese Funktion wird für die Berechnung und Analyse von K-Linien und Prozessindikatoren verwendet.exchange.GetRecords()Gibt das Struktur-Array zurück.RecordDie Struktur stellt eine k-Linienbalke dar, nämlich eine k-LineBAR. DieTimein derRecordist die Anfangszeit der K-Linien-Barperiode.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Aufordnung

Bestellstruktur kann durch Funktionen zurückgegeben werden, einschließlichexchange.GetOrder()undexchange.GetOrders(). Die Funktionexchange.GetOrders()gibt das Array oder ein leeres Array der Struktur zurück (wenn es keineaktuelle unvollendete Bestellung, zurück[], d. h. ein leeres Array).

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide