[TOC]
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
Welche Programmiersprachen stehen zur Verfügung, um meine Strategien umzusetzen?
FMZ Quant Trading-Plattform unterstützt die NutzungJavaScript
, TypeScript
, Python
, C++
, Pine
Mylanguage
undBlockly Visualization
Strategieentwurf zu schreiben.
Es unterstütztTypeScript
Sprache, setzen Sie es noch aufJavaScript
Strategie, wenn wir Strategien erstellen, dann schreiben wir// @ts-check
am Anfang des Strategiecodes oder klicken Sie auf die SchaltflächeTypeScript
in der oberen rechten Ecke des Strategiebearbeitungsbereichs umzuschaltenTypeScript
Die Plattform erkennt den Code alsTypeScript
automatisch und bieten Ihnen die entsprechende Kompilierungs- und Typprüfungshilfe für:
TypeScript
Die statische Typprüfung kann Ihnen helfen, mögliche Fehler beim Schreiben von Code zu finden und die Codequalität zu verbessern.TypeScript
Das 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.TypeScript
, können Sie Ihren Code besser organisieren und pflegen, so dass er leicht zu lesen und zu verstehen ist.TypeScript
bietet 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.
Blockly
Visualisierungstutorials:
Setzen
Python
Übersetzer, der vomPython
Strategieprogramm
Strategie inPython
, wenn die Docker-Systemumgebung sowohlPython2undPython3Installiert, können Sie diePython
Ausführungszeit auf der ersten Linie der Strategie, wie z. B.#!python3
und#!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/storage
Die Akte ist einSqlite
Datenbankdatei mitdb3
, die direkt von derSqlite
Für eine Datei mit Erweiterungdb3
In der echten Bot-Datenbank ist der Dateiname die Bot-ID.
Unterstützte Protokolle
Wenn Handelsstrategien auf der FMZ Quant Trading Plattform entwickelt werden, sind die Strategieinhalte nur für die FMZ-Kontoinhaber sichtbar.Python
Die Strategie-Inhalte werden in einem Paket, das in den Strategie-Code geladen wird, so dass die Strategie-Inhaltslokalisierung realisiert werden kann.
Die SicherheitPython
Code:
Weil...Python
ist 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 vonPython
Strategiecode:
Standardmäßig:Python
Strategiecode 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 derPython
Sie können festlegen, ob Sie den Strategiecode für den persönlichen Gebrauch oder die Vermietung verschlüsseln möchten.Python
Die Versionen, die die Verschlüsselung von Strategiecodes unterstützen, sind wie folgt:Python 2.7
, Python 3.5
undPython 3.6
.
#!python
als 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
#!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 diePython
Strategiecodes.
#!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")
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
RSA KEY
Authentifizierungsmethode 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.PKCS#8
, gibt es viele Werkzeuge zur Verfügung für die Schaffung, wieopenssl
.RSA KEY
und den öffentlichen Schlüssel hochladenSchritt 1während der Schöpfung.txt
Sie werden in einem anderen Pfad im Verzeichnis des Dockerprogramms gespeichert.RSA KEY
Erstellt durch den Austausch im Bearbeitungsfeld der KonfigurationAccess Key
.txt
Datei 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.txt
Wenn SiersaKey. txt
Wenn 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.
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 erzeugttick
Diese 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.tick
Jede K-Linien-Periode erzeugt 12 Backtesting-Zeitpunkte.ticks
Der 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
Verschlüsselte Währung (Kryptowährung)
Name | Typ | Anweisungen |
---|---|---|
Bitfinex | Gegenstand des Spot-Austauschs | Unterstützung begrenzter Handelspare wie:BTC_USD , ETH_USD undLTC_USD , etc. (beachten Sie, dass die Kurswährung der HandelspareUSD in Dollar) |
Binance | Gegenstand des Spot-Austauschs | Unterstützung begrenzter Handelspare wie:BTC_USDT , ETH_USDT , ETH_BTC undLTC_BTC , usw. |
OKX | Gegenstand des Spot-Austauschs | Unterstützung begrenzter Handelspare wie:BTC_USDT , ETH_USDT , ETH_BTC undLTC_BTC , usw. |
Weiß nicht. | Gegenstand des Spot-Austauschs | Unterstützung begrenzter Handelspare wie:BTC_USDT , ETH_USDT , ETH_BTC undLTC_BTC , usw. |
OKX Futures | Futures-Börseobjekt | Unterstützung begrenzter Handelspare wie:BTC_USD undETH_USD , etc.; die Kurswährung der Handelspare istUSD ; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractType Der Vertrag ist ein Krypto-Margin-Kontrakt. Zu den unterstützten Vertragscodes gehören:this_week , next_week , quarter undswap |
HuobiDM | Futures-Börseobjekt | Bei HuobiDM handelt es sich um Huobi Futures (Huobi Contract), das begrenzte Handelspare unterstützt, wie z. B.:BTC_USD undETH_USD , etc.; die Kurswährung der Handelspare istUSD ; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractType Der Vertrag ist ein Krypto-Margin-Kontrakt. Zu den unterstützten Vertragscodes gehören:this_week , next_week , quarter undswap . |
BitMEX | Futures-Börseobjekt | das Handelspaar istXBT_USD ; nach der Festlegung des spezifischen Auftragscodes (siehe Funktionexchange.SetContractType Der Vertrag ist ein Krypto-Margin-Kontrakt; der unterstützte Vertragskode lautet:XBTUSD |
Binance Futures | Futures-Börseobjekt | Unterstützung begrenzter Handelspare wie:BTC_USDT undETH_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_USD undETH_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.
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ückgegebentick
Daten, wenn die Schnittstelle angefordert wird.Beschreibung des Mechanismus für die Rückprüfung auf der Ebene der FMZ-Quantensimulation.
Der tatsächliche Markt-Backtest ist der tatsächlichetick
Für Strategien, die auftick
Die Daten des realen Marktes werden mit Hilfe des realen Marktes für Backtests näher an der Realität angezeigt.tick
Daten 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
,GetTrades
In einem Moment, in dem Marktdaten auf der ZeitleisteGetTicker
,GetTrades
, GetDepth
undGetRecords
wird 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:
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:
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:
Der Rücktest des Optimierungsmodus für Parameter:
In der Strategiebearbeitungsseite können Sie in der Paginierung von
Nehmen SieJavaScript
Strategie als Beispiel, und klicken Sie auf
Es gibt kleine Unterschiede bei JavaScript
, Python
, cpp
undMylanguage
:
/*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"}]
*)
Das System verwendet dieGET
Methode 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 |
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/data
Anpassen 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)
}
TeststrategieJavaScript
Beispiel:
/*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:
FMZ Quant Trading-Plattform hat für dieJavaScript
VeröffentlichungPython
Version des lokalen Backtest-Engines, unterstützende EinstellungBasis K-Linienperiodewährend des Backtests.
Kurzschaltfläche zum Wechseln zwischen Strategie
Verwenden Sie den Schlüssel.Ctrl +,
um zurück zu wechseln Ctrl
Drücken Sie die Taste.,
.
Abkürzung für die Sparstrategie
Verwenden Sie den Schlüssel.Ctrl + s
Sie müssen ihre Strategien retten.
Abkürzung für den Start der Strategie-Backtest
Verwenden Sie den Schlüssel.Ctrl + b
um
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.Python undcpp Diese 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. |
onerror()
.onerror()
ist im Bot ausgelöst, die Funktiononexit()
wird nicht ausgelöst.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);
}
}
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!");
}
Ausführung der Funktiononerror()
Diese Funktion unterstützt keine inPython
undcpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
In den inJavaScript
, Python
undcpp
, 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);
}
}
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
JavaScript
:
Python
:
cpp
:
Exportfunktion von
/*
-- 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");
}
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());
}
Zitat
Nach Überprüfung der Referenz in der Template Spalte der Strategiebearbeitungsseite speichern Sie die Strategie.
Exchange
Das 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
Hinzufügen von Austauschobjekten auf der Seite
Die zusätzlichen Austauschgegenstände entsprechen derexchange
Gegenstä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());
}
Es kann als ein Array verstanden werden, das alle Austauschobjekte wieexchange
Austauschobjekte, 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());
}
}
Das AttributStatus
in 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 vergleichenStatus
in derOrder
Die 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.
Das AttributType
in 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 |
Das AttributType
in 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 |
Das AttributOffset
in 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 |
In den Handelsstrategiecodes werden die auf der Strategieoberfläche festgelegten Strategieparameter in Form von globalen Variablen wiedergegeben.JavaScript
In der Strategie-Schnittstelle können die Parameterwerte, die auf der Strategie-Schnittstelle gesetzt oder geändert wurden, direkt aufgerufen werden.Python
Strategie, das Schlüsselwortglobal
Die Strategie wird von der Kommission im Rahmen des Programms "Förderung und Nutzung von
Parameterarten:
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. |
number
, string
, combox
, bool
, secretString
.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.numberA
angezeigt oder verborgen werden, je nachdem, ob ParameterisShowA
(Boolean Typ) ist wahr oder falsch.numberA
auf den Schnittstellenparametern:numberA@isShowA
.
Auf diese Weise, wenn der ParameterisShowA
ist nicht geprüft, wird der ParameternumberA
Der 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.isShowA
Wenn Sie die Variablen in den Parametern setzen, schreiben Sie:numberA@combox==2
. Der ParameternumberA
wird angezeigt oder versteckt, je nachdem, ob der Parametercombox
wird 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 (?First group)
zu Beginn der Beschreibung des Parameters, mit dem die Gruppierung beginnt, wie in der folgenden Abbildung dargestellt:
Wenn Sie die Strategie verwenden, werden die Parameter in Gruppen angezeigt:
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 settings
Schaltfläche nach Änderung der Strategieparameter.
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]]
*/
Einige Funktionen werden von der ursprünglichenJSON
Daten, die während des Anrufs angefordert wurden.JSON
Daten werden im Attribut gespeichertInfo
Da der Backtest nicht auf eine Plattformoberfläche zugreifen soll, haben die während des Backtests zurückgegebenen Daten kein AttributInfo
Im Folgenden werden die wichtigsten Eigenschaften jeder Datenstruktur beschrieben.
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
}
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
}
Der StandardOHLC
Diese Funktion wird für die Berechnung und Analyse von K-Linien und Prozessindikatoren verwendet.exchange.GetRecords()
Gibt das Struktur-Array zurück.Record
Die Struktur stellt eine k-Linienbalke dar, nämlich eine k-LineBAR
. DieTime
in derRecord
ist 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
}
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