In dem letzten Artikel haben wir über programmatische 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 welcher Art von Computerprogrammiersprache geschrieben werden (drei Programmiersprachen, die auf der FMZ Quant Trading Platform verwendet werden, sind aufgeführt. Natürlich können Sie jede Programmiersprache verwenden, um Strategien für den programmatischen Handel umzusetzen). In diesem Artikel diskutieren wir weiter über die Quantifizierung der Kryptowährung und erfahren mehr darüber.
Arten von Handelsstrategien Neulinge beim programmierten Handel und beim quantitativen Handel können durch Begriffe wie verschiedene Trendstrategien, Arbitragestrategien, Hochfrequenzstrategien, Gitterstrategien usw. verwirrt sein. In der Tat sind die gemeinsamen Strategientypen im programmierten Handel und quantitativen Handel einfach mehrere Richtungen.
Aus der Perspektive der Strategieentwicklung auf der FMZ Quant Trading Plattform lassen sich Strategien auch in:
Schnittstelle der Exchange API
Wie funktioniert das programmatische Handelsscript mit dem Börsenkonto?
Welche Arten von Schnittstellen sind also für den Austausch offen? Im vorherigen Artikel haben wir im Abschnitt
Schnittstellen, für die keine Überprüfung erforderlich ist
Diese Art von Schnittstelle, die allgemein als API KEY
(wenn Sie vergessen haben, was der API-Key ist, können Sie sich dem vorherigen Artikel zuwenden). Diese Art von Schnittstelle ist allgemein Markt-Schnittstelle, wie zum Beispiel Abfragen von tiefgreifenden Marktpreisen, Abfragen von K-Line-Daten, Abfragen von Finanzierungssätzen, Abfragen von Informationen über Handelsvarianten, Abfragen von Exchange-Server-Zeitstempeln usw.
Einfach ausgedrückt, kann die Schnittstelle, die nicht mit Ihrem Konto zusammenhängt, grob als öffentliche Schnittstelle bestimmt 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 Börse, die öffentliche Schnittstelle verkapselt), auch wenn die API KEY-Konfiguration nicht korrekt ist, die vom Schnittstellen zurückgegebenen Daten normal (wegen Nichtverifizierung) erhalten werden.
Schnittstellen, die überprüft werden müssen Einfach ausgedrückt, es ist die Schnittstelle, die überprüft werden muss (über API KEY), diese Art von Schnittstelle wird als private Schnittstelle bezeichnet. Sie ist normalerweise mit einigen Operationen oder Informationen Ihres Kontos verbunden, wie zum Beispiel Abfragen von Kontovermögen, Abfragen von Kontopositionen, Abfragen von ausstehenden Aufträgen, Abfragen von Überweisungen, Übertragen von Währungen, Anpassung von Hebelwirkung, Einstellung von Positionsmodus usw. Alle diese Vorgänge müssen überprüft werden. Wenn auf der FMZ Quant Trading Platform die API-Funktion, die überprüft werden muss, aufgerufen wird (die Schnittstelle, die für den eingekapselten Austausch überprüft werden muss, private Schnittstelle), wenn der API KEY falsch konfiguriert ist, wird bei Aufruf der Schnittstelle ein Fehler gemeldet und ein Nullwert zurückgegeben.
Wie werden diese Schnittstellen auf der FMZ Quant Trading Plattform verwendet?
Die FMZ Quant Trading Platform fasst das Börsenverhalten und die Schnittstellen mit konsistenten Definitionen zusammen (z. B. die K-Line-Schnittstelle, die tiefgreifende Marktschnittstelle, die aktuelle Asset-Abfrage-Schnittstelle, die Order-Schnittstelle, die Order-Annullierungs-Schnittstelle usw.), diese Schnittstellen werden als FMZ Quant Trading Platform API-Funktionen auf der FMZ Quant Trading Platform bezeichnet und können über die API-Dokumentation (https://www.fmz.com/api).
Wie werden einige der Austausch-Schnittstellen mit unterschiedlichen Verhaltensweisen und Definitionen auf der FMZ Quant Trading Platform verwendet?
Diese Austauschschnittstellen umfassen: Vermögensübertragung, bedingte Bestellung, Platzierung von Chargenbestellungen, Stornierung von Chargenbestellungen, Änderung von Bestellungen usw. Einige Börsen haben diese Schnittstellen, andere nicht, und ihre Funktionen und Nutzungsdetails können sehr unterschiedlich sein, so dass auf diese Schnittstellen über dieexchange.IO
Funktion auf der FMZ Quant Trading Platform (Weitere Informationen finden Sie in der API-Dokumentation der FMZ Quant Trading Platform:https://www.fmz.com/api#exchange.io..Es gibt auch einige praktische IO-Beispielstrategien auf dem FMZ Quant Trading Platform Strategie-Feld.
Generieren alle API-Funktionen im FMZ Quant Trading Platform API-Dokument Netzwerkanfragen?
Zunächst und vor allem hat die API-Schnittstelle der Börse Zugriffsfrequenzbeschränkungen (z. B. 5 Mal pro Sekunde), und der Zugriff kann nicht zu häufig sein, sonst wird ein http 429-Fehler gemeldet und der Zugriff wird verweigert (die meisten Börsen melden 429). Nicht alle API-Funktionen der FMZ Quant Trading Platform werden Netzwerkanfragen generieren. Einige von ihnen ändern nur einige lokale Einstellungen, wie z. B. das Einstellen des aktuellen Handelspares, das Einstellen des Vertragscodes, die Indikatorberechnungsfunktion und das Erhalten des Austauschobjektnamens usw. Im Allgemeinen lässt sich beurteilen, ob eine Netzwerkanfrage aus dem Zweck der Funktion erfolgt. Solange die Austauschdaten, die Austauschkontooperationen usw. generierte Netzwerkanfragen sind, müssen diese Schnittstellen auf die Anruffrequenz achten.
Lassen Sie uns über einige häufige Probleme und Erfahrungen bei der Verwendung von API-Funktionen auf der FMZ Quant Trading Platform sprechen
Fehlervermögen Dies ist der häufigste Fehler, der unzählige Anfänger beunruhigt.
Wenn wir eine Strategie schreiben, müssen wir alle die von der Schnittstelle zurückgegebenen Daten beurteilen und überprüfen.var ticker = exchange. GetTicker()
, wenn wir dieLast
(letzter Preis)ticker
Variable (siehe Struktur zurückgegeben von der GetTicker-Funktion), müssen wir verwendenvar newPrice = ticker.Last
Bei der Erfassung von Daten wie dieser (was ist newPrice? new: latest, Price: price, ja! alle zusammen!)GetTicker()
Funktion kehrt zu normalen Daten zurück, es ist in Ordnung, aber wenn es eine Anforderung Timeout, Netzwerkfehler, der Austausch zieht das Netzwerkkabel, das Kabel ist abgeschnitten, das Kind zieht den Stromschalter, usw.GetTicker()
Funktion zurückkehrennull
Der Wert vonticker
istnull
, und wenn ich gehe auf seinen ZugangLast
, wird eine Ausnahme des Programms auftreten und das Strategieprogramm wird gestoppt.
Es scheint, dass das Scheitern des Schnittstellenaufrufs (der GetTicker-Aufruf scheitert und null zurückgibt) nicht der direkte Grund für den Stopp von strategynull
Der Fehlerbericht des Interface-Aufruffehlers wird den echten Bot-Stop nicht verursachen (Hervorhebung).
Also, was können wir tun, um das abnormale Stoppen des echten Bots zu vermeiden?
Die Antwort besteht darin, eine fehlertolerante Verarbeitung der von der Schnittstelle zurückgegebenen Daten durchzuführen.null
(ein Beispiel für die JavaScript-Sprache, andere Sprachen sind in der Regel die gleichen)
Schreiben Sie ein kurzes Code-Segment zur Beschreibung (dies ist nur eine Beschreibung, Sie können es nicht direkt ausführen!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("Print the latest price:", newPrice)
} else {
// The data is null, there will be no problem if no operation is performed
}
Nicht nur dieGetTicker
Schnittstelle muss fehlertolerant sein, aber die Schnittstelle mit Netzwerkanfragen muss für den Rückgabewert fehlertolerant sein (wenn Sie den Rückgabewert der Funktion verwenden)
Es gibt viele fehlertolerante Methoden, Sie können die_C()
Funktion (siehe FMZ-API-Dokumentation), um selbst eine fehlertolerante Funktion zu schreiben und einen fehlertoleranten Mechanismus und eine fehlertolerante Logik zu entwickeln.
Die Verwendung von_C()
Die Funktion ist für viele Anfänger üblicherweise falsch._C()
Funktion ist eine Funktionsreferenz, kein Funktionsanruf._C(funcName, param1, param2)
, der Aufruf ist korrekt, funcName ist ohne Klammern, und param1 und param2 sind die Parameter, die an die Funktion funcName weitergegeben werden sollen._C(funcName(param1, param2))
, der Aufruf ist falsch, in der Regel von Anfängern geschrieben, die die FMZ-API-Dokumentation nicht ernst nehmen.
Die Bestellmenge der Bestellung zum Kauf auf dem Spotmarkt
Die Bestellmenge der Spotmarkt-Bestellung Kauf-Bestellung ist auch leicht zu Fehlern von Anfängern zu machen, wie im vorherigen Artikel erwähnt, die Bestellmenge der Spotmarkt-Bestellung Kauf-Bestellung ist in der Regel der Betrag (sehr wenige Börsen können andere Einstellungen sein, im Allgemeinen werden diese speziellen Exchange-Einstellungen auf FMZ im FMZ API-Dokument erklärt), zum Beispiel benutze ich OKEX V5 Demo zu testen:
Das Handelspaar wird so eingestellt:LTC_USDT
function main() {
exchange.IO("simulate", true) // Switch to the demo of OKEX exchange
exchange.Buy(-1, 1) // The price is -1, indicating that the order placed is a market order, and the quantity is 1, indicating that the order amount is 1USDT
}
Da die Börsen im Allgemeinen ein Limit für den Auftragsbetrag haben, werden Aufträge, die kleiner als das Limit sind, nicht platziert (z. B. benötigt Binance Spot jede Bestellung von mehr als 5 USDT, bevor sie erfolgreich platziert werden kann). Daher wird ein Fehler gemeldet, wenn Sie eine Bestellung wie diese platzieren:
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:]
Anleitung bei der Abgabe zukünftiger Aufträge Bei der Erstellung von Futures-Strategien wird die Richtung der Auftragserteilung oft von Anfängern falsch gemacht, was zu Problemen führt. Schauen wir uns zunächst die Beschreibung in der API-Dokumentation an:https://www.fmz.com/api#exchange.setdirection...
Da die Ordnungsfunktion nurBuy
, Sell
Es ist jedoch offensichtlich, dass Buy/Sell keine Operationen in so viele Richtungen ausdrücken kann. Zu diesem Zeitpunkt ist es notwendig, die Funktion einzuführenexchange.SetDirection()
, die die Richtung des Futures-Handels bestimmt.
Auf FMZ,exchange.SetDirection("buy")
(die Richtung zuerst einstellen) wird in Verbindung mitexchange.Buy
, bedeutet dies, dass der aufgegebene Auftrag ein Auftrag zur Eröffnung einer Long-Position ist.
Und so weiter:exchange.SetDirection("sell")
wird in Verbindung mitexchange.Sell
, bedeutet dies, dass die aufgegebene Order eine Order zur Eröffnung einer Shortposition ist.exchange.SetDirection("closebuy")
wird in Verbindung mitexchange.Sell
, bedeutet dies, dass der aufgegebene Auftrag ein Auftrag zum Schließen einer Long-Position ist.exchange.SetDirection("closesell")
wird in Verbindung mitexchange.Buy
, bedeutet dies, dass die aufgeteilte Bestellung eine Bestellung zur Schließung einer Shortposition ist.
Anfänger verwenden normalerweiseexchange.SetDirection("sell")
in Verbindung mitexchange.Buy
, oder andere falsche Kombinationen. Dann wird ein Fehler gemeldet (Backtesting kann keinen Fehler melden, aber dies ist offensichtlich ein logischer Fehler, Zwangsstörungen können nicht toleriert werden...).
Ein weiterer häufiger Fehler von Anfängern
function main() {
exchange.SetContractType("quarter") // Set the current contract as a quarterly contract
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("See my market order is placed and the transaction is completed, there is a position", exchange.GetPosition())
exchange.SetDirection("closebuy") // closebuy is used in conjunction with Sell, yes~
exchange.Sell(-1, 1)
}
Hier könnte man fragen:
Log-Ausgabe, Anzeige von Transaktionsinformationen
Das Design von programmierten und quantitativen Handelsstrategien ist untrennbar mit dem Design von Mensch-Computer-Interaktion, wie print
- Ich weiß.
Verwendung von JavaScriptconsole.log
- Ich weiß.
Verwendung von Golangfmt.Println()
- Ich weiß.
Verwendung von C++cout
Lassen Sie uns über die Informationsanzeige auf der FMZ-Plattform sprechen, auf der FMZ Quant Trading Platform gibt es zwei Hauptorte, an denen die Informationen angezeigt werden.
Status-Spalte Nachdem der echte Bot ausgeführt wurde, ist die echte Bot-Seite wie in der Abbildung gezeigt:
Der Anzeigeteil ist die Statusspalte-Informationen. Die Statusspalte wird hauptsächlich verwendet, um einige in Echtzeit veränderte Daten anzuzeigen (weil Echtzeitveränderungen in Echtzeit beobachtet werden müssen und nicht jedes Mal als Protokoll gedruckt werden können, diese Art von Daten kann in der Statusspalte angezeigt werden. Das Protokoll wird viele doppelte und bedeutungslose Daten wiederholen, was die Abfrage beeinflusst, wenn jedes Protokoll gedruckt wird).
Die in der Statusspalte angezeigten Daten verwenden dieLogStatus
Details finden Sie in der FMZ-API-Dokumentation.
Log-Spalte Auch auf der echten Bot-Seite, wie in der Abbildung gezeigt:
Der Anzeigeteil ist die Log-Spalte. Die Log-Spalte wird hauptsächlich verwendet, um bestimmte Daten zu einem bestimmten Zeitpunkt dauerhaft aufzuzeichnen oder eine Operation einer bestimmten Strategie zu einem bestimmten Zeitpunkt aufzuzeichnen. Es gibt verschiedene Arten von Baumstämmen:
Gemeinsames Protokoll, Strategien auf FMZ übernehmen die Log-Funktion zur Ausgabe und zum Drucken im Strategieprotokoll.
Bestellprotokoll, Verwendungexchange.Sell
/exchange.Buy
in FMZ
Stornierungsprotokollexchange.CancelOrder
wird in der Strategie des FMZ
Fehlerprotokoll, wenn die Strategie auf der FMZ ausgeführt wird, ein Anruffehler auftritt auf der Schnittstelle, die eine Netzwerkanfrage ausführt, eine Ausnahme wird geworfen (z. B. eine Aussage über den Wurf), das Fehlerprotokoll wird automatisch im Protokoll ausgeführt.
API-Funktionen auf FMZ, Funktionen, die Log-Ausgabe generieren können, wie Log ((...), exchange.Buy ((Preis, Betrag), exchange.CancelOrder ((Id), etc., können alle von einigen zusätzlichen Ausgabeparametern nach den notwendigen Parametern, wie zum Beispiel: exchange. CancelOrder ((Orders[j].Id, Orders[j]) gefolgt werden, um die Auftragsinformationen auszugeben, wenn die Auftragsreihenfolge [j] storniert wird.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "Attached data1", data2, "...")
exchange.CancelOrder(id, "Attached data1", data2, "...")
LogProfit(100, "Attached data1", data2, "...")
}
Verwendung von Indikatorfunktionen
Bevor wir über die Indikatorfunktion sprechen, verstehen wir zuerst, was ein Indikator ist. Einfach gesagt, es ist eine Linie, wie beispielsweise gleitender Durchschnitt, MACD und ATR.
F: Woher stammen diese Indikatoren?
A: Natürlich ist es berechnet.
F: Auf welcher Grundlage erfolgt die Berechnung?
A: Berechnung auf der Grundlage von K-Liniendaten.
F: Nehmen wir ein Beispiel?
A: Nehmen wir den einfachsten Indikator gleitenden Durchschnitt als Beispiel, wenn wir die täglichen K-Linie (d. h. eine positive oder negative Linie stellt einen Tag dar) Daten als Datenquelle für die Indikatorberechnung verwenden.
F: Kann der gleitende Durchschnittsindikator berechnet werden, wenn die Anzahl der K-Linien-BARs kleiner als 10 ist?
A: Nicht nur der gleitende Durchschnittsindikator kann nicht berechnet werden, sondern jeder Indikator kann den effektiven Indexwert 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.JavaScript
Sprache Strategie wird angezeigtnull
beim Drucken der berechneten Indikatordaten.
Es kommt vor, dass es ein Tutorial-Beispiel im Strategiefeld gibt:https://www.fmz.com/strategy/125770Backtest die Tutorial Beispielstrategie, können wir das Diagramm durch das Backtesting-System und den 10-Perioden gleitenden Durchschnitt erzeugt sehen:
Strategie-Anpassung, gezeichnete K-Linie sowie gleitende Durchschnittsdiagramme.
F: Was ist, wenn ich einen gleitenden 10-Stunden-Durchschnitt will? A: Die Verwendung von K-Liniendaten mit den K-Liniendaten für die Stundenzeit ist in Ordnung.
In einfachen Worten, die K-Linie, die wir sehen, ist ein Array, nachdem wir es digitalisiert haben (Sie können Baidu fragen, wenn Sie das Konzept des Arrays nicht verstehen), wobei jedes Element eine K-Linie-Spalte ist, die in der Reihenfolge angeordnet ist, das erste Element im Array ist am weitesten von der aktuellen Zeit entfernt, und das letzte Element des Arrays ist am nächsten zur aktuellen Zeit. Normalerweise ist der letzte Balken der K-Liniendaten der Balken des aktuellen Zeitraums, der sich in Echtzeit ändert und unvollständig ist (Sie können die Änderungen beobachten, indem Sie sich in eine Austauschseite einloggen und die K-Line beobachten). Die berechneten Indikatoren entsprechen auch den K-Linienbalken. Im obigen Beispiel können wir sehen, dass ein Indikatorwert einer K-Linienbalke entspricht. Beachten Sie, dass sich der letzte K-Linienbalken in Echtzeit ändert, und der berechnete Indikator wird sich auch mit der Änderung der K-Linienbalke ändern.
Auf der FMZ Quant Trading Plattform können wir die TA-Bibliothek (die von der FMZ-Plattform implementierte Bibliothek, integriert in den Docker und verschiedene Sprachen können direkt verwendet werden) oder die talib-Bibliothek (die alte talib-Indikatorbibliothek, JS, C++-Integration, Python muss selbst installiert werden) verwenden. Um beispielsweise den gleitenden Durchschnitt im obigen Beispiel zu berechnen: Die TA-Bibliothek verwenden:
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // print moving average
}
Verwenden Sie die Talib-Bibliothek:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // print moving average
}
Die berechneten Indikatordaten ma sind ein Array, und jedes Element entspricht dem K-Linien-Array (Einträge) eins zu eins, d. h.ma[ma.length -1]
entsprichtrecords[records.length - 1]
, und so weiter.
Das gleiche gilt für andere komplexe Indikatoren, und wir müssen auf Indikatoren wie den MACD achten.
var macd = TA.MACD(records) // In this way, only the K-line data is passed in, not the indicator parameters. The indicator parameters use the default values, and the same goes for other indicator functions.
In diesem Moment ist die Variable macd ein zweidimensionales Array (Sie können Baidu fragen, wenn Sie das Konzept nicht verstehen). Ein zweidimensionales Array ist einfach ein Array und jedes Element davon ist auch ein Array. F: Warum sind die MACD-Indikatordaten ein zweidimensionales Array? A: Weil der MACD-Indikator aus zwei Linien (Diff-Linie, DEA-Linie) und einer Reihe von Volumenbalken besteht (MacD-Volumenbalken, in der Tat können diese Volumenbalkendaten auch als Linie betrachtet werden).
var dif = macd[0]
var dea = macd[1]
var macdColumn = macd[2]
Hier ist auch ein vorgefertigtes Tutorial-Beispiel, wenn Sie interessiert sind, können Sie unter:https://www.fmz.com/strategy/151972