Les ressources ont été chargées... Je charge...

Mise à niveau de l'API de la plateforme de négociation quantitative des inventeurs: améliorer l'expérience de conception stratégique

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2024-06-28 09:08:29, Mis à jour: 2024-07-24 12:00:40

[TOC] Je vous en prie.

img

Préambule

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.

Une nouvelle interface d'API

新增exchange.GetTickers函数

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
}

img

新增exchange.CreateOrder函数

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:symbolsidepriceamount

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)
}

img

C'est juste trois fois.exchange.CreateOrder()L'appel à la fonction a déclenché trois sortes d'ordres à terme, dans différentes directions.

新增exchange.GetHistoryOrders函数

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:

  • Certains prennent en charge les requêtes partagées, d'autres non.
  • Certaines transactions ne peuvent être consultées pendant toute la période de la fenêtre de consultation, c'est-à-dire que les commandes de plus de N jours ne peuvent pas être consultées.
  • La plupart des plateformes supportent la demande d'heure spécifique, mais certaines ne le font pas.

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) +  "`")
}

img

新增exchange.GetPositions函数

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:

  • Je ne peux pas le faire. Lorsqu'aucun paramètre n'est transmis, les données de stockage sont demandées en fonction des paramètres actuels de la paire de transactions / du code du contrat.
  • 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.
  • Je ne peux pas le faire. Demandez toutes les données de stockage des dimensions actuelles accessibles à l'interface de stockage de l'échange.

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) +  "`")
}

img

Lorsque vous entrezexchange.GetPositions()Le paramètre de la fonction estETH_USDT.swapIl est possible d'obtenir des données de détention de contrats permanents U-bit de l'ETH.

img

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.

2, mise à niveau de l'API

升级exchange.GetTicker函数

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ètressymbolPour les objets de l'échangeexchangeIl existe différents formats de titres en espèces/futures:

  • Objets des bourses Le format est le suivant:AAA_BBBL'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.
  • Objets des marchés à terme Le format est le suivant:AAA_BBB.XXXAAA 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
}

img

La demande d'un ensemble de données de marché pour les variétés spécifiées est devenue plus simple.

升级exchange.GetDepth函数

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"))
}

img

升级exchange.GetTrades函数

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) +  "`")
}

img

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.

升级exchange.GetRecords函数

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:

  • Exchange.GetRecords (en anglais seulement) Lorsqu'aucun paramètre n'est spécifié pour demander les données de ligne K de la variété correspondant à la paire de transactions / code de contrat en cours, le cycle de ligne K est le cycle de ligne K par défaut défini lors de l'interface de résumé stratégique ou de la table de bord.
  • Le nombre d'exemplaires est le nombre de fois que le nombre d'exemplaires est égal à 60 Lorsqu'un paramètre de cycle de ligne K est spécifié uniquement, les données de ligne K de la variété correspondant à la paire de transactions / code de contrat en cours sont demandées.
  • Le site de l'échange.GetRecords (en anglais seulement) Lorsqu'on spécifie uniquement l'information de la variété, on demande des données de ligne K pour spécifier la variété, la période de ligne K étant la période de ligne K par défaut définie lors de l'interface de retouche stratégique ou de la disquette.
  • Le taux d'intérêt de l'échange.GetRecords est de 60*60 Indiquer les informations de la variété, spécifier les cycles spécifiques de la ligne K pour demander les données de la ligne K.
  • Le site de l'échange.GetRecords (en anglais seulement) Indiquez les informations de la variété, spécifiez les cycles spécifiques de la ligne K, indiquez la longueur de la ligne K souhaitée pour obtenir régulièrement les données de la ligne K demandées. Notez que des demandes de page séparée (c'est-à-dire plusieurs appels à l'interface de ligne K de l'échange) sont générées lorsque le paramètre limite dépasse la longueur maximale de la demande d'un échange.

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)
}

img

升级exchange.GetOrders函数

La fonction GetOrders a été ajoutée.symbolParamè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:

  • Exchange.GetOrders (en anglais seulement) Pour consulter toutes les commandes en attente avec le code de la paire de transactions / contrat en cours.
  • Les commandes sont envoyées par l'intermédiaire d'un échangeur.GetOrders. Pour toutes les commandes en suspens pour les contrats permanents USDT chez BTC.
  • L'exchange.GetOrders est un système de messagerie électronique. Consultez toutes les commandes en attente dans l'échange selon la dimension actuelle de l'interface de l'API de l'échange.

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) +  "`")
}

img

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.

img

Paramètres spécifiésETH_USDT.swapLorsqu'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.

img

Envoyer une chaîne vide""Les clients de USDT ont été invités à se connecter à la plate-forme USDT.

升级exchange.GetPosition函数

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.

升级exchange.IO函数

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.comVous 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")
}

img

3 Les effets de l'API

影响exchange.GetOrder函数

L'amélioration a eu un impact majeur sur lesexchange.GetOrder(id)Paramètres de la fonctionidLe 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:

  • L'ID de l'ordre original de l'échange est défini dans l'ordre de l'échange:123456Avant cette mise à niveau, pour appeler la fonction GetOrder, l'ID de l'ordre est:123456
  • Le code de produit défini par l'échange dans l'ordre:BTC-USDTJe 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.

影响exchange.CancelOrder函数

Cette mise à niveau est une bonne chose.exchange.CancelOrder()L'influence des fonctionsexchange.GetOrder()La fonction est la même.

影响exchange.Buy函数

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

影响exchange.Sell函数

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

4, ajustement de la structure

Structure du ticker

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.

Structure de l'ordre

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.

Structure de position

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.

5, le système de retouche

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.

Mise à jour complémentaire

1, nouvelle structure de champs d'Equity, UPnL

Fonctions membres pour les objets d'échanges à termeGetAccountRetourAccountLa 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.

2, Fonction de mise à niveau de la marge au niveau de la fonction

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)
}

Plus de

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.