[TOC] Je vous en prie.
La plate-forme de trading quantitatif a été restructurée à plusieurs reprises après neuf années d'innovations technologiques, bien que nous, les utilisateurs, ne l'ayons peut-être pas remarqué. Au cours des deux dernières années, la plate-forme a subi de nombreuses améliorations et mises à niveau en termes d'expérience utilisateur, notamment une interface utilisateur entièrement améliorée, de nombreux outils de trading quantitatif couramment utilisés et une meilleure prise en charge des données de retouche.
Pour faciliter la conception des stratégies, rendre la logique de transaction plus claire et faciliter la tâche des débutants, la plateforme a mis à niveau l'API utilisée par les stratégies. Les nouvelles fonctionnalités peuvent être activées par les hôtes utilisant les dernières versions. La plateforme est toujours compatible au maximum avec les appels à l'ancienne interface.
Le livre de grammaire:https://www.fmz.com/syntax-guideLe guide de l'utilisateur:https://www.fmz.com/user-guide
Dans cet article, nous allons voir quelles sont les mises à jour de l'interface et quelles sont les modifications nécessaires pour que les anciennes stratégies soient compatibles avec l'API actuelle.
Cette interface de marché agrégé est indispensable pour concevoir des stratégies multiculturelles, des stratégies de surveillance des marchés à l'échelle du marché.
Si l'échange n'a pas cette interface (exchange individuel), appelerexchange.GetTickers()
Il y a une erreur dans les rapports: pas de soutien.
La fonction n'a aucun paramètre et renvoie des données de marché en temps réel de toutes les variétés dans l'interface de marché.
exchange.GetTickers()
La fonction estexchange.GetTicker()
La variété complète des versions demandées de fonctions (attention, la différence entre les deux noms de fonctions est un simple nombre multiple) ‒
Nous avons testé les environnements avec OKX Live Simulation Disks:
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
}
Une nouvelle augmentationexchange.CreateOrder()
Les fonctions peuvent être considérées comme l'élément clé de cette mise à niveau.exchange.CreateOrder()
La fonction la plus importante est de spécifier directement dans les paramètres de la fonction la variété, la direction de l'ordre. Ainsi, il n'est plus nécessaire de dépendre des paires de transactions, du code de contrat, de la direction de transaction, etc. actuellement définies par le système.
Dans les scénarios de transaction multi-variété, la complexité de la conception est considérablement réduite dans les scénarios de synchronisation.exchange.CreateOrder()
Les quatre paramètres de la fonction sont:symbol
、side
、price
、amount
。
Tests environnementaux en utilisant le simulateur de disque à terme OKX:
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)
}
C'est juste trois fois.exchange.CreateOrder()
L'appel à la fonction a déclenché trois sortes d'ordres à terme, dans différentes directions.
Une nouvelle augmentationexchange.GetHistoryOrders()
La fonction est utilisée pour obtenir des ordres historiques de transaction d'une certaine variété, qui nécessite également le support d'une interface d'échange.
Les interfaces mises en œuvre par les échanges sont très différentes pour la recherche d'ordres historiques:
Pour que ce type d'interface soit enveloppé avec le plus grand degré de compatibilité, il est nécessaire de veiller à ce qu'il réponde aux besoins et aux attentes de la stratégie.
Pour plus de détails sur les fonctions, consultez le manuel de syntaxe de l'API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Les tests sont effectués dans des environnements de disque en direct en binaire:
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) + "`")
}
L'ancienne version de la fonction d'accès aux données stockées étaitexchange.GetPosition()
Cette mise à niveau ajoute une nouvelle fonction d'acquisition de stockage pour mieux convenir à la syntaxe de la dénomination des fonctions:exchange.GetPositions()
│ tout en restant compatible/amélioré avec la fonction GetPosition│
exchange.GetPositions()
Les fonctions sont appelées de trois façons:
Tests environnementaux en utilisant le simulateur de disque à terme OKX:
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) + "`")
}
Lorsque vous entrezexchange.GetPositions()
Le paramètre de la fonction estETH_USDT.swap
Il est possible d'obtenir des données de détention de contrats permanents U-bit de l'ETH.
Lorsque vous entrezexchange.GetPositions()
Le paramètre de la fonction est une chaîne vide.""
Il est facile d'obtenir les données de stockage de tous les contrats U.
Fonction de champexchange.GetTicker()
Cette mise à niveau est principalement due à l'ajout de paramètres de symbole. Cela permet à la fonction de se détacher de la paire de transactions actuelle, de demander des informations de variété directement selon le code de contrat spécifié par le paramètre, de demander des données de marché.
Paramètressymbol
Pour les objets de l'échangeexchange
Il existe différents formats de titres en espèces/futures:
AAA_BBB
L'AAA est la monnaie de base, la BBB est la monnaie de devises. Les noms des devises sont en majuscules.
Par exemple: BTC_USDT, une paire de transactions instantanées.AAA_BBB.XXX
AAA représente la monnaie de base, BBB représente la monnaie de devises, XXX représente le code du contrat, par exemple le swap de contrat permanent.
Par exemple: BTC_USDT.swap, un contrat à durée indéterminée en U de BTC.Tests en milieu réel à l'aide d'un disque de devises binaires:
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
}
La demande d'un ensemble de données de marché pour les variétés spécifiées est devenue plus simple.
C'est la même chose que la fonction GetTicker.exchange.GetDepth()
La fonction a également ajouté un paramètre symbole.
Tests en milieu réel à l'aide d'un disque de devises binaires:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
C'est la même chose que la fonction GetTicker.exchange.GetTrades()
La fonction a également ajouté le paramètre symbole.
Tests en milieu réel à l'aide d'un disque de devises binaires:
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) + "`")
}
Cette mise à niveau est également compatible avec le passage.exchange.Go()
Les fonctions sont appelées simultanément à l'API de la plate-forme pour transmettre des informations sur les variétés spécifiées par les paramètres de symbole.
La fonction GetRecords a apporté des modifications majeures, en plus de prendre en charge l'information de la variété des données de ligne K spécifiées directement par les paramètres de symbole. Elle a conservé les paramètres de période d'origine pour spécifier les périodes de ligne K et a ajouté un paramètre limit pour spécifier la longueur de ligne K souhaitée pour la période de demande.
exchange.GetRecords()
Comment appeler une fonction:
Tests en milieu réel à l'aide d'un disque de devises binaires:
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)
}
La fonction GetOrders a été ajoutée.symbol
Paramètres permettant de spécifier directement la variété de requête pour une commande en cours d'achèvement (liste suspendue); également prise en charge de la requête pour toutes les listes suspendues (liste sans variété); compatibilité avec l'appel d'origine.
exchange.GetOrders()
Les fonctions peuvent être appelées de la façon suivante:
Tests environnementaux en utilisant le simulateur de disque à terme OKX:
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) + "`")
}
Lorsque le paramètre n'est pas transmis, la demande par défaut de la paire de transactions BTC_USDT en cours, de tous les comptes en suspens non terminés pour les contrats de swap permanents.
Paramètres spécifiésETH_USDT.swap
Lorsqu'un paramètre est demandé, toutes les listes suspendues non terminées des contrats permanents de la paire de transactions ETH_USDT sont demandées.
Envoyer une chaîne vide""
Les clients de USDT ont été invités à se connecter à la plate-forme USDT.
Le nom de l'ancienne fonction d'accès au stockage est toujours compatible, et un paramètre symbole a également été ajouté pour spécifier la variété d'informations sur les données de stockage requises.
L'utilisation des fonctions etexchange.GetPositions()
Je suis très heureux de vous voir.
Pourexchange.IO("api", ...)
L'appel des fonctions, qui a été mis à niveau pour tous les objets de l'échange, prend en charge une fonctionnalité d'adresse de demande complète pour le transfert direct.
Par exemple, si vous souhaitez appeler l'interface OKX:
// GEThttps://www.okx.com/api/v5/compte/max-retrait ccy: BTC
Prise en charge de l'écriture directe des adresses de basehttps://www.okx.com
Vous n'avez pas besoin de changer d'adresse de base pour appeler la fonction IO.
Tests environnementaux en utilisant le simulateur de disque à terme OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
L'amélioration a eu un impact majeur sur lesexchange.GetOrder(id)
Paramètres de la fonctionid
Le paramètre id a été modifié à partir de l'id d'ordre d'échange d'origine en un format de chaîne contenant une variété de transactions.
L'ID de toutes les commandes en boîte sur la plateforme FMZ est le même.
Par exemple:
123456
Avant cette mise à niveau, pour appeler la fonction GetOrder, l'ID de l'ordre est:123456
。BTC-USDT
Je ne sais pas.
Notez qu'il s'agit d'un code de la variété de transactions nommé par l'échange et non d'une paire de transactions définie par la plate-forme FMZ.Il y a eu une augmentation du nombre de personnes qui ont été vaccinées.exchange.GetOrder(id)
Le format de l'id du paramètre que la fonction doit transmettre est ajusté à:BTC-USDT,123456
。
Il y a un peu de temps, j'ai commencé à écrire des articles sur la façon dont les gens se comportaient. Cette fois, la fonction CreateOrder a été améliorée pour spécifier directement la variété de l'ordre d'achat (la variété de l'ordre d'achat et la paire de transactions actuellement configurée, le code de contrat peut être différent), si l'ID de l'ordre retourné ne contient pas d'informations sur la variété.
Comment concilier cette influence: Si l'ordre est envoyé directement par l'interface de commande de l'échange. Si la commande est envoyée directement par l'interface de commande de l'échange. Si la commande est envoyée par l'intermédiaire de l'interface de commande de l'échange. De même, si vous utilisez l'interface de sous-commande enveloppée dans la plate-forme FMZ, il suffit de supprimer le code de la variété et les virgules si vous avez besoin d'utiliser l'ID original de l'ordre, car la partie initiale de l'ordre Id est le code de la variété de transaction.
Cette mise à niveau est une bonne chose.exchange.CancelOrder()
L'influence des fonctionsexchange.GetOrder()
La fonction est la même.
Cette mise à niveau est une bonne chose.exchange.Buy()
L'influence des fonctionsexchange.GetOrder()
La fonction est la même.exchange.Buy()
L'Id de l'ordre retourné par la fonction est une nouvelle structure, comme celle retournée lors de la souscription d'un ordre à terme sur l'échange OKX:LTC-USDT-SWAP,1578360858053058560
。
Cette mise à niveau est une bonne chose.exchange.Sell()
L'influence des fonctionsexchange.GetOrder()
La fonction est la même.exchange.Sell()
L'Id de l'ordre retourné par la fonction est une nouvelle structure, comme celle retournée lors de la souscription d'un ordre à terme sur l'échange OKX:ETH-USDT-SWAP,1578360832820125696
。
Cette mise à jour a ajouté un champ Symbol au constructeur Ticker, qui enregistre les informations de marché sur la variété de la structure Ticker actuelle.
Le format du champ estexchange.GetTicker()
Le format des paramètres de symbole de la fonction est parfaitement identique.
Cette mise à jour a ajouté un champ Symbol à la structure Order, qui est formaté avec les paramètres suivants:exchange.GetTicker()
Le format des paramètres de symbole de la fonction est parfaitement identique.
Cette mise à jour modifie également le champ Id de la structure Order pour enregistrer les informations de variété, les informations d'ordre originales et les références dans le nouveau format Order Id.exchange.GetOrder()
Les instructions de l'ordre Id dans la fonction ne sont plus décrites ici.
Cette mise à jour a ajouté un champ Symbol au constructeur Position, qui est formaté avec le format de la page de destination.exchange.GetTicker()
Le format des paramètres de symbole de la fonction est parfaitement identique.
Pour répondre aux besoins des utilisateurs, la mise à niveau est effectuée sur le disque virtuel et la mise à jour du système de retouche sera terminée dans une semaine. Si le code de la politique individuelle est affecté, veuillez modifier la mise à jour en suivant les instructions de cet article.
Fonctions membres pour les objets d'échanges à termeGetAccount
RetourAccount
La structure a été étendue.
équité La majorité des titres d'actifs de garantie, à l'exception de certains marchés à terme, supportent ce champ. Il est principalement utilisé pour calculer les gains et les pertes de garantie en temps réel.
L'UPnL Les gains et pertes non réalisés de toutes les positions actuellement détenues dans les actifs de garantie monétaires, à l'exception de certains échanges à terme, sont majoritairement favorables au secteur.
La fonction membre SetMarginLevel pour les objets de l'échange à terme a été améliorée en ajoutant le symbole des paramètres.
Voici un exemple de test:
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)
}
Je suis désolée.J'ai demandé ce qui s'était passé avec mon nouveau robot, et le retour d'ID avec le nom de la transaction, j'ai étudié pendant longtemps, et les informations du journal après la commande ne s'affichent plus maintenant, aussi à cause de la mise à jour de l'administrateur?
Je ne peux pas le faire.Je ne peux pas vous dire ce que je fais. Le problème a-t-il été causé par cette mise à jour?
écnemuse 希望exchange.Buy函数能增加开止损单的功能。。
Nom de la sociétéVue de l'avant
Je suis désolée.Ça va.
L'inventeur de la quantification - un petit rêveBien, essayez-le sur ce site. Merci de poser votre question. Nous allons le traiter au plus vite.
Je suis désolée.Oui, extMsg1, extMsg2 n'est pas affiché.
L'inventeur de la quantification - un petit rêveBonjour, l'ID de l'ordre est une modification impérative, car une mise à niveau de l'ordre spécifiant directement la variété doit inclure des informations sur la variété dans l'ID de l'ordre, sinon il n'est pas possible de déterminer quelle est la variété de l'ordre et ne peut pas être appelé lors du retrait (car la plupart des bourses doivent spécifier la variété et spécifier l'ID lors du retrait). Vous avez dit que le message après la commande ne s'affiche pas, c'est-à-dire: exchange.Buy ((price, amount, extMsg1, extMsg2), est-ce que extMsg1, extMsg2 ne s'affichent pas dans les journaux lors de l'appel?
L'inventeur de la quantification - un petit rêveBonjour, vous pouvez télécharger les paramètres actuels de l'échange, des paires de transactions et des codes de contrats.
Inventeur de la quantificationS'il vous plaît envoyer les détails du code de test et de la configuration sur le formulaire, l'ingénieur vous répondra au premier moment.
L'inventeur de la quantification - un petit rêveLes échanges ont des différences importantes, comme le mécanisme de conditionnalisation, et le niveau de soutien varie, et nous allons voir si cela est possible.
L'inventeur de la quantification - un petit rêveMerci pour votre soutien, et si vous avez des problèmes, envoyez-nous un formulaire ou un message.