[TOC]
A plataforma de negociação quantitativa foi reformulada várias vezes após nove anos de inovações tecnológicas, embora nós, usuários, talvez não tenhamos percebido. Nos últimos dois anos, a plataforma fez uma série de otimizações e atualizações na experiência do usuário, incluindo uma interface de interface totalmente atualizada, ferramentas de negociação quantitativa mais comuns e mais suporte a dados de retorno.
Para facilitar o design da política, a lógica de negociação é mais clara e mais fácil de usar para iniciantes, a plataforma atualizou a interface API usada pela política. Usando a versão mais recente, os administradores podem ativar essas novas funções. A plataforma ainda é compatível com as chamadas da interface antiga.
Então, este artigo mostra quais as atualizações de atualizações de interface e quais as mudanças necessárias para usar as políticas antigas para ser compatível com a API atual.
Esta interface de mercado agregado é indispensável para a concepção de estratégias multi-variedades, estratégias de monitoramento de mercados globais. Para tornar as estratégias mais fáceis de desenvolver e evitar a duplicação de rodas.
Se a bolsa não tiver essa interface (exchanges separados), a chamadaexchange.GetTickers()
O blogueiro também escreveu sobre o assunto:
A função não possui nenhum parâmetro e retorna dados de mercado em tempo real de todas as variedades agregadas na interface de mercado. Pode ser simplesmente entendida como:
exchange.GetTickers()
A função éexchange.GetTicker()
A variedade completa de versões solicitadas de funções ((olhe com atenção, a diferença entre os nomes das funções é apenas o único múltiplo) ).
A partir daí, o projeto foi lançado no Brasil.
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
}
Novo aumentoexchange.CreateOrder()
A função é o foco desta atualização.exchange.CreateOrder()
A maior função da função é especificar diretamente no parâmetro da função a variedade, a direção, etc. do pedido. Assim, não depende mais da configuração atual do sistema de pares de transações, código de contrato, direção de transações, etc.
Em cenários de negociação múltipla, a complexidade do projeto é muito reduzida em cenários de conexão.exchange.CreateOrder()
Os quatro parâmetros da função são:symbol
、side
、price
、amount
。
Testes de ambiente com o OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}
Isso só foi feito três vezes.exchange.CreateOrder()
A chamada de função é feita para três tipos diferentes de ordens de futuros, em diferentes direções.
Novo aumentoexchange.GetHistoryOrders()
A função é usada para obter ordens de transação históricas de uma variedade, que também requer suporte de interface de câmbio.
Para consultar os pedidos históricos, as interfaces implementadas por cada exchange são muito diferentes:
Para que essas interfaces sejam embaladas com o maior grau de compatibilidade, é necessário considerar se elas estão de acordo com as necessidades e expectativas da estratégia.
Para mais informações sobre funções, consulte o manual de gramática do API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Testes em ambiente real de caixa de dinheiro:
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 função de captura de dados de armazenamento da versão antiga éexchange.GetPosition()
A atualização acrescenta uma nova função de aquisição de armazenamento para melhor se adequar à semântica do nome da função:exchange.GetPositions()
Não é uma função que não seja compatível com o sistema operacional.
Observe que os dois nomes de função só diferem por um final de s, pois o GetPositions é mais semântico, por isso é recomendado que todos os sucessos usem o GetPositions.
exchange.GetPositions()
A função tem três formas de ser chamada:
exchange.GetPositions (em inglês) Quando nenhum parâmetro é transmitidoNegociação / Código do contratoA configuração de armazém de dados de todas as variedades da dimensão atual é solicitada.
exchange.GetPositions ((BTC_USD.swap
、ETH_USDT.swap
、ETH_USDT.quarter
E assim por diante.
BTC_USD.swap: Contrato de permanência do BTC.
ETH_USDT.swap: Contrato de permanência de U-bit do ETH.
ETH_USDC.swap: contrato permanente de USDC baseado no ETH. (além do USDT, pode-se especificar uma moeda de cotação diferente, sem mais detalhes)
ETH_USDT.quarter: O índice de troca trimestral de U bits do ETH é de aproximadamente.
BTC_USD. BTC-USD-201226-24250-C: Contratos de opções binárias em BTC.
exchange.GetPositions (
A divisão de dimensões de contratos de algumas bolsas especiais: USDT.futures_combo:Futures_Deribit é um contrato de parceria de preços. USD.futures_ff:Futures_Kraken é uma bolsa de valores de câmbio de fundos de investimento. USD.swap_pf:Futures_Kraken é um contrato de garantia de longo prazo de fundos mistas.
Para as dimensões que não são suportadas pela interface API da bolsa, a chamada retornará um valor em branco.
Testes de ambiente com o OKX Futures Simulator:
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 se transmiteexchange.GetPositions()
O parâmetro da função éETH_USDT.swap
A partir de agora, é possível obter dados sobre a posse de contratos permanentes de U-bit do ETH.
Quando não entrarexchange.GetPositions()
Quando os parâmetros da função são obtidos, é possível obter dados de todos os contratos de permanência em U-bit lançados no mercado (como o par de transações atual é BTC_USDT, o contrato é um swap, de acordo com o par de transações atual, o pedido de escopo de contrato), que equivale a uma chamada.exchange.GetPositions("USDT.swap")
, especifique um escopo de solicitação.
A nova função GetFundings permite obter taxas de capital de contratos permanentes em mercados de futuros. A função tem um símbolo de parâmetro. A função retorna um conjunto de estruturas de financiamento.
BTC_USDT.swap
Não transmitir parâmetros ou a função de alcance de transmissão dará um erro.Funções de campoexchange.GetTicker()
A atualização inclui um parâmetro de símbolo; permite que a função se desprenda do par de transações atuais; solicita informações de variedade do código do contrato diretamente de acordo com os parâmetros indicados; simplifica o processo de codificação; e ainda é compatível com o modo de chamada não-transmissível, o mais compatível com as políticas antigas da plataforma.
Parâmetrossymbol
Para os objetos da bolsaexchange
O que é o mercado de ações?
AAA_BBB
A AAA representa a base de moeda, a BBB representa a quota de moeda e os nomes das moedas são em maiúsculas.
Por exemplo: BTC_USDT par de negociação em tempo real.AAA_BBB.XXX
AAA representa a moeda base, BBB representa a moeda de preço, e XXX representa o código do contrato, como o swap de contratos permanentes. Os nomes das moedas são em maiúsculas e o código do contrato em minúsculas.
Por exemplo: BTC_USDT.swap, um contrato de permanência de U-bit do BTC.Testes em ambientes reais de câmbio de câmbio:
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
}
O design de dados de mercado para um grupo de variedades especificadas é mais simples.
A função GetTicker é a mesmaexchange.GetDepth()
A função também adiciona um parâmetro de símbolo. Pode ser implementado para especificar diretamente a variedade ao solicitar dados de profundidade.
Testes em ambientes reais de câmbio de câmbio:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
A função GetTicker é a mesmaexchange.GetTrades()
A função também adiciona um parâmetro de símbolo. Pode-se especificar diretamente a variedade ao solicitar dados de transações no mercado.
Testes em ambientes reais de câmbio de câmbio:
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) + "`")
}
A atualização também é compatível com a aprovação.exchange.Go()
As funções são chamadas simultaneamente pela API da plataforma para transmitir informações sobre a variedade especificada pelo parâmetro de símbolo.
A função GetRecords fez uma grande modificação nesta vez, além de suportar informações de variedade de dados de linha K que o parâmetro do símbolo especifica diretamente para a solicitação. Preserva o parâmetro period original para especificar o período da linha K, e adiciona um parâmetro limit para especificar o comprimento da linha K desejado para o período da solicitação.
exchange.GetRecords()
Como chamar funções:
Testes em ambientes reais de câmbio de câmbio:
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 foi adicionada.symbol
Parâmetros que permitem especificar uma variedade específica e consultar pedidos incompletos dessa variedade; também suportam a consulta de pedidos incompletos de todas as variedades no intervalo de dimensões especificado.
exchange.GetOrders()
A função pode ser chamada da seguinte forma:
Testes de ambiente com o OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// 写入图表
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", "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
Quando o parâmetro é solicitado, a ordem não concluída do contrato permanente USDT local do ETH ("lista pendente") é indicada."USDT.swap"
O pedido de todas as encomendas pendentes de contratos permanentes da USDT foi feito em uma mensagem enviada pelo Twitter.Ainda é compatível com o antigo nome de função de captação de armazenamento, e também adicionou um parâmetro de símbolo para especificar informações de variedade de dados de armazenamento solicitados especificamente.exchange.GetPositions()
O que você está fazendo é errado.
Paraexchange.IO("api", ...)
O modo de invocação de funções, que foi atualizado para todos os objetos da bolsa, oferece suporte ao endereço de solicitação completo.
Por exemplo, se você quiser chamar a interface OKX:
GEThttps://www.okx.com/api/v5/conta/max-withdrawal ccy: BTC
Suporte para escrever endereços de base diretamentehttps://www.okx.com
Não é necessário mudar o endereço da base e chamar a função IO novamente.
Testes de ambiente com o OKX Futures Simulator:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
A escalada afetou principalmente:exchange.GetOrder(id)
Parâmetros da funçãoid
O parâmetro id foi alterado do id original das ordens de câmbio para um formato de string que contém a variedade de transações. Todos os pacotes de ordens no FMZ são para esse formato.
Por exemplo:
123456
Antes desta atualização, para chamar a função GetOrder, o ID de ordem enviado era:123456
。BTC-USDT
Não, não é.
Observe que se trata de um código de variedade de transações nomeado pela bolsa, e não de um par de transações definido pela plataforma FMZ.A partir daí, a empresa começou a trabalhar com o Google.exchange.GetOrder(id)
O formato do parâmetro id que a função precisa transmitir é ajustado para:BTC-USDT,123456
。
A primeira coisa que eu quero dizer é: Uma vez que a função CreateOrder foi atualizada para especificar diretamente a variedade do pedido (a variedade do pedido e o par de transações atualmente configurados, o código do contrato podem ser diferentes), se o ID do pedido retornado não conter informações sobre a variedade, o ID do pedido não será usado.
Como combinar esse impacto: Se a ordem de compra é feita usando a função exchange.IO, que chama diretamente a interface de compra do exchange para fazer a compra, o valor de retorno geralmente inclui o símbolo original (código de variedade) do exchange e o id original do pedido. Então, juntar os dois com um ponto em inglês é o Id de pedido definido pela plataforma FMZ. Da mesma forma, se for usado um interface de sub-ordem embalado pela plataforma FMZ, basta remover o código de variedade e o ponto de viragem se for necessário usar o ID original do pedido, já que a parte inicial do ID do pedido é o código de variedade.
A escalada foi feita paraexchange.CancelOrder()
Efeito das funçõesexchange.GetOrder()
A função é a mesma.
A escalada foi feita paraexchange.Buy()
Efeito das funçõesexchange.GetOrder()
A função é a mesma.exchange.Buy()
A função retorna o Id da ordem para uma nova estrutura, por exemplo, o Id que retorna quando a ordem é colocada em um futuro da OKX:LTC-USDT-SWAP,1578360858053058560
。
A escalada foi feita paraexchange.Sell()
Efeito das funçõesexchange.GetOrder()
A função é a mesma.exchange.Sell()
A função retorna o Id da ordem para uma nova estrutura, por exemplo, o Id que retorna quando a ordem é colocada em um futuro da OKX:ETH-USDT-SWAP,1578360832820125696
。
Somente os objetos de câmbio de futuros suportam essa função, sendo que a função para obter dados de armazenamento é chamada de exchange.GetPosition (), e a nova função é chamada de exchange.GetPositions ().
A função exchange.GetPosition () não especifica nenhum parâmetro e obtém os dados de posicionamento de um contrato específico definido no código do contrato.
Modificação, nova definição: exchange.GetPosition (()) função, que obtém a posição de todas as variedades do conjunto de transações atualmente configuradas, em um intervalo de dimensões definido pelo código do contrato, sem especificar nenhum parâmetro de chamada.
Por exemplo, o par de negociação atual é BTC_USDT e o código do contrato é swap.
exchange.GetPosition() // 等价于调用 exchange.GetPosition("USDT.swap")
A função solicita dados de armazenamento de contratos permanentes em bits U de todas as moedas.
A primeira é para as bolsas de valores:
A função exchange.GetOrders () não especifica nenhum parâmetro para ser chamada e obtém todas as ordens não concluídas do par de transações atual.
A função exchange.GetOrders () foi modificada para não especificar nenhum parâmetro e obter ordens não concluídas de todas as transações no momento.
2 - Para as bolsas de futuros:
A função exchange.GetOrders () não especifica nenhum parâmetro e obtém todas as ordens não concluídas do contrato específico definido no código do contrato.
Modificação, nova definição: exchange.GetOrders (), que, sem especificar nenhum parâmetro, obtém todas as ordens não concluídas no intervalo de dimensões definido pelo código do contrato.
Por exemplo, o par de negociação atual é BTC_USD e o código do contrato é quarter.
exchange.GetOrders() // 等价于调用 exchange.GetOrders("USD.futures")
A função solicita dados de pedidos incompletos sobre o índice de troca de moedas de todas as moedas.
A atualização adicionou um campo de símbolo para a estrutura do Ticker, que registra informações sobre a variedade da atual estrutura do Ticker.exchange.GetTicker()
O formato dos parâmetros do símbolo da função é perfeitamente uniforme.
Esta atualização para o estruturador de Orders adiciona o campo Symbol, que é formatado com o formato de um campo.exchange.GetTicker()
O formato do parâmetro de símbolo da função é totalmente uniforme. Esta atualização também modificou o campo Id da estrutura Order para registrar informações de espécies, informações de ordens originais e informações de ordens em um novo formato de ordem.exchange.GetOrder()
Descrição do ID da ordem na função, não mais aqui.
Esta atualização para a estrutura de posição adicionou o campo de símbolo, que é formatado com o padrão de padrão de padrão.exchange.GetTicker()
O formato dos parâmetros do símbolo da função é perfeitamente uniforme.
A função GetFundings retorna uma matriz de estruturas de Funding.
{
"Info": {...}, // 交易所资金费率接口原始应答数据
"Symbol": "BTC_USDT.swap", // FMZ平台定义的品种名称
"Interval": 28800000, // 8小时间隔,单位毫秒
"Time": 1729728000000, // 本期资金费率收取时间
"Rate": 0.0001, // 资金费率,即 0.01 %
}
A atualização é feita para atender às necessidades dos usuários, com compatibilidade com o disco físico, e o sistema de retrospecção será adaptado em uma semana. Se o código de políticas individuais for afetado, faça a adaptação da mudança conforme descrito neste artigo.
De acordo com a estratégia de atualização da interface API da plataforma, as interfaces de API do sistema de retorno da plataforma foram atualizadas em simultâneo; Além disso, o sistema de retorno também oferece suporte a:
Funções de membros para objetos de câmbio de futurosGetAccount
VoltouAccount
A estrutura foi ampliada em campos.
A função SetMarginLevel, membro do objeto do mercado de futuros, foi atualizada com o aumento do símbolo do 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)
}
CtValCcy
A unidade de valor de um contrato pode ser: BTC, USD, ETH, etc.CtVal
Registre o valor correspondente a um contrato da variedade transacionada na bolsa, em unidadesCtValCcy
A moeda registrada no campo; por exemplo:CtVal
O número de pessoas que morreram foi de 0,01CtValCcy
Para "BTC" significa um contrato com um valor de 0,01 BTC.- O quê?Eu perguntei o que aconteceu com o meu novo robô, o ID de retorno também tinha o nome do transação, pesquisei por muito tempo, e a informação do log depois de fazer o pedido não está sendo exibida agora, também por causa da atualização do administrador?
O que é isso?/upload/asset/2ffc0f961149326b78aed.png O problema foi causado pela atualização da interface?
ecnemuse 希望exchange.Buy函数能增加开止损单的功能。。
NanSegGlossário da linha da frente
- O quê?Muito bem.
Inventor quantificado - sonho pequenoMuito bem, veja aqui. Obrigado pela pergunta.
- O quê?Sim, extMsg1, extMsg2 não está exibido.
Inventor quantificado - sonho pequenoOlá, o ID do pedido é uma mudança imperativa, porque a atualização do pedido de especificar diretamente a variedade, o ID do pedido deve incluir informações sobre a variedade, caso contrário, não é possível determinar qual a variedade do pedido e não pode ser invocado no momento da revogação (porque a maioria das bolsas precisa especificar a variedade e especificar o ID). O que você disse que não aparece no botão de comando, é: exchange.Buy ((price, amount, extMsg1, extMsg2) quando o extMsg1, extMsg2 não aparecem no log?
Inventor quantificado - sonho pequenoOlá, você enviou as configurações atuais do mercado, pares de negócios, configurações de código de contrato.
Inventor de quantificaçãoEnvie os detalhes do código de teste e configuração para o formulário e o engenheiro responderá logo.
Inventor quantificado - sonho pequenoA diferença entre os mecanismos de condicionalidade e de suporte variam muito, e vamos ver se isso é possível.
Inventor quantificado - sonho pequenoSe você tiver algum problema, envie um formulário ou deixe um comentário.