[TOC]

A plataforma de negociação quantitativa Inventor passou por 9 anos de iteração tecnológica e foi reconstruída muitas vezes, embora, como usuários, possamos não ter notado. Nos últimos dois anos, a plataforma fez muitas otimizações e atualizações em termos de experiência do usuário, incluindo uma atualização abrangente da interface do usuário, enriquecendo ferramentas de negociação quantitativa comumente usadas e adicionando mais suporte a dados de backtesting.
Para tornar o design da estratégia mais conveniente, a lógica de negociação mais clara e mais fácil para iniciantes, a plataforma atualizou a interface da API usada pela estratégia. Use a versão mais recente do seu host para habilitar esses novos recursos. A plataforma permanece compatível com chamadas para interfaces antigas na maior extensão possível. Informações sobre novos recursos da interface da API foram atualizadas na documentação da API da Plataforma de Negociação Quantitativa do Inventor:
Então, vamos dar uma olhada rápida em quais interfaces foram atualizadas e quais mudanças são necessárias para tornar as estratégias antigas compatíveis com a API atual.
Para projetar estratégias multivariadas e estratégias completas de monitoramento da situação do mercado. Essa interface de mercado agregada é essencial para facilitar o desenvolvimento de estratégias e evitar a reinvenção da roda. A plataforma de negociação quantitativa do inventor encapsula essas APIs de bolsas.
Caso a bolsa não possua essa interface (bolsas individuais), ligue paraexchange.GetTickers()Uma mensagem de erro será relatada: Não suportado.
Esta função não possui parâmetros e retornará dados de mercado em tempo real de todas as variedades na interface de mercado agregada da bolsa. Pode ser entendido simplesmente como:
exchange.GetTickers()A função éexchange.GetTicker()A versão completa da função (a diferença entre os dois nomes de função é o singular e o plural).
Usamos o ambiente de simulação de pontos OKX para testar:
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
}

Novoexchange.CreateOrder()As funções são o foco desta atualização.exchange.CreateOrder()A função mais importante da função é especificar diretamente o tipo e a direção da ordem nos parâmetros da função. Dessa forma, ele não depende mais das configurações atuais do sistema, como pares de negociação, códigos de contrato, direções de negociação, etc.
A complexidade do design é bastante reduzida em cenários de ordens de negociação de vários produtos e cenários simultâneos.exchange.CreateOrder()Os quatro parâmetros da função sãosymbol、side、price、amount。
Teste usando o ambiente de simulação de futuros 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)
}

Isso levou apenas 3 vezesexchange.CreateOrder()A chamada de função coloca três ordens futuras de diferentes variedades e direções.
Novoexchange.GetHistoryOrders()A função é usada para obter os pedidos de transação históricos de um determinado produto. Esta função também requer o suporte da interface de câmbio.
Para consultar ordens históricas, as interfaces implementadas por várias bolsas variam muito:
Essas interfaces são encapsuladas com o mais alto grau de compatibilidade e, no uso real, deve-se prestar atenção se elas atendem aos requisitos e expectativas da estratégia.
A descrição detalhada da função não é repetida aqui, você pode consultar o manual de sintaxe na documentação da API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Testado usando o ambiente de negociação à vista da Binance:
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) + "`")
}

