[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.
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 a ajouté 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│
Notez que les deux noms de fonctions ne diffèrent que par un s terminé, car GetPositions est plus sémantique, il est donc recommandé d'utiliser GetPositions pour les suivantes.
exchange.GetPositions()
Les fonctions sont appelées de trois façons:
Je ne peux pas le faire. Si aucun paramètre n'est transmis, il est utilisé selon les paramètres actuels.Les échanges / Le code du contratLe paramètre qui demande les données de stockage de toutes les variétés de la dimension actuelle.
Le prix de l'échange.GetPositions est le prix de l'échange.
Lorsque vous spécifiez des informations sur une variété spécifique (ETH_USDT.swap, tel que défini par la plate-forme FMZ), les données de stockage pour une variété spécifique sont demandées.
Par exemple:BTC_USD.swap
、ETH_USDT.swap
、ETH_USDT.quarter
Je ne sais pas.
BTC_USD.swap: Un contrat permanent sur le prix de la monnaie BTC.
ETH_USDT.swap: Le contrat de perpétuité en U-bit de l'ETH.
ETH_USDC.swap:Contract de perpétuité à USDC de l'ETH. (en plus de USDT, vous pouvez spécifier une autre monnaie de quotation, sans détail)
ETH_USDT.quarter: Le taux d'échange de l'ETH en U par trimestre est d'environ
BTC_USD.BTC-USD-201226-24250-C: Contrats d'options sur le lieu de dépôt de BTC.
Les options de change sont les suivantes: Les données de stockage de toutes les variétés sont demandées selon la gamme de dimensions spécifiée. USDT.swap: U est la portée du contrat permanent. USDT.futures: U est le taux d'échange approximatif. USDC.swap: portée du contrat permanent USDC local. (en plus de USDT, vous pouvez spécifier une autre devises de devises, sans plus de précisions) USDC.futures: le taux de change USDC est approximatif. USD.swap: portée des contrats permanents sur le prix de la monnaie. USD.futures: le taux d'échange de la devise est approximatif. USDT.option: U est la portée du contrat d'options. USD.option: le champ d'application des contrats d'options sur le marché monétaire.
Il y a des échanges spéciaux dans lesquels les contrats sont divisés en dimensions: USDT.futures_combo:Futures_Deribit est une bourse américaine. USD.futures_ff: Le taux de change des futures_Kraken est approximatif. USD.swap_pf:Futures_Kraken est une bourse américaine de titres mixtes.
Pour les dimensions qui ne sont pas prises en charge par l'API de l'échange, l'erreur est de retourner une valeur nulle lors de l'appel.
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("BTC_USDT.swap")
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.
Ne pas entrerexchange.GetPositions()
Les paramètres de la fonction permettent d'obtenir les données de détention de tous les contrats perpétuels U-bit mis en ligne sur l'échange (parce que la paire de transactions actuelle est BTC_USDT, le contrat est un swap, selon la paire de transactions actuelle, la demande de portée du contrat), ce qui équivaut à un appel.exchange.GetPositions("USDT.swap")
, spécifier une plage de requêtes.
La nouvelle fonction GetFundings permet d'obtenir le taux de financement des contrats à terme sur les marchés à terme. La fonction a un symbole de paramètre. La fonction renvoie une structure de financement.
BTC_USDT.swap
Les paramètres symboliques ne sont pas pris en charge.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 une variété spécifique et de rechercher des commandes inachevées pour cette variété (listes en suspens); mais aussi de rechercher des commandes inachevées pour toutes les variétés dans une plage de dimensions spécifiée (listes en suspens).
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", "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) + "`")
}
ETH_USDT.swap
Lorsque le paramètre est utilisé, l'ordre inachevé (" ordre suspendu ") de l'USDT pour le contrat permanent demandé par l'ETH."USDT.swap"
Les commandes en suspens sont demandées pour toutes les commandes en suspens de l'USDT.Il est toujours compatible avec l'ancien nom de la fonction d'acquisition de stockage, et a également ajouté un paramètre de symbole permettant de spécifier des informations sur la variété des données de stockage demandées.exchange.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 de l'échange original pour un format de chaîne contenant la variété de transactions.
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
。
Seuls les objets de l'échange de contrats à terme supportent cette fonction, et les deux fonctionnalités sont parfaitement compatibles.
L'ancienne définition: exchange.GetPosition () fonction, sans spécifier de paramètres, est appelée pour obtenir les données de détention de la paire de transactions en cours.
Modification de la définition de la fonction: exchange.GetPosition ((), qui ne spécifie aucun paramètre et qui obtient une position pour toutes les variétés de paires de transactions, dans la gamme de dimensions définies par le code du contrat.
Par exemple, la paire en cours est BTC_USDT et le code du contrat est swap.
exchange.GetPosition() // 等价于调用 exchange.GetPosition("USDT.swap")
La fonction demande les données de stockage des contrats permanents en U-bit pour toutes les devises.
1° Pour les bourses en espèces:
L'ancienne définition: exchange.GetOrders (), qui n'a pas spécifié de paramètres, est appelée pour obtenir toutes les commandes non terminées de la paire de transactions en cours.
Modification de la définition de la fonction: exchange.GetOrders (), qui n'a pas spécifié de paramètres.
Pour les marchés à terme:
L'ancienne définition: exchange.GetOrders (), sans spécifier de paramètres, est appelée pour obtenir toutes les commandes non terminées de la paire de transactions en cours, selon le contrat.
Modification de la nouvelle définition de la fonction: exchange.GetOrders, qui récupère toutes les commandes non terminées dans la gamme de dimensions définies par le code du contrat.
Par exemple, la paire en cours est BTC_USD et le code du contrat est quarter.
exchange.GetOrders() // 等价于调用 exchange.GetOrders("USD.futures")
Cette fonction demande des données sur les commandes non terminées pour toutes les devises.
Cette mise à jour a ajouté un champ Symbol à la structure de Ticker, qui enregistre les informations relatives à la variété de la structure actuelle de Ticker.exchange.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 cohérent. Cette mise à jour modifie également le champ Id de la structure Order pour enregistrer les informations de variété, les informations d'ordre d'origine et les informations d'ordre d'ordre.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.
La fonction GetFundings renvoie un ensemble de structures de financement.
{
"Info": {...}, // 交易所资金费率接口原始应答数据
"Symbol": "BTC_USDT.swap", // FMZ平台定义的品种名称
"Interval": 28800000, // 8小时间隔,单位毫秒
"Time": 1729728000000, // 本期资金费率收取时间
"Rate": 0.0001, // 资金费率,即 0.01 %
}
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.
La mise à niveau de l'API de la plate-forme a permis de mettre à jour simultanément les interfaces API des systèmes de retouche de la plate-forme.
Fonctions membres pour les objets d'échanges à termeGetAccount
RetourAccount
La structure a été étendue.
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)
}
CtValCcy
L'unité de valeur d'un contrat peut être: BTC, USD, ETH, etc.CtVal
Enregistre la valeur correspondante d'un contrat sur une bourse de la même variété de transactions, en unitésCtValCcy
La monnaie dans laquelle le champ est enregistré.CtVal
Il y a un autre problème.CtValCcy
Le terme "BTC" désigne un contrat d'une valeur de 0,01 BTC.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.