In dem letzten Artikel haben wir über programmierte Handelsscripts gesprochen. Tatsächlich ist die Handelsstrategie ein Handelsscriptprogramm. Der Artikel spricht hauptsächlich über die Notwendigkeit eines Hardware-Trägers für das Handelsscriptprogramm (wo das Programm ausgeführt wird) und das Skripthandelsprogramm kann in dieser Computerprogrammiersprache geschrieben werden (die drei in FMZ Quant Trading Platform verwendeten Programmiersprachen auflisten; natürlich können Sie jede Programmiersprache verwenden, um Strategien im programmierten Handel umzusetzen). In diesem Artikel diskutieren wir weiterhin über die Quantifizierung des Kryptowährungskreises und verstehen das Wissen darüber.
Art der Handelsstrategie Anfänger, die neu im programmierten Handel und quantitativen Handel sind, können durch verschiedene Begriffe wie Trendstrategie, Arbitrage-Strategie, Hochfrequenzstrategie, Gitterstrategie usw. verwirrt werden. In der Tat sind die gemeinsamen Strategientypen im programmierten Handel und quantitativen Handel einfach in mehreren Richtungen.
Arbitrage-Strategie Einfach ausgedrückt kann eine Strategie, die im Grunde lange Positionen hält, während sie kurze Positionen hält, als Arbitrage-Strategie eingestuft werden.
Trendstrategie Einfach ausgedrückt ist es die Strategie, den Trend zu verfolgen und eine einzige Position zu platzieren, wie z. B. doppelte gleitende Durchschnitte, MACD und andere Strategien.
Rückkehrstrategie Zum Beispiel die Netzstrategie, die die Rendite aus Preisschwankungen in volatilen Märkten erzielt.
Hochfrequenzstrategie Einfach ausgedrückt, handelt es sich um eine Strategie zur Durchführung von Hochfrequenz-Handel über einige Algorithmen, um Marktmikrostruktur, Regeln, Chancen usw. zu entdecken.
Die oben genannten Typen werden aus der Sicht der Handelsstrategie klassifiziert; aus der Sicht der Strategieentwicklung auf FMZ Quant können Strategien auch in:
Einzeichenstrategie Das heißt, die Strategie kann nur ein Symbol betreiben, z. B. einen BTC-Handel oder einen ETH-Handel.
Mehrzeichenstrategie Einfach ausgedrückt ist es, mehrere Symbole mit einer Strategie-Logik zu bedienen.
Strategie für mehrere Konten Einfach ausgedrückt, ist es, mehrere Austauschobjekte auf einem Bot zu konfigurieren (das Konzept einer Plattform wurde im vorherigen Artikel eingeführt, und ein Austauschobjekt, das mit einem API KEY konfiguriert ist, stellt ein Plattformkonto dar).
Multi-Logik-Strategie Beispielsweise werden MACD-Strategie, gleitende Durchschnittsstrategie, Gitterstrategie usw. gleichzeitig auf einem Bot entwickelt (natürlich soll es verschiedene Austauschobjekte betreiben, und die Austauschobjekte mit der gleichen Operation hängen davon ab, ob die spezifische Strategie logisch widersprüchlich ist)
Plattform-API-Schnittstelle
Wie funktioniert das programmierte Handelsscript mit dem Plattformkonto?
Welche Arten von Schnittstellen sind also für Plattformen offen? Im letzten Artikel haben wir darüber gesprochen, dass Plattformen im Allgemeinen REST- und Websocket-Schnittstellen im Abschnitt
Schnittstellen, die nicht überprüft werden müssen
Im Allgemeinen werden sie als API KEY
Diese Art von Schnittstelle ist im Allgemeinen eine Markt-Schnittstelle, wie zum Beispiel die Abfrage von Tiefenmarktnotierungen, K-Line-Daten, Finanzierungssätzen, Informationen über Handelssymbole, Plattformserver-Zeitstempel usw.
Einfach ausgedrückt, kann die Schnittstelle, die grundsätzlich nichts mit Ihrem Konto zu tun hat, grob als öffentliche Schnittstelle bezeichnet werden (keine Verifizierung erforderlich).
Auf der FMZ Quant Trading Plattform können bei Aufruf einer nicht verifizierten API-Funktion (die die nicht verifizierte Schnittstelle der Plattform einkapselt; öffentliche Schnittstelle), auch wenn die API KEY-Konfiguration falsch ist, die vom Interface zurückgegebenen Daten normal erhältlich sein (keine Verifizierung erforderlich).
Schnittstellen, die überprüft werden müssen Einfach ausgedrückt, es sind die Schnittstellen, die überprüft werden müssen (durch API KEY). Diese Art von Schnittstelle wird als private Schnittstelle bezeichnet. Diese Art von Schnittstelle ist normalerweise mit einigen Operationen oder Informationen Ihres Kontos verbunden, wie zum Beispiel Abfragen von Kontovermögen, Kontopositionen, ausstehenden Aufträgen, Überweisungen, Währungsumrechnung, Hebelwirkungsanpassung und Positionsmodus-Einstellung usw. Diese Vorgänge müssen überprüft werden.
Auf FMZ Quant werden bei Aufruf der API-Funktionen, die eine Verifizierung benötigen (die privaten Schnittstellen, die verkapselt sind und die Plattformverifizierung benötigen), Fehler angezeigt.
Wie nutzen wir diese Schnittstellen auf der FMZ Quant Trading Plattform?
FMZ Quant Trading Platform umfasst Plattform-Schnittstellen mit einheitlichen Aktionen und Definitionen (wie K-Line-Schnittstellen, Deep Market-Schnittstellen, aktuelle Asset-Abfrage-Schnittstellen, Order-Schnittstellen, Order-Rücktrittsschnittstellen usw.). Diese Schnittstellen werden auf der FMZ Quant Trading Platform aufgerufen. Die FMZ API-Funktionen können durch Abfragen der API-Dokumentation angezeigt werden: (https://www.fmz.com/api).
Wie kann man also einige Plattform-Schnittstellen ohne einheitliche Aktionen und Definitionen auf FMZ Quant verwenden?
Diese Plattformschnittstellen umfassen: Vermögensübertragung, bedingte Bestellung, Batch-Bestellung, Batch-Order Stornierung, Bestelländerung usw. Einige Plattformen haben diese Schnittstellen, andere nicht, und die Funktionen und Nutzungsdetails können sehr unterschiedlich sein, so dass diese Schnittstellen über dieexchange.IO
Funktion auf der FMZ Quant (weitere Angaben siehe API-Dokumentation der FMZ Quant-Handelsplattform:https://www.fmz.com/api#exchange.io...). Es gibt auch einige praktische IO-Beispielstrategien im
Können alle API-Funktionen in der FMZ-API-Dokumentation eine Netzwerkanfrage stellen?
Wir müssen sagen, dass die Plattform-APIs eine Grenze für die Zugriffsfrequenz haben (z. B. 5 Mal in 1 Sekunde). Der Zugriff kann nicht zu häufig sein, sonst wird der Fehler von http 429 gemeldet, und der Zugriff wird abgelehnt (die meisten Plattformen berichten 429). Daher hat der Aufruf der eingekapselten Plattform-Schnittstellen auf FMZ Quant auch eine Grenze, aber der Aufruf der API-Funktionen, die keine Netzwerkanfragen stellen, hat keine solche Grenze.
Nicht alle API-Funktionen auf FMZ Quant können Netzwerkanfragen stellen; einige API-Funktionen auf FMZ ändern nur einige lokale Einstellungen, wie die Einstellung des aktuellen Handelspaares, des Vertragscodes und der Indikatorberechnungsfunktion sowie den Erwerb des Austauschobjektnamens usw.
Grundsätzlich kann man durch die Verwendung der Funktion a bestimmen, ob eine Netzwerkanfrage gestellt wird; solange es sich um den Erwerb der Plattformdaten oder den Betrieb eines Plattformkontos handelt, wird eine Netzwerkanfrage gestellt; diese Schnittstellen müssen alle auf die Aufruffrequenz achten.
Lassen Sie uns über einige häufige Probleme und Erfahrungen der Verwendung von API-Funktionen auf FMZ Quant sprechen.
Fehlertoleranz Dies ist der häufigste Fehler, der unzählige Anfänger beunruhigt hat. Oft ist der Strategie-Backtest gut und alles ist normal. Warum funktioniert der Bot nach einer Weile abnormal (was jederzeit ausgelöst werden kann)?
Wenn Sie eine Strategie schreiben, müssen die von der Schnittstelle zurückgegebenen Daten überprüft werden. Zum Beispiel der Code zum Tickern auf FMZ Quant (was dem Schreiben Ihres eigenen Programms entspricht, um direkt auf die Plattformoberfläche zuzugreifen):var ticker = exchange.GetTicker()
wenn wir die Daten vonLast
(letzter Preis) in der Variablenticker
(Sie können sich auf die Rücksendungsstruktur der Funktion GetTicker beziehen), müssen wir die Daten erhalten (was ist newPrice? new: die neueste; Price: price; that
Nun, es ist in Ordnung, wenn die FunktionGetTicker()
gibt die normalen Daten zurück; wenn es eine Auszeit Anfrage, Netzwerkfehler, Plattform ziehen aus dem Kabel, Kabel durch Graben gebrochen, oder Kinder schalten den Stromschalter, die FunktionGetTicker()
wird zurückkehrennull
Im Moment ist der Wert vonticker
istnull
- wenn ich auf dieLast
Das Strategieprogramm wird durch eine Ausnahmeregelung gestoppt.
Daraus ergibt sich, dass der Ausfall des Schnittstellenaufrufs (der Aufruf von GetTicker versagt und null zurückgibt) nicht die direkte Ursache für den Stopp des Strategie-Bots ist (die direkte Ursache ist, dass ein Attribut einesnull
Die Situation, in der das Versagen des Schnittstellenanrufs einen Fehler meldet, wird nicht dazu führen, dass der Bot stoppt (Hervorhebung hier hinzugefügt).
Also, was sollten wir tun, um das abnormale Stoppen von Bot zu vermeiden?
Die Antwort besteht darin, Fehlerverträglichkeitsverfahren für die von Schnittstellen zurückgegebenen Daten durchzuführen; es ist sehr einfach, und Sie müssen nur beurteilen, ob die zurückgegebenen Datennull
(hier JavaScript als Beispiel nehmen, für die anderen Sprachen sind ähnlich).
Schreiben Sie ein kleines Code-Segment (das nur zur Anleitung dient und nicht direkt ausgeführt werden kann!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("Print the latest price:", newPrice)
} else {
// data is null, so no operation will make no problem
}
Nicht nur dieGetTicker
Schnittstelle muss fehlertolerante Verarbeitung durchführen, aber die Schnittstelle mit Netzwerkanfragen muss die fehlertolerante Verarbeitung für den Rückgabewert durchführen (wenn Sie den Rückgabewert der Funktion verwenden)
Es gibt viele Fehlerverträglichkeitsmethoden._C()
Funktion (siehe FMZ-API-Dokumentation), um Ihre eigene fehlertolerante Funktion zu schreiben und Ihren eigenen fehlertoleranten Mechanismus und Ihre eigene Logik zu entwerfen.
Die Anwendung der_C()
Es ist jedoch sehr wahrscheinlich, dass viele neue Schüler diese Funktion auch falsch verwenden._C()
Funktion ist eine Funktionsreferenz, kein Funktionsanruf._C(funcName, param1, param2)
; der Aufruf ist korrekt; funcName hat keine Klammern, und param1 und param2 sind die zu importierenden Parameter in die Funktion funcName._C(funcName(param1, param2))
; der Aufruf ist falsch; normalerweise wird der Aufruf so geschrieben, wenn ein Anfänger die FMZ-API-Dokumentation nicht sorgfältig liest.
Bestellbetrag auf dem Spotmarkt
Anfänger können auch leicht Fehler bei der Bestellmenge der Spotmarktkauforder machen. Wie im vorherigen Artikel erwähnt, ist die Bestellmenge der Spotmarktkauforder normalerweise der Geldbetrag (nur einige wenige Plattformen können andere Einstellungen haben, und im Allgemeinen werden diese speziellen Plattform-Einstellungen in der FMZ API-Dokumentation erklärt). Zum Beispiel habe ich OKEX V5 simulierten Bot verwendet, um zu testen:
Das Handelspaar wird als:LTC_USDT
function main() {
exchange.IO("simulate", true) // switch to OKEX simulated bot
exchange.Buy(-1, 1) // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
}
Da Plattformen im Allgemeinen ein Limit für den Auftragsbetrag haben, werden Aufträge mit einem Betrag, der kleiner als das Limit ist, nicht platziert (z. B. benötigt Binance Spot nur Aufträge mit einem Betrag von mehr als 5 USDT, um erfolgreich platziert werden zu können).
error Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
Futures-Orderrichtung
Bei der Erstellung von Futures-Strategien machen Anfänger häufig Fehler in der Reihenfolge.https://www.fmz.com/api#exchange.setdirection...
Weil die Bestellfunktion nurBuy
undSell
. Allerdings Futures (natürlich gibt es kein Problem für den Spot, für den Spot hat nur kaufen und verkaufen) hat die Richtungen der Eröffnung lang, Schließen lang, Eröffnung kurz, und Schließen kurz, so offensichtlich exchange.SetDirection()
der Festlegung von Futures-Handelsrichtlinien.
Auf FMZ,exchange.SetDirection("buy")
(die zuerst die Richtung festlegt) wird zusammen mitexchange.Buy
, was bedeutet, dass der aufgegebene Auftrag ein Auftrag zur Eröffnung von Long-Positionen ist.
Und so weiter:
Verwendungexchange.SetDirection("sell")
undexchange.Sell
Der Wert des Bestellungsvertrags ist der Wert des Bestellungsvertrags, der für die Eröffnung von Short-Positionen verwendet wird.
Verwendungexchange.SetDirection("closebuy")
undexchange.Sell
Der Wert des Bestellungsvertrags ist der Wert des Bestellungsvertrags, der für den Abschluss der Long-Positionen verwendet wird.
Verwendungexchange.SetDirection("closesell")
undexchange.Buy
Der Wert des Bestellungsverfahrens ist der Wert des Bestellungsverfahrens.
Die Anfänger benutzen normalerweiseexchange.SetDirection("sell")
undexchange.Buy
Dann wird ein Fehler gemeldet (ein Fehler kann nicht im Backtest gemeldet werden, aber das ist offensichtlich ein Logikfehler, der von zwanghaften Menschen wie mir nicht ignoriert werden kann.)
Hier ist ein weiterer Fehler, den Anfänger häufig machen.
function main() {
exchange.SetContractType("quarter") // set the current contract to a quarterly contract
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("placed market order, executed, get positions", exchange.GetPosition())
exchange.SetDirection("closebuy") // use closebuy and Sell together, yes, no problem
exchange.Sell(-1, 1)
}
Wenn es hier kommt, könnten Sie fragen:" Ich habe Positionen, und verwenden closebuy und verkaufen zusammen, also warum ein Fehler gemeldet wird und ich kann Positionen nicht schließen? "Ich würde sagen:" falsche Richtung zu schließen Positionen! Sie schlossen lange Positionen. "
Darüber hinaus kann der Fehler in einer anderen Situation liegen: Die Einstellung der Position Richtung nahe ist korrekt, die Verwendung der Bestellfunktion ist auch korrekt, und Sie halten auch die Positionen in der Richtung, aber der Fehler wird immer noch gemeldet.
Der Grund könnte sein: Ihr Programm hat viele Aufträge platziert, die Aufträge werden zunächst nicht ausgeführt, und die Aufträge von Close-Positionen sind jetzt auf dem Markt und warten auf die Ausführung.
Anzeige der Export- und Handelsinformationen
Das Entwerfen und Schreiben von programmierten und quantitativen Handelsstrategien ist untrennbar mit dem Entwurf von Mensch-Computer-Interaktionen wie print
- Ich weiß.
Verwendung von JavaScriptconsole.log
- Ich weiß.
Verwendungszwecke von Golangfmt.Println()
- Ich weiß.
C++-Anwendungencout
.
Auf FMZ Quant gibt es hauptsächlich zwei Orte, an denen Informationen angezeigt werden.
Statusleiste Nachdem der Bot gestartet wurde, wird die Bot-Seite wie folgt angezeigt:
Der Anzeigeteil ist die Statusleiste Informationen. Die Statusleiste wird hauptsächlich verwendet, um einige in Echtzeit veränderte Daten anzuzeigen (weil Echtzeitänderungen in Echtzeit beobachtet werden müssen und nicht jedes Mal als Protokoll gedruckt werden können, so dass diese Art von Daten in der Statusleiste angezeigt werden kann. Wenn Sie das Protokoll von jedem drucken, wird es viele bedeutungslose wiederholte Daten geben, die die Abfrage beeinflussen).
Die auf der Statusleiste angezeigten Daten verwenden dieLogStatus
Details finden Sie in der FMZ-API-Dokumentation.
Log-Bar Es befindet sich auch auf der Bot-Seite, wie auf dem folgenden Bild gezeigt:
Der Anzeigeteil ist die Protokollleiste. Die Protokollleiste wird hauptsächlich verwendet, um bestimmte Daten zu einem bestimmten Zeitpunkt dauerhaft aufzuzeichnen oder eine Operation einer bestimmten Strategie zu einem bestimmten Zeitpunkt aufzuzeichnen. Die Bausteine sind in verschiedene Typen unterteilt:
exchange.Sell
/exchange.Buy
in einer FMZ-Strategie wird automatisch der Datensatz im Protokoll ausgeführt.exchange.CancelOrder
wird in einer FMZ-Strategie verwendet, und das Stornierungsprotokoll wird automatisch im Protokoll ausgeführt.Unter den FMZ-API-Funktionen können Funktionen, die Log-Ausgabe generieren können, wie Log ((...), exchange.Buy ((Preis, Betrag), exchange.CancelOrder ((Id), etc., nach den notwendigen Parametern, wie zum Beispiel: exchange.CancelOrder ((orders[j].Id, orders[j]), einige zusätzliche Ausgabeparameter folgen; es ist zusätzlich die Auftragsinformationen auszugeben, wenn die Bestellreihenfolge[j] storniert wird.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
exchange.CancelOrder(id, "additional data1", data2, "...")
LogProfit(100, "additional data1", data2, "...")
}
Verwendung von Indikatorfunktionen Bevor wir über die Indikatorfunktion sprechen, verstehen wir zuerst, was ein Indikator ist. Einfach ausgedrückt ist es eine Linie wie gleitender Durchschnitt, MACD oder ATR.
F:Wie werden diese Indikatoren erstellt? A: Sie werden sicherlich durch Berechnungen erzeugt.
F: Worauf beruhen die Berechnungen? A: Daten der K-Linie.
F: Können Sie ein Beispiel geben? A: Nehmen wir den einfachsten gleitenden Durchschnittsindikator als Beispiel. Wenn wir die täglichen K-Linie (d. h. eine Yang-Linie oder eine Yin-Linie repräsentiert einen Tag) Daten als Datenquelle für die Indikatorberechnung verwenden. Der gleitende Durchschnittsindikatorparameter ist 10, dann ist der berechnete gleitende Durchschnittsindikator der 10-tägige gleitende Durchschnitt.
F: Kann der gleitende Durchschnittsindikator berechnet werden, wenn die Anzahl der K-Linien BAR kleiner als 10 ist?
A: Nicht nur der gleitende Durchschnittsindikator kann nicht berechnet werden, sondern jeder Indikator kann den effektiven Indikatorwert nicht berechnen, wenn die Anzahl der K-Liniendaten BAR nicht dem Indikatorperiodenparameter entspricht und die entsprechende Position des berechneten Arrays mit leeren Werten gefüllt wird, z. B.null
angezeigt wird, wennJavaScript
Strategie druckt die berechneten Indikatordaten aus.
Es gibt ein Lehrbeispiel auf dem Platz:https://www.fmz.com/strategy/125770Backtest dieses Lehrbeispiel Strategie, und Sie können das Diagramm durch das Backtest-System und den 10-Perioden gleitenden Durchschnitt erzeugt sehen:
Nach Strategie-Anpassung, gezogener K-Linie und gleitendem Durchschnittsdiagramm:
F: Was ist, wenn ich einen gleitenden 10-Stunden-Durchschnitt verwenden möchte? A: Verwenden Sie die K-Liniendaten eines stündlichen Zeitraums.
Einfach ausgedrückt, ist die K-Linie, die wir sehen, ein Array, nachdem wir es digitalisiert haben (wenn Sie das Konzept des Arrays nicht verstehen, können Sie es auf Baidu durchsuchen), und jedes Element des Arrays ist eine K-Linienleiste, die in der Reihenfolge angeordnet ist. Normalerweise ist der letzte Balken der K-Liniendaten der Balken des aktuellen Zeitraums, der sich in Echtzeit ändert und nicht abgeschlossen wird (Sie können die Änderungen beobachten, indem Sie sich auf einer Plattformseite anmelden und ihre K-Line beobachten). Die berechneten Indikatoren entsprechen auch eins zu eins den K-Linienbalken. Im obigen Beispiel können Sie sehen, dass ein Indikatorwert einer K-Linienbalke entspricht. Beachten Sie, dass sich der letzte K-Linienbalken in Echtzeit ändert und der berechnete Indikator sich auch mit der Änderung der K-Linienbalke ändert.
Auf der FMZ Quant Trading Platform können Sie die TA-Bibliothek (die von FMZ implementierte Bibliothek, die im Docker integriert ist und direkt in verschiedenen Sprachen verwendet werden kann) oder talib (die alte berühmte Indikatorbibliothek
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // print average
}
Verwenden Sie Talib:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // print average
}
Die berechneten Indexdaten ma sind ein Array und jedes Element entspricht dem K-Linien-Array (Einträge) einzeln, d. h.ma[ma.length -1]
entsprichtrecords[records.length - 1]
, und so weiter.
Dies gilt auch für andere kompliziertere Indikatoren, und Sie müssen auf Indikatoren wie MACD achten.
var macd = TA.MACD(records) // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
In diesem Moment ist die Variable macd ein zweidimensionales Array (Sie können es bei Baidu finden, wenn Sie das Konzept nicht verstehen). Ein zweidimensionales Array ist einfach ein Array, und jedes Element davon ist auch ein Array.
F: Warum sind MACD-Indikatordaten ein zweidimensionales Array? A: Weil der MACD-Indikator aus zwei Linien (Diff-Linie und DEA-Linie) und einer Reihe von Volumenbalken besteht (die MACD-Volumenbalkendaten können tatsächlich auch als Linie betrachtet werden).
var dif = macd[0]
var dea = macd[1]
var macdbar = macd[2]
Hier ist auch ein vorgefertigtes Lehrbeispiel; wenn Sie interessiert sind, können Sie es studieren:https://www.fmz.com/strategy/151972