A versão antiga da função de aquisição de dados de posição é:exchange.GetPosition(). Para corresponder melhor à semântica de nomenclatura de funções, esta atualização adiciona uma nova função para obter posições:exchange.GetPositions(). Ao mesmo tempo, ele ainda é compatível/atualizado com a função GetPosition.
Observe que os dois nomes de função diferem apenas pelo s final. Como GetPositions é semanticamente mais correto, é recomendável que você use GetPositions no futuro.
exchange.GetPositions()Existem três formas de chamadas de função:
exchange.GetPositions() Quando nenhum parâmetro é passado, o atualPares de negociação / Código do contratoSolicitar os dados de posição de todas as variedades na dimensão atual.
exchange.GetPositions(“ETH_USDT.swap”)
Ao especificar informações específicas do produto (o formato ETH_USDT.swap é definido pela plataforma FMZ), solicite os dados de posição do produto específico.
Exemplo:BTC_USD.swap、ETH_USDT.swap、ETH_USDT.quarterespere.
BTC_USD.swap: contrato perpétuo baseado em moeda BTC.
ETH_USDT.swap: contrato perpétuo baseado em U da ETH.
ETH_USDC.swap: contrato perpétuo com margem em USDC para ETH. (Além de USDT, você também pode especificar uma quoteCurrency diferente, que não será repetida aqui)
ETH_USDT.quarter: contrato de entrega trimestral baseado em U da ETH.
BTC_USD.BTC-USD-201226-24250-C: Contrato de opção com margem em moeda BTC.
exchange.GetPositions(“USDT.swap”) Solicitar dados de posição para todos os símbolos de acordo com o intervalo de dimensão especificado. USDT.swap: Faixa de contrato perpétuo baseado em U. USDT.futures: Gama de contratos de entrega baseados em U. USDC.swap: Faixa de contratos perpétuos com margem em USDC. (Além de USDT, você também pode especificar uma quoteCurrency diferente, que não será repetida aqui) USDC.futures: Gama de contratos futuros com margem em USDC. USD.swap: Faixa de contrato perpétuo baseado em moeda. USD.futures: Gama de contratos futuros baseados em moedas. USDT.option: Faixa de contratos de opções baseados em U. USD.option: Faixa de contratos de opções com base em moeda.
Algumas divisões especiais de dimensão de contrato de câmbio: USDT.futures_combo: Combinação de CFD da bolsa Futures_Deribit. USD.futures_ff: Contrato de entrega de margem mista da bolsa Futures_Craken. USD.swap_pf: Futuros_Um contrato perpétuo de margem híbrida na bolsa Kraken.
Para dimensões que não são suportadas pela interface da API de troca, um erro será relatado e um valor nulo será retornado ao chamar.
Teste usando o ambiente de simulação de futuros 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) + "`")
}

Quando entraexchange.GetPositions()Os parâmetros da função sãoETH_USDT.swapAo usar o contrato perpétuo baseado em ETH U, você pode obter os dados de posição do contrato perpétuo baseado em ETH U.
Quando não importadoexchange.GetPositions()Quando a função é usada como parâmetro, os dados de posição de todos os contratos perpétuos de margem U listados na bolsa podem ser obtidos (como o par de negociação atual é BTC_USDT e o contrato é swap, a solicitação é baseada no par de negociação atual e intervalo de dimensão do contrato). Isso é equivalente a chamarexchange.GetPositions("USDT.swap"), especifique um escopo de solicitação.
A função GetFundings recém-adicionada pode obter a taxa de financiamento de contratos perpétuos em bolsas de futuros. A função recebe um símbolo de parâmetro. A função retorna uma matriz de estruturas de financiamento.
BTC_USDT.swap. Se nenhum parâmetro for passado ou um intervalo for passado para a função, uma mensagem de erro será exibida dizendo que o parâmetro de símbolo não é suportado.Função de mercadoexchange.GetTicker()Esta atualização adiciona principalmente parâmetros de símbolos. Esta função pode ser usada para solicitar dados de mercado diretamente de acordo com as informações do produto especificadas pelos parâmetros, independentemente do par de negociação atual e do código do contrato. Simplifica o processo de escrita de código. Ao mesmo tempo, ele ainda é compatível com o método de chamada sem passar parâmetros e é compatível com as antigas estratégias de plataforma na maior extensão possível.
parâmetrosymbolPara objetos de trocaexchangeExistem diferentes formatos para spot/futuros:
AAA_BBBAAA representa baseCurrency, ou seja, a moeda da transação, e BBB representa quoteCurrency, ou seja, a moeda de precificação. Os nomes das moedas estão todos em letras maiúsculas.
Por exemplo: par de negociação à vista BTC_USDT.AAA_BBB.XXX, AAA representa baseCurrency, ou seja, a moeda da transação, BBB representa quoteCurrency, ou seja, a moeda de precificação, e XXX representa o código do contrato, como o swap de contrato perpétuo. Os nomes das moedas estão todos em letras maiúsculas e os códigos dos contratos estão em letras minúsculas.
Por exemplo: BTC_USDT.swap, contrato perpétuo baseado em U do BTC.Testado usando o ambiente ativo da 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
}

Solicitar um lote de dados de mercado para um símbolo específico ficou muito mais simples.
O mesmo que a função GetTickerexchange.GetDepth()A função também adiciona um parâmetro de símbolo desta vez. É possível especificar o tipo diretamente ao solicitar dados de profundidade.
Testado usando o ambiente ativo da 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"))
}

O mesmo que a função GetTickerexchange.GetTrades()A função também adiciona um parâmetro de símbolo desta vez. É possível especificar diretamente o produto ao solicitar dados de transações de mercado.
Testado usando o ambiente ativo da 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) + "`")
}

