[TOC]
Die Erfinder der Quantitative-Trading-Plattform haben sich nach neun Jahren technischer Inbetriebnahme mehrmals umgebaut, obwohl wir als Nutzer es vielleicht nicht bemerkt haben. In den letzten zwei Jahren wurden die Plattformen in Bezug auf die Benutzererfahrung erheblich optimiert und verbessert, einschließlich einer umfassenden Upgrade der Benutzeroberfläche, einer Vielzahl von häufig verwendeten Quantitative-Trading-Tools und der Hinzufügung von mehr Retweet-Daten-Unterstützung.
Um die Konstruktion von Strategien zu erleichtern, die Transaktionslogik zu klären und für Anfänger einfacher zu handhaben, wurde die API-Schnittstelle für die Strategien aktualisiert. Die neuen Funktionen können mit den neuesten Versionen der Administratoren aktiviert werden. Die Plattform ist weiterhin maximal kompatibel mit den Anrufen der alten Schnittstellen.
Das Grammatikhandbuch:https://www.fmz.com/syntax-guideBenutzerhandbuch:https://www.fmz.com/user-guide
Lassen Sie uns in diesem Artikel einen Überblick darüber geben, welche Upgrades für die Interface verfügbar sind und welche Änderungen an den alten Strategien erforderlich sind, um die aktuelle API zu unterstützen.
Eine solche aggregierte Markt-Interface ist unerlässlich, um Strategien leichter zu entwickeln und zu vermeiden, dass sich die Räder wiederholen.
Wenn eine Börse keine solche Schnittstelle hat (eine einzelne Börse), rufen Sieexchange.GetTickers()
Ich habe das Gefühl, dass ich das nicht kann.
Die Funktion hat keine Parameter und liefert Echtzeit-Marktdaten für alle Arten von Anwendungen in der Anwendungs-Interface zurück.
exchange.GetTickers()
Die Funktion istexchange.GetTicker()
Eine vollständige Version der Funktion wird angefordert (siehe genau, die Unterscheidung zwischen den beiden Funktionsnamen ist nur ein einziger Komplex).
Wir testen die Umgebung mit OKX Live Simulation:
function main() {
exchange.IO("simulate", true)
var tickers = exchange.GetTickers()
if (!tickers) {
throw "tickers error"
}
var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var i in tickers) {
var ticker = tickers[i]
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return tickers.length
}
Neueexchange.CreateOrder()
Die Funktion ist ein Schwerpunkt des Upgrades.exchange.CreateOrder()
Die größte Funktion der Funktion ist es, die Art und Richtung der Bestellung direkt in den Parametern der Funktion anzugeben. So hängt die Einstellung nicht mehr von den aktuellen Einstellungen des Systems ab.
In den Szenarien mit einer Vielzahl von Transaktionen reduziert sich die Designkomplexität in den Szenarien mit einer Reihe von Synchronisationen erheblich.exchange.CreateOrder()
Die vier Parameter der Funktion sind:symbol
、side
、price
、amount
。
Tests mit OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}
Das ist nur drei Mal.exchange.CreateOrder()
Die Funktionsanrufe führen zu drei verschiedenen Futures-Orders, die in verschiedene Richtungen verlaufen.
Neueexchange.GetHistoryOrders()
Eine Funktion, die verwendet wird, um historische Transaktionsorders einer bestimmten Art zu erhalten, die auch von der Exchange-Schnittstelle unterstützt werden muss.
Für die Suche nach historischen Aufträgen gibt es große Unterschiede in den Interfaces, die von den verschiedenen Börsen implementiert werden:
Für die Verpackung dieser Art von Interfaces mit der größtmöglichen Kompatibilität ist in der Praxis darauf zu achten, ob sie den Bedürfnissen und Erwartungen der Strategie entsprechen.
Die Funktionsbeschreibung ist hier nicht mehr beschrieben. Sie können sich die Syntax-Handbuch in der API-Dokumentation ansehen:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Bei der Erprobung in einer realen Umgebung mit Binance Cash:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// 写入图表
var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) + "`")
}
Die alte Version der Datenspeicherfunktion heißtexchange.GetPosition()
In diesem Upgrade wurde eine neue Akquisitions-Holding-Funktion hinzugefügt, um die Funktionsnamen-Semantik besser zu passen:exchange.GetPositions()
Und zwar mit GetPosition-Funktionen.
exchange.GetPositions()
Die Funktion kann in drei Formen aufgerufen werden:
Tests mit OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("")
var tbls = []
for (var positions of [p1, p2]) {
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Wenn es kommtexchange.GetPositions()
Die Parameter der Funktion sind:ETH_USDT.swap
In diesem Fall können Sie die Lagerdaten von ETH-U-Bit-Permanenten-Kontrakten abrufen.
Wenn es kommtexchange.GetPositions()
Die Parameter der Funktion sind leere Strings.""
Wenn Sie die Daten von allen U-Bits-Kontrakten im Lager haben, ist das nicht sehr praktisch.
Funktionenexchange.GetTicker()
Das Upgrade besteht hauptsächlich aus der Erweiterung der Symbol-Parameter. Die Funktion kann sich von den aktuellen Handelsparen lösen, die Art der Informationen, die der Vertragskode direkt nach den Parametern angegeben wird, anfordern und Marktdaten anfordern. Der Code-Schreibprozess wird vereinfacht.
Parametersymbol
Gegenstand der Börseexchange
Es gibt verschiedene Formate für Bargeld/Futures:
AAA_BBB
Die Basiswährung wird von AAA angegeben, die Währung wird von BBB angegeben.
Ein Beispiel: BTC_USDT ist ein Bargeld-Paar.AAA_BBB.XXX
AAA steht für die Basiswährung, BBB für die Quotewährung, und XXX für den Vertragscode, z. B. für den dauerhaften Vertragsswap.
Beispiel: BTC_USDT.swap, ein dauerhaftes U-Bit-Kontrakt für BTC.Tests in einer realen Umgebung mit Binance-Futures:
var symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]
function main() {
exchange.SetCurrency("ETH_USD")
exchange.SetContractType("swap")
var arr = []
var t = exchange.GetTicker()
arr.push(t)
for (var symbol of symbols) {
var ticker = exchange.GetTicker(symbol)
arr.push(ticker)
}
var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var ticker of arr) {
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return arr
}
Die Anforderung einer Reihe von Markendaten für bestimmte Sorten wird einfacher.
Dies ist die gleiche Funktion wie bei GetTicker.exchange.GetDepth()
Die Funktion hat auch die Symbol-Parameter hinzugefügt. Es ist möglich, die Sorte direkt bei der Anfrage von Tiefendaten anzugeben.
Tests in einer realen Umgebung mit Binance-Futures:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
Dies ist die gleiche Funktion wie bei GetTicker.exchange.GetTrades()
Die Funktion hat auch Symbol-Parameter hinzugefügt. Es ist möglich, die Sorte direkt bei der Anfrage von Markttransaktionsdaten anzugeben.
Tests in einer realen Umgebung mit Binance-Futures:
function main() {
var arr = []
var arrR = []
var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]
for (var symbol of symbols) {
var r = exchange.Go("GetTrades", symbol)
arrR.push(r)
}
for (var r of arrR) {
arr.push(r.wait())
}
var tbls = []
for (var i = 0; i < arr.length; i++) {
var trades = arr[i]
var symbol = symbols[i]
var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
for (var trade of trades) {
tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Das Upgrade ist ebenfalls kompatibel.exchange.Go()
Die Funktion wird gleichzeitig von der Plattform-API aufgerufen, um Symbol-Parameter zur Spezifikation der Spezies zu übermitteln.
Die GetRecords-Funktion unterstützt nicht nur die Art der Informationen für die K-Strängendaten, die die Symbol-Parameter direkt für die Anfrage angeben. Die ursprüngliche Period-Parameter, die für die Angabe der K-Strängenzyklen verwendet werden, werden beibehalten. Ein Limit-Parameter wird hinzugefügt, um die gewünschte K-Strängengradlänge für die Anfrageperiode anzugeben.
exchange.GetRecords()
Funktionen können aufgerufen werden:
Tests in einer realen Umgebung mit Binance-Futures:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
var r1 = exchange.GetRecords()
var r2 = exchange.GetRecords(60 * 60)
var r3 = exchange.GetRecords("BTC_USDT.swap")
var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)
Log("r1相邻Bar时间差值:", r1[1].Time - r1[0].Time, "毫秒, Bar长度:", r1.length)
Log("r2相邻Bar时间差值:", r2[1].Time - r2[0].Time, "毫秒, Bar长度:", r2.length)
Log("r3相邻Bar时间差值:", r3[1].Time - r3[0].Time, "毫秒, Bar长度:", r3.length)
Log("r4相邻Bar时间差值:", r4[1].Time - r4[0].Time, "毫秒, Bar长度:", r4.length)
Log("r5相邻Bar时间差值:", r5[1].Time - r5[0].Time, "毫秒, Bar长度:", r5.length)
}
Die GetOrders-Funktion wurde ebenfalls hinzugefügt.symbol
Parameter, mit denen die Sorten direkt angezeigt werden können, die zurzeit nicht ausgefüllt sind; Unterstützung für die Abfrage aller Sorten; Kompatibilität mit den ursprünglichen Aufrufen.
exchange.GetOrders()
Die Funktion kann folgendermaßen aufgerufen werden:
Tests mit OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// 写入图表
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", ""]) {
var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
var orders = null
if (symbol == "null") {
orders = exchange.GetOrders()
} else {
orders = exchange.GetOrders(symbol)
}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Wenn keine Parameter übermittelt werden, werden standardmäßig alle noch nicht abgeschlossenen Hängeschilder für das aktuelle BTC_USDT-Paar und Swap-Permanente-Kontrakte angefordert.
Angabe der ParameterETH_USDT.swap
Bei der Anfrage ETH_USDT werden alle unvollendeten Pending Lists für dauerhafte Verträge angezeigt.
Einladen eines leeren Strings""
Die US-amerikanische Regierung hat eine Reihe von Anfragen an die US-amerikanische Regierung gestellt, um alle USDT-Standortverträge zu beantragen.
Es ist weiterhin kompatibel mit den alten Speicher-Erfassung-Funktion-Namen, und es wurde auch ein Symbol-Parameter hinzugefügt, um die Sorteninformationen für die Speicherdaten zu spezifizieren, die speziell angefordert werden.
Funktionsanwendungen undexchange.GetPositions()
Ich bin der Meinung, dass das nicht wahr ist.
Fürexchange.IO("api", ...)
Funktionsanrufe, die für alle Austauschobjekte aktualisiert wurden, unterstützen die direkte Übermittlung der vollständigen Anfrageadresse.
Zum Beispiel, wenn Sie die OKX-Schnittstelle aufrufen möchten:
// GEThttps://www.okx.com/api/v5/Konto/maximale Auszahlungszeit: BTC
Unterstützt die direkte Eingabe von Adressenhttps://www.okx.com
, ohne dass man die Basisadresse wechseln muss, um die IO-Funktion wieder aufzurufen.
Tests mit OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
Das Ergebnis war ein starker Aufschwung.exchange.GetOrder(id)
Parameter der Funktionid
Die,id-Parameter wurden von der ursprünglichen Börsen-Order-id in ein Stringformat umgewandelt, das eine Handelsart enthält.
Die Bestell-ID für alle auf der FMZ Plattform verpackten Bestellungen ist in diesem Format.
Zum Beispiel:
123456
Vor diesem Upgrade sollte die GetOrder-Funktion mit der Order-Id ausgeliefert werden, die123456
。BTC-USDT
Das ist nicht wahr.
Beachten Sie, dass hier die Code für die Handelssorten genannt werden, die von den Börsen benannt werden, und nicht die Paare, die von der FMZ-Plattform definiert werden.Ich bin der Ansicht, dass es eine gute Idee ist.exchange.GetOrder(id)
Das Format der Parameter-id, die die Funktion übermitteln soll, wird angepasst:BTC-USDT,123456
。
Ich möchte erst einmal erklären, warum ich es so gestaltet habe: Da die CreateOrder-Funktion in diesem Fall aktualisiert wurde, um die Sorte des Auftrags direkt anzugeben (die Sorte des Auftrags und das derzeit eingestellte Transaktionspaar, der Vertragskode kann unterschiedlich sein), kann die Order-Id nicht verwendet werden, wenn die zurückgegebene Order-Id keine Sorteninformationen enthält.
Wie lässt sich dieser Einfluss kombinieren: Wenn die Auftragserstellung mit der exchange.IO-Funktion durchgeführt wird, die die Auftragserstellungsschnittstelle der Börse direkt aufruft, werden im Allgemeinen die ursprünglichen Symbole der Börse (Variantecode) und die ursprüngliche Auftragsid zurückgegeben. Wenn die beiden mit einem Komma zusammengefügt werden, entspricht die Auftragsid der FMZ-Plattform. Auch wenn die Unterordnungsoberfläche, die mit der FMZ-Plattform verpackt ist, verwendet wird, kann der Unterordnungscode und die Kommas entfernt werden, wenn die ursprüngliche Id der Bestellung verwendet werden muss, da der Anfang der OrderId der Transaktionsvarietätcode ist.
Die Erweiterungexchange.CancelOrder()
Einfluss der Funktion aufexchange.GetOrder()
Die Funktion ist die gleiche.
Die Erweiterungexchange.Buy()
Einfluss der Funktion aufexchange.GetOrder()
Die Funktion ist die gleiche.exchange.Buy()
Die Funktion liefert eine neue Struktur an, z. B. die ID, die beim Auftragen von Futures auf der OKX-Börse zurückgegeben wird:LTC-USDT-SWAP,1578360858053058560
。
Die Erweiterungexchange.Sell()
Einfluss der Funktion aufexchange.GetOrder()
Die Funktion ist die gleiche.exchange.Sell()
Die Funktion liefert eine neue Struktur an, z. B. die ID, die beim Auftragen von Futures auf der OKX-Börse zurückgegeben wird:ETH-USDT-SWAP,1578360832820125696
。
Die Aktualisierung des Ticker-Strukturs ergänzt das Symbol-Feld, das Marktinformationen über die Art der aktuellen Ticker-Strukturen erfasst.
Das Feld ist in Form vonexchange.GetTicker()
Die Symbolparameter der Funktion sind vollständig übereinstimmend.
Dieses Update für den Order-Strukturen fügt ein Symbol-Feld hinzu, das in der Form vonexchange.GetTicker()
Die Symbolparameter der Funktion sind in vollständigem Einklang.
Das Update ändert auch das Id-Feld der Order-Struktur, um Sorteninformationen, ursprüngliche Bestellinformationen und Referenzen in einem neuen Order-Id-Format zu erfassen.exchange.GetOrder()
Eine Beschreibung der Order-Id in der Funktion wird hier nicht mehr beschrieben.
Das Update erweiterte die Position-Struktur um ein Symbol-Feld.exchange.GetTicker()
Die Symbolparameter der Funktion sind vollständig übereinstimmend.
Das Upgrade wird erst für die Festplattenkompatibilität durchgeführt, um den Bedürfnissen der Benutzer gerecht zu werden, und das Retesting-System wird innerhalb einer Woche vollständig angepasst sein. Wenn einzelne Politikcodes betroffen sind, wenden Sie sich an diesen Artikel.
Mitgliederfunktionen für Futures-ObjekteGetAccount
Die RückkehrAccount
Die Struktur wurde erweitert.
Gleichheit Derzeit unterstützen die meisten, mit Ausnahme von sehr speziellen Futures-Börsen, den gesamten Anspruch auf die Währung der Sicherungswerte.
UPnL Alle derzeit gehaltenen Positionen in Sicherungsgeld-Währungen sind unerfüllte Gewinne und Verluste, mit Ausnahme von sehr speziellen Futures-Börsen, die nicht unterstützen, die meisten unterstützen das Feld.
Die SetMarginLevel-Mitgliedsfunktion für Futures-Exchange-Objekte wurde mit dem Hinzufügen des Parametersymbols verbessert.
Testbeispiel:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// 当前交易对为ETH_USDT,合约代码为swap,设置杠杆值为10
exchange.SetMarginLevel(10)
// 直接指定交易对BTC_USDT,合约代码swap,设置杠杆值20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}
Was ist los?Ich frage mich, was mit meinem neu gestarteten Roboter passiert ist, die Rücksendung ID mit den Namen der Transaktionen, die ich lange recherchiert habe, und die Log-Informationen nach der Bestellung, die jetzt nicht angezeigt werden, auch wegen der Aktualisierung durch den Administrator?
Das ist Zhang./upload/asset/2ffc0f961149326b78aed.png Kann ich fragen, ob das Problem durch dieses Interface-Update verursacht wurde?
Eckmusch 希望exchange.Buy函数能增加开止损单的功能。。
NansegVorreihengrundbild
Was ist los?Gut.
Die Erfinder quantifizieren - Kleine TräumeDas ist eine gute Idee, aber es ist nicht einfach, es zu versuchen.
Was ist los?Ja, extMsg1, extMsg2 ist nicht angezeigt.
Die Erfinder quantifizieren - Kleine TräumeHallo, Order-ID ist eine notwendige Änderung, da die Angabe der Sorte direkt in die Bestellung aufgerüstet wurde. Die Bestell-ID muss Sorteninformationen enthalten, sonst kann nicht festgestellt werden, welche Sorte die Bestellung ist, und kann nicht bei der Widerrufsanforderung aufgerufen werden. Sie haben gesagt, dass die Nachschlagsanzeige nicht angezeigt wird, was bedeutet: exchange.Buy ((preis, Menge, extMsg1, extMsg2) bei einem Aufruf wird extMsg1, extMsg2 nicht im Log angezeigt?
Die Erfinder quantifizieren - Kleine TräumeHallo, hier sind die aktuellen Börsen-Einstellungen, Handelspare und Kontrakt-Code-Einstellungen.
Der Erfinder quantifiziertBitte senden Sie Testcode und Konfigurationsdetails an die Bauplanung, und die Ingenieure werden Ihnen gleich zurückschreiben.
Die Erfinder quantifizieren - Kleine TräumeEs gibt einige Unterschiede zwischen den Bedingungen der Börsen, wie z.B. ein Einheitsmechanismus, und es gibt unterschiedliche Grade der Unterstützung, die wir untersuchen müssen, um zu sehen, ob dies möglich ist.
Die Erfinder quantifizieren - Kleine TräumeIch danke für die Unterstützung, wenn Sie Probleme mit der Nutzung haben, können Sie mir eine Anfrage oder einen Kommentar schreiben.