Im letzten Artikel haben wir über programmierbare Transaktionsscripts gesprochen. Tatsächlich handelt es sich bei Trading Strategies um ein Transaktionsscript, das hauptsächlich über Hardwareträger (wo das Programm ausgeführt wird) handelt, die in der Programmiersprache geschrieben werden können, die von den Erfindern der Quantitativ-Trading-Plattformen verwendet wird.
Arten von Handelsstrategien Neulinge, die an Programmatized Trading und Quantitative Trading interessiert sind, werden vielleicht von verschiedenen Begriffen wie Trendstrategien, Swapstrategien, Hochfrequenzstrategien und Gitterstrategien überzeugt, obwohl Programmatized Trading und Quantitative Trading in der Regel in mehreren Richtungen verwendet werden.
Die oben aufgeführten Strategien werden aus der Sicht der Handelsstrategie unterteilt, und aus der Sicht der Strategieentwicklung auf der quantitativen Handelsplattform der Erfinder können Strategien in folgende Kategorien eingeteilt werden:
API-Schnittstelle der Börse Wie funktioniert ein programmierbares Transaktionsscript mit einem Börsenkonto? Die Antwort ist die API-Schnittstelle, die über die Börse geöffnet wird. Welche Arten von Schnittstellen gibt es dann für eine offene Börse? Im vorherigen Artikel haben wir im Abschnitt "Börse" über die REST- und Websocket-Schnittstellen gesprochen. Hier fügen wir ein wenig Konzepte aus der Strategie-Programmebene hinzu.
Benutzeroberfläche ohne Authentifizierung
Allgemein bekannt als Public Interface Kettle, benötigen solche Schnittstellen keine VerifizierungAPI KEY
(Vergessen Sie, was ein API KEY ist, können Sie den vorherigen Artikel durchblättern). Diese Arten von Schnittstellen sind in der Regel Markt-Schnittstellen, z. B. um die Tiefe des Marktes zu erfragen, um die K-Line-Daten zu erfragen, um die Kapitalraten zu erfragen, um Informationen über die Art der Transaktionen zu erfragen, um die Zeitspanne der Exchange-Server zu erfragen.
Einfach ausgedrückt, ist eine Schnittstelle, die grundsätzlich nichts mit Ihrem Konto zu tun hat, und Sie können sich annähernd sicher sein, dass es sich um eine öffentliche Schnittstelle handelt (keine Verifizierung erforderlich).
Auf der Quantifizierungsplattform der Erfinder können Daten, die die API zurückgibt, auch dann normal abgerufen werden, wenn eine nicht-verifizierte API-Funktion aufgerufen wird (eng. wrap exchange non-verified interface, public interface), selbst wenn die API KEY falsch konfiguriert ist.
Benutzeroberfläche, die verifiziert werden müssen Einfacher gesagt ist es die Benutzeroberfläche, für die eine Authentifizierung ("Authentifizierung durch API KEY") erforderlich ist. Diese Benutzeroberfläche wird als private Benutzeroberfläche bezeichnet. Diese Benutzeroberfläche ist normalerweise mit den Handlungen oder Informationen Ihres Kontos verbunden, wie zum Beispiel das Abfragen von Konto-Assets, das Abfragen von Konto-Holdings, das Abhängen von Anfragen, das Übertragen von Anfragen, das Übertragen von Währungen, das Anpassen von Hebeln, das Setzen von Holdings usw. Diese Operationen müssen verifiziert werden. Auf der inventor quantified-trading-Plattform wird bei Aufrufen von API-Funktionen, die überprüft werden müssen, ein Fehler angezeigt, der einen nullwert zurückgibt, wenn der API KEY falsch konfiguriert ist.
Wie werden diese Schnittstellen dann auf der Quantitative Trading Plattform der Erfinder verwendet?
Die Quantifizierungsplattform der Erfinder umfasst die Verhaltensweisen der Börse und definiert einheitliche Interfaces (z. B. K-Line-Interfaces, Deep Market Interfaces, Query-Current-Asset-Interfaces, Down-Single-Interfaces, Withdrawal-Interfaces usw.), die auf der Quantifizierungsplattform der Erfinder als Quantifizierungsplattform-API-Funktionen bezeichnet werden und über die API-Dokumentation abgerufen werden können.https://www.fmz.com/api )。
Was ist mit den verschiedenen Verhaltensweisen und Definitionen, die nicht einheitlich sind, und wie werden sie auf den Quantitative Trading Plattformen der Erfinder verwendet?
Diese Interfaces sind z. B. für Vermögensverlagerungen, Konditionsaufträge, Großhandelsbestellungen, Großhandelsrücknahmen, Modifikationsbestellungen usw. verfügbar. Einige Exchanges haben diese Interfaces, andere nicht, und die Funktionalitäten und Nutzungsdetails können sehr unterschiedlich sein.exchange.IO
Die Funktion kann für weitere Informationen in der API-Dokumentation des Erfinders eingesehen werden:https://www.fmz.com/api#exchange.io..Es gibt auch einige praktische IO-Beispielstrategien auf der Inventor Quantified Trading Platform Strategy Square.
Werden alle API-Funktionen in der API-Dokumentation des Erfinders eine Netzwerkanfrage erzeugen?
Wenn wir zunächst sagen, dass die API-Schnittstelle der Börse eine Frequenzbeschränkung (z. B. 5 Mal pro Sekunde) hat, kann die Zugriffshäufigkeit nicht zu häufig sein, sonst wird ein HTTP-429-Fehler gemeldet und die Zugriffshäufigkeit wird abgelehnt (die meisten Börsen melden 429). Nicht alle API-Funktionen von Erfindern erzeugen Netzwerkanfragen. Einige API-Funktionen von Erfindern ändern nur einige lokale Einstellungen, z. B. die Einstellung der aktuellen Handelspare, die Einstellung des Vertragscodes, die Indikatorberechnungsfunktion, die Erfassung des Objektnamens der Börse usw. Grundsätzlich kann man anhand der Funktion erkennen, ob eine Netzwerkanfrage aufgetreten ist, solange die Netzwerkanfragen, die Daten der Börse, die Handlungen an den Börsenkonten usw. erzeugt werden. Diese Schnittstellen müssen die Anruffrequenz beachten.
Hier sind einige häufige Probleme und Erfahrungen, die Erfinder bei der Verwendung von API-Funktionen bei der Quantitative Handelsplattform haben.
Verfehlen Dies ist der häufigste Fehler, der unzählige Neuerungen verursacht, oft Strategien, um alles gut zu überprüfen, alles ist normal, warum läuft die Festplatte für eine Weile (möglicherweise jederzeit ausgelöst) und die Festplatte hängt ab ~
Bei der Erstellung einer Strategie müssen wir die Daten, die von der Schnittstelle zurückgegeben werden, überprüfen, z. B. wenn wir auf der Quantifizierungsplattform des Erfinders diese Codezeile erhalten (das gleiche gilt für den direkten Zugriff auf die Schnittstelle):var ticker = exchange.GetTicker()
Wenn wir das brauchen,ticker
Die Struktur der Variablen (siehe Struktur, die von der GetTicker-Funktion zurückgegeben wird)Last
Wir müssen diese Daten nutzen.var newPrice = ticker.Last
So erhalten Sie die Daten ((newPrice ist???new: neueste,Price: Preis, ja! zusammengefasst!)GetTicker()
Die Funktion lief normal zurück, aber es gab Request Overtime, Netzwerkfehler, Ausfall von Netzwerken, Kabel abgerissen, Baby-Bear-Klammer gezogen und so weiter.GetTicker()
Die Funktion kehrt zurücknull
❖ Zu diesem Zeitpunktticker
Das istnull
Ich werde es wieder besuchen.Last
Wenn Sie ein Programm abbrechen, wird das Strategieprogramm gestoppt.
Es scheint also, dass ein Interface-Call-Fehler (GetTicker-Call-Fehler, der null zurückkehrt) nicht die unmittelbare Ursache für die Festplattenunterbrechung der Strategie ist.null
Die Angabe, dass ein Interface-Call-Fehlschlag keine Festplatte zum Stillstand bringt, ist nicht möglich.
Was tun wir also, um eine außergewöhnliche Festplattenunterbrechung zu vermeiden?
Die Antwort ist, dass die Daten, die von der Schnittstelle zurückgegeben werden, einfach falsch behandelt werden, indem man nur entscheidet, ob die zurückgegebenen Daten richtig sind oder nicht.null
(Javascript ist ein Beispiel, andere Sprachen sind im Grunde ähnlich)
Schreiben Sie einen kurzen Code-Paragraphen (das ist nur eine Anleitung, direkt zu laufen ist eine Unmöglichkeit!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("打印最新价格:", newPrice)
} else {
// 数据为null,不做操作就不会出问题
}
Nicht nurGetTicker
Interfaces müssen Fehler akzeptieren, und Interfaces mit Netzwerkanfragen müssen Fehler akzeptieren, wenn sie einen Rückgabewert verwenden (wenn Sie einen Funktionsrückgabewert verwenden).
Es gibt viele verschiedene Arten, wie man Fehler verzeiht._C()
Funktionen (siehe FMZ API-Dokumentation), eigene fehlerfähige Funktionen, eigene fehlerfähige Mechanismen, eigene Logik.
Über_C()
Wenn Sie eine Funktion verwenden, dann verwenden Sie diese Funktion, und viele Ihrer Neulingen werden es wahrscheinlich falsch machen._C()
Die Funktionsparameter sind Funktionsreferenzen, nicht Funktionsanrufe._C(funcName, param1, param2)
Die Funktion wird von der Funktion FuncName übertragen. Die Funktion wird von FuncName übertragen._C(funcName(param1, param2))
Das ist ein Fehler, der normalerweise in FMZ-API-Dokumentationen geschrieben wird, wenn man die FMZ-API nicht ernsthaft betrachtet.
Nachfolgende Bestellmenge für Bestellungen zum Marktpreis
Die Anzahl der Bestellungen für die Zahlung von Aufträgen ist auch sehr leicht zu verwirren. In dem vorherigen Artikel wurde bereits erwähnt, dass die Anzahl der Bestellungen für Aufträgen für Aufträgen in der Regel ein Betrag ist (die spezifischen Einstellungen für verschiedene Börsen können anders sein, in der Regel werden diese spezifischen Einstellungen für FMZ in der FMZ-API-Dokumentation angegeben).
Das Transaktionspaar ist so eingestellt:LTC_USDT
function main() {
exchange.IO("simulate", true) // 切换为OKEX交易所的模拟盘
exchange.Buy(-1, 1) // 价格是-1,表示下的订单为市价单,数量为1表示下单量是1USDT
}
Da die Börsen im Allgemeinen eine Auftragsbegrenzung haben, werden die weniger als die Begrenzung betragenen Bestellungen nicht vorbestellt (z. B. benötigt die Binance-Kontaktaufnahme, dass jede Einheit größer als 5 USDT erfolgreich ist).
错误 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:]
Richtung der Futures Einer der wichtigsten Faktoren, die bei der Gestaltung einer Futures-Strategie nicht berücksichtigt werden, ist, dass Neulinge häufig Fehler machen, was zu Problemen führt. Wir sehen uns zunächst die Beschreibung in der API-Dokumentation an:https://www.fmz.com/api#exchange.setdirection...
Wir haben nur eine Funktion.Buy
,Sell
Wenn jedoch Futures (Noch kein Problem, es gibt nur Kauf- und Verkaufsgegenstände) in offenen, leeren, offenen und leeren Richtungen sind, dann ist es offensichtlich, dass Buy/Sell nicht so viele Richtungen darstellt, dass man die Funktion einführen muss, um die Futures-Handelsrichtung zu setzen.exchange.SetDirection()
Das ist nicht wahr.
Auf FMZexchange.SetDirection("buy")
(Vorinstellung) undexchange.Buy
Wenn sie zusammen verwendet werden, bedeutet dies, dass die folgende Liste eine Bestellung mit mehr als einer Position darstellt.
Das ist ein Beispiel:exchange.SetDirection("sell")
undexchange.Sell
Wenn sie zusammen verwendet werden, bedeutet dies, dass die folgenden Zellen eine Bestellung für einen leeren Lager sind.exchange.SetDirection("closebuy")
undexchange.Sell
Wenn sie zusammen verwendet werden, bedeutet dies, dass die folgenden Einzelheiten ein einfacher Bestellvertrag sind.exchange.SetDirection("closesell")
undexchange.Buy
Wenn sie zusammen verwendet werden, bedeutet dies, dass die folgenden Zellen für die leere Lagerbestellung gelten.
Normalerweise gibt es neue Treffen.exchange.SetDirection("sell")
undexchange.Buy
Es gibt eine Kombination von Fehlern und Fehlern. Dann gibt es einen Fehler. (Das ist offensichtlich ein logischer Fehler, der von der OCD nicht ausgehalten wird.)
Ein weiterer Fehler von Liu Xiaobo
function main() {
exchange.SetContractType("quarter") // 设置当前合约为季度合约
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("看我市价单下单了,成交了,就有持仓了", exchange.GetPosition())
exchange.SetDirection("closebuy") // closebuy 和Sell 搭配使用,嗯没错~
exchange.Sell(-1, 1)
}
Wenn man das hier sieht, fragt man sich: Warum habe ich eine Lagerhaltung und closebuy und sell auch verwendet werden, wie kann ich falsch melden, kann ich nicht einrichten?
Eine weitere Möglichkeit, dass der Fehler auftritt, ist, wenn die Position korrekt eingestellt ist, die Unterordnungsfunktion korrekt verwendet wird oder die Position in dieser Richtung gehalten wird, aber trotzdem der Fehler gemeldet wird.
Der Grund ist, dass es möglich ist, dass Ihr Programm mehrere Bestellungen aufgegeben hat, dass die anfängliche Bestellung nicht abgewickelt wurde, dass die Bilanz auf der Rechnung hängt und auf eine Transaktion wartet, und dass das Programm weiter nach Bilanz geht, was einen Fehler außerhalb der Bilanzposition anzeigt.
Ausgabe von Logs, Anzeige von Transaktionsinformationen
Entwurf, Programmierung, Quantifizierung von Transaktionsstrategien, Entwurf von Maschineninteraktionen, wie z. B. Anzeigen von Pins, Anzeigen von Pins, Ausgabe von Pins, Betriebsprotokollen, etc.; normalerweise mit nativen Programmiersprachen, um Festplattenskripte, Strategien zu schreiben.
Zum Beispiel:
Python verwendetprint
Das ist nicht wahr.
Javascript verwendetconsole.log
Das ist nicht wahr.
Golang verwendetfmt.Println()
Das ist nicht wahr.
C++ verwendetcout
Die Informationen auf der folgenden FMZ-Plattform zeigen, dass es zwei Hauptplätze für die Anzeige von Informationen auf der quantitativen Handelsplattform der Erfinder gibt.
Zustand Wenn die Festplatte ausgeführt wird, wird die Festplattenseite wie folgt angezeigt:
Der Status-Tablettensatz wird teilweise als Status-Tablettenauskunft angezeigt. Der Status-Tablettensatz dient hauptsächlich der Anzeige von Daten, die in Echtzeit verändert werden (weil Echtzeit-Veränderungen in Echtzeit beobachtet werden müssen und nicht jedes Mal in einem Log gedruckt werden können).
Datenverwendung in der Statusleiste angezeigtLogStatus
Funktionen, die speziell in der FMZ-API-Dokumentation zu finden sind.
Tagebücher Auf der anderen Seite der Plattform sehen Sie folgende Grafik:
Ein Teil der Anzeige ist als Log-Tab dargestellt, die hauptsächlich für die dauerhafte Aufzeichnung bestimmter Daten zu einem bestimmten Zeitpunkt oder für die Aufzeichnung bestimmter Aktionen, die zu einem bestimmten Zeitpunkt durchgeführt wurden, verwendet wird. Es gibt verschiedene Arten von Blogs: 1, Normallogs, in FMZ-Richtlinien mit Log-Funktion Ausgabe, Drucken in Politiklogs.
2. Unter dem Log, die in FMZ-Strategien verwendet wirdexchange.Sell
/exchange.Buy
Die Daten werden automatisch in den Logs ausgeführt.
3. Verwenden Sie das Abrufprotokoll in der FMZ-Strategieexchange.CancelOrder
Das Programm wird automatisch in den Logs ausgeführt.
4. Fehlerlog, wenn die FMZ-Richtlinie ausgeführt wird, wenn die Interface, auf der die Netzwerkanfrage ausgeführt wird, falsch aufgerufen wird, wenn eine Ausnahme (z. B. eine Aussage wie "throw") ausgegeben wird, wird automatisch ein Fehlerlog in das Protokoll ausgeführt.
Die FMZ-API-Funktion, die Log-Ausgabe-Funktionen wie Log (...), exchange (Buy (Price, Amount), exchange (CancelOrder)) und Id (Id) erzeugen kann, kann mit zusätzlichen Ausgabe-Parametern wie: exchange (CancelOrder)) ergänzt werden.
function main() {
Log("数据1", "数据2", "数据3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "附带数据1", data2, "...")
exchange.CancelOrder(id, "附带数据1", data2, "...")
LogProfit(100, "附带数据1", data2, "...")
}
Verwendung von Indikatorfunktionen
Bevor wir über Indikatorfunktionen sprechen, müssen wir erst einmal verstehen, was Indikatoren sind, und zwar einfach Linie, MACD, ATR usw.
Frage: Wie kommen diese Indikatoren dazu?
A: Natürlich.
Frage: Worauf basiert die Berechnung?
Antwort: Die Berechnung basiert auf den Daten der K-Linie.
Frage: Wie wäre es mit einem Beispiel?
A: Bei der einfachsten Anzeige des Gleichlinienindikators, wenn wir die K-Tageslinie (d. h. eine Sonnenstraße oder eine Zelle, die einen Tag darstellt) als Datenquelle für die Berechnung des Indikators verwenden. Die Gleichlinienindikatorparameter sind 10, dann ist der berechnete Durchschnittsindikator die 10-Tage-Gleichlinie.
Frage: Kann man den Mittelwert berechnen, wenn die Anzahl der K-Linien BAR weniger als 10 ist?
A: Nicht nur die Ebenlinienindikatoren können nicht berechnet werden, sondern auch keine Indikatoren können einen effektiven Indikatorwert berechnen, wenn die Anzahl der Daten BAR in K-Linien nicht den Indikatorzyklusparametern entspricht.JavaScript
Sprachstrategien werden angezeigt, wenn Sie die ausgewiesenen Kennzahlen ausdrucken.null
。
Ein Beispiel für eine Lehre gibt es auf der Strategie-Platz:https://www.fmz.com/strategy/125770Wenn Sie diese Lehrbeispielstrategie überprüfen, sehen Sie ein Diagramm, das von einem Rückprüfungssystem erzeugt wird, und die Mittelwerte der 10 Perioden:
Die Strategie ist es, ein eigenes Diagramm zu erstellen, K-Linien zu zeichnen und Gleichlinien zu erstellen:
Frage: Was ist, wenn ich eine 10-Stunden-Linienzeit brauche? Antwort: K-Daten können mit K-Daten für Stundenzyklen verwendet werden.
Es ist üblich zu sagen, dass die Linie K, die wir sehen, eine Matrix ist, die wir nach der Datenisierung einer Matrix (die Konzeption der Matrix ist nicht verstanden, kann Baudelaire), in der jedes Element eine K-Säule ist, die in der Reihenfolge angeordnet ist, in der das erste Element der Matrix am weitesten von der aktuellen Zeit entfernt ist, und das letzte Element der Matrix am nächsten von der aktuellen Zeit entfernt ist. Normalerweise ist der letzte Linienpfosten der K-Liniendaten der Linienpfosten des aktuellen Zyklus, der in Echtzeit verändert wird und unvollständig ist (wenn man sich auf die Seite einer Börse einloggt, kann man die K-Line beobachten). Der berechnete Indikator entspricht auch der K-Linienpfosten.
Auf der Inventor Quantitative Trading Plattform ist es möglich, die TA-Library (eine FMZ-Plattform, die in einem Host integriert ist und in verschiedenen Sprachen direkt verwendet werden kann) oder die talib-Library (eine alte Talib-Indikator-Library, mit JS, C++-Integration, Python muss selbst installiert werden) zu verwenden. Das ist ein Beispiel für die Berechnung der Durchschnittslinie: Mit der TA-Library:
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // 打印均线
}
Mit dem Talib-Konto:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // 打印均线
}
Die berechneten Indikatordaten ma sind eine Matrix, bei der jedes Element eine entsprechende K-Linien-Matrix (records) hat, d.h.ma[ma.length -1]
Entsprechendrecords[records.length - 1]
Ich bin der Meinung, dass es eine gute Idee ist.
Auch andere, kompliziertere Indikatoren sind symmetrisch und müssen beachtet werden, wie MACD.
var macd = TA.MACD(records) // 这样只传入K线数据,不传入指标参数,指标参数采用的就是默认值,其它指标函数也是同理
Bei macd ist die Variable eine zweidimensionale Matrix, die einfach gesagt eine Matrix ist, wobei jedes Element eine Matrix ist. Frage: Warum ist MACD-Indikator-Daten eine zweidimensionale Array? Antwort: Da der MACD-Indikator aus zwei Linien (dif-Line, dea-Line) und einer Menge-Säule (Macd-Menge-Säule, in der Tat kann diese Menge-Säule Daten auch als eine Linie betrachtet werden) besteht, kann die MACD-Variable unterteilt werden:
var dif = macd[0]
var dea = macd[1]
var macdColumn = macd[2]
Hier ist ein vorgefertigtes Lehrbeispiel, ein interessantes Studium:https://www.fmz.com/strategy/151972