Esta atualização também é compatível comexchange.Go()Quando a função chama simultaneamente a interface da API da plataforma, o parâmetro de símbolo é passado para especificar as informações do produto.
A função GetRecords foi significativamente ajustada desta vez, além de suportar o parâmetro de símbolo para especificar diretamente as informações de tipo dos dados da linha K solicitados. O parâmetro de período original é mantido para especificar o período da linha K, e um parâmetro de limite é adicionado para especificar o comprimento esperado da linha K ao solicitar. Também é compatível com a versão antiga da função GetRecords que passa apenas o parâmetro de período.
exchange.GetRecords()Como chamar a função:
Testado usando o ambiente ativo da 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)
}

A função GetOrders também adicionasymbolParâmetros: você pode especificar um produto específico e consultar os pedidos não finalizados (pedidos pendentes) do produto; você também pode consultar os pedidos não finalizados (pedidos pendentes) de todos os produtos no intervalo de dimensões especificado.
exchange.GetOrders()A função pode ser chamada das seguintes maneiras:
Teste usando o ambiente de simulação de futuros 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.swapParâmetro, solicita as ordens não atendidas (ordens pendentes) do contrato perpétuo com margem USDT de ETH."USDT.swap"Solicite todos os pedidos pendentes (pedidos pendentes) de contratos perpétuos com margem em USDT.Ele ainda é compatível com a antiga nomenclatura da função de aquisição de posição e também adiciona o parâmetro de símbolo, que pode especificar as informações de tipo dos dados de posição específicos solicitados. Uso da função eexchange.GetPositions()Totalmente consistente.
paraexchange.IO("api", ...)O método de chamada de função foi atualizado para oferecer suporte à passagem direta do endereço de solicitação completo para todos os objetos de troca.
Por exemplo, se você quiser chamar a interface OKX:
GET https://www.okx.com /api/v5/account/max-withdrawal ccy: BTC
Suporte para escrita direta no endereço basehttps://www.okx.com, não há necessidade de alternar o endereço base antes de chamar a função IO.
Teste usando o ambiente de simulação de futuros OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}

Esta atualização afeta principalmenteexchange.GetOrder(id)Parâmetros de funçãoidO parâmetro id é alterado do id da ordem de câmbio original para um formato de string contendo a variedade de negociação. Todos os IDs de pedidos empacotados na plataforma FMZ estão neste formato.
Por exemplo:
123456
Antes desta atualização, se você quiser chamar a função GetOrder, o ID do pedido passado é123456。BTC-USDT。
Observe que o que é mencionado aqui é o código do produto de negociação nomeado pela bolsa, não o par de negociação definido pela plataforma FMZ.Após esta atualização,exchange.GetOrder(id)O formato do parâmetro id que a função precisa passar é ajustado para:BTC-USDT,123456。
Deixe-me primeiro explicar por que esse design foi feito: Como a função CreateOrder foi atualizada desta vez para especificar diretamente o produto para fazer um pedido (o produto pedido pode ser diferente do par de negociação e do código de contrato definidos atualmente), se o ID do pedido retornado não contiver as informações do produto. Então este ID do pedido não estará disponível. Porque quando você verifica o pedido, você não sabe para que tipo (contrato) o pedido é. A maioria das trocas exige a especificação de parâmetros que descrevem o código do produto ao verificar e cancelar pedidos.
Como ser compatível com esse efeito: Se você usar a função exchange.IO para chamar diretamente a interface de pedidos da bolsa para fazer um pedido, o valor de retorno geralmente conterá o símbolo original da bolsa (código do produto) e o ID do pedido original. Então, concatenar os dois com vírgulas em inglês fornecerá o ID do pedido definido pela plataforma FMZ. Da mesma forma, se você usar a interface de pedido encapsulada pela plataforma FMZ para fazer um pedido, como o início do ID do pedido é o código do produto de negociação, se você precisar usar o ID do pedido original, você só precisa excluir o código do produto e vírgula.
Esta atualização é paraexchange.CancelOrder()O impacto das funções eexchange.GetOrder()As funções são as mesmas.
Esta atualização é paraexchange.Buy()O impacto das funções eexchange.GetOrder()As funções são as mesmas.exchange.Buy()O ID do pedido retornado pela função é uma nova estrutura, por exemplo, o ID retornado ao colocar um pedido de futuros na bolsa OKX:LTC-USDT-SWAP,1578360858053058560。
Esta atualização é paraexchange.Sell()O impacto das funções eexchange.GetOrder()As funções são as mesmas.exchange.Sell()O ID do pedido retornado pela função é uma nova estrutura, por exemplo, o ID retornado ao colocar um pedido de futuros na bolsa OKX:ETH-USDT-SWAP,1578360832820125696。
Somente objetos de câmbio de futuros suportam esta função. Para a função exchange.GetPosition() para obter dados de posição, um novo nome exchange.GetPositions() é adicionado, e seus comportamentos são exatamente os mesmos.
Definição antiga: função exchange.GetPosition(). Quando chamada sem especificar nenhum parâmetro, ela obtém os dados de posição do contrato específico definido pelo par de negociação atual e código do contrato.
Após ajuste e modificação, a nova definição é: função exchange.GetPosition(). Quando chamada sem especificar nenhum parâmetro, ela obtém as posições de todas as variedades no intervalo de dimensão determinado pelo par de negociação e código de contrato atualmente definidos.
Por exemplo, o par de negociação atual é BTC_USDT e o código do contrato é swap. Neste momento ligue para:
exchange.GetPosition() // 等价于调用 exchange.GetPosition("USDT.swap")
Esta função solicitará os dados de posição dos contratos perpétuos de margem U de todas as moedas.
Definição antiga: função exchange.GetOrders(). Quando chamada sem especificar nenhum parâmetro, ela recupera todas as ordens pendentes para o par de negociação atual.
Após ajuste e modificação, a nova definição é: função exchange.GetOrders(). Quando chamada sem especificar nenhum parâmetro, ela obtém as ordens não concluídas de todos os pares de negociação spot.
Definição antiga: função exchange.GetOrders(). Quando chamada sem especificar nenhum parâmetro, ela recupera todas as ordens não concluídas do contrato específico definido pelo par de negociação atual e código do contrato.
Após ajuste e modificação, a nova definição é: função exchange.GetOrders(). Quando chamada sem especificar nenhum parâmetro, ela obtém todas as ordens não concluídas no intervalo de dimensão determinado pelo par de negociação e código de contrato atualmente definidos.
Por exemplo, o par de negociação atual é BTC_USD e o código do contrato é trimestre. Neste momento ligue para:
exchange.GetOrders() // 等价于调用 exchange.GetOrders("USD.futures")
Esta função solicitará os dados de ordens pendentes de todos os contratos futuros com margem em moeda.
Esta atualização adiciona um campo Símbolo à estrutura Ticker, que registra as informações de mercado do produto da estrutura Ticker atual. O formato deste campo éexchange.GetTicker()O formato do parâmetro de símbolo da função é exatamente o mesmo.
Esta atualização adiciona um campo Símbolo à estrutura Ordem. O formato deste campo é o mesmo queexchange.GetTicker()O formato do parâmetro de símbolo da função é exatamente o mesmo. Esta atualização também modifica o campo Id da estrutura do pedido para registrar informações do produto e informações do pedido original no novo formato de ID do pedido. referir-se aexchange.GetOrder()A descrição do ID do pedido na função não será repetida aqui.
Esta atualização adiciona um campo Símbolo à estrutura Posição. O formato deste campo é o mesmo queexchange.GetTicker()O formato do parâmetro de símbolo da função é exatamente o mesmo.
A função GetFundings retorna uma matriz de estruturas de financiamento.
{
"Info": {...}, // 交易所资金费率接口原始应答数据
"Symbol": "BTC_USDT.swap", // FMZ平台定义的品种名称
"Interval": 28800000, // 8小时间隔,单位毫秒
"Time": 1729728000000, // 本期资金费率收取时间
"Rate": 0.0001, // 资金费率,即 0.01 %
}
Para atender às necessidades do usuário, esta atualização será primeiro compatível com o mercado real, e o sistema de backtesting será adaptado dentro de uma semana. Se códigos de estratégia individuais forem afetados, siga as instruções neste artigo para fazer alterações e adaptações
De acordo com a atualização da interface da API da estratégia da plataforma, as interfaces da API no sistema de backtesting da plataforma foram atualizadas de forma síncrona; além disso, o sistema de backtesting adicionou suporte para:
Funções de membro para objetos de bolsa de futurosGetAccountRetornarAccountA estrutura foi expandida com campos.
A função membro SetMarginLevel do objeto de bolsa de futuros foi atualizada para adicionar o símbolo de parâmetro.
Exemplo de teste:
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)
}
CtValCcyRegistre a unidade de valor de um contrato. A unidade de valor de um contrato pode ser: BTC, USD, ETH, etc.CtValRegistre o valor de um contrato deste produto comercial na bolsa, em unidades deCtValCcyA moeda do registro de campo. Por exemplo:CtValé 0,01,CtValCcy“BTC” significa que um contrato vale 0,01 BTC.