O recurso está a ser carregado... Carregamento...

Inventor de plataforma de negociação quantitativa API de atualização: melhorar a experiência de design estratégico

Autora:Inventor quantificado - sonho pequeno, Criado: 2024-06-28 09:08:29, Atualizado: 2024-07-24 12:00:40

[TOC]

img

Prefácio

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.

O manual de gramática:https://www.fmz.com/syntax-guideManual do usuário:https://www.fmz.com/user-guide

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.

1 A nova interface de API

新增exchange.GetTickers函数

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
}

img

新增exchange.CreateOrder函数

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

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

img

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.

新增exchange.GetHistoryOrders函数

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:

  • Alguns suportam consultas separadas, outros não.
  • Algumas transações não podem ser consultadas durante todo o período da janela de consulta, ou seja, ordens com mais de N dias;
  • A maioria das casas de câmbio suporta consultas de horário específico, mas algumas não.

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

img

新增exchange.GetPositions函数

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.

exchange.GetPositions()A função tem três formas de ser chamada:

  • exchange.GetPositions (em inglês) Quando nenhum parâmetro é transmitido, os dados de armazenamento são solicitados de acordo com a configuração de código do par/contrato atual.
  • exchange.GetPositions ((ETH_USDT.swap botão) Quando se especifica a informação de uma variedade específica (um formato como o ETH_USDT.swap é definido pela plataforma FMZ), os dados de armazenamento de uma variedade específica são solicitados.
  • exchange.GetPositions (em inglês) Solicite todos os dados de armazenamento de dimensões atuais disponíveis para a interface de armazenamento da bolsa.

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

    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

Quando se transmiteexchange.GetPositions()O parâmetro da função éETH_USDT.swapA partir de agora, é possível obter dados sobre a posse de contratos permanentes de U-bit do ETH.

img

Quando se transmiteexchange.GetPositions()Os parâmetros da função são strings vazios.""A partir de agora, você pode obter dados de todos os contratos do U.

2o, atualização da interface API

升级exchange.GetTicker函数

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âmetrossymbolPara os objetos da bolsaexchangeO que é o mercado de ações?

  • Objetos de câmbio O formato é:AAA_BBBA 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.
  • Objetos de câmbio de futuros O formato é:AAA_BBB.XXXAAA 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
}

img

O design de dados de mercado para um grupo de variedades especificadas é mais simples.

升级exchange.GetDepth函数

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

img

升级exchange.GetTrades函数

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

img

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.

升级exchange.GetRecords函数

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:

  • exchange.GetRecords (em inglês) Quando não se especifica nenhum parâmetro para solicitar dados de linha K da variedade correspondente ao par de transações/código de contrato atual, o ciclo de linha K é o ciclo de linha K padrão definido na interface de revisão de estratégia ou no tempo real.
  • exchange.GetRecords ((60 * 15) Quando se especifica apenas o parâmetro do ciclo da linha K, os dados da linha K da variedade correspondente ao código do par de transações/contratos atual são solicitados.
  • exchange.GetRecords (http://www.exchange.getRecords.com/) Quando apenas a informação da variedade é especificada, os dados da linha K da variedade são solicitados, e o ciclo da linha K é o ciclo da linha K padrão definido na interface de retrospecção da estratégia ou no disco real.
  • exchange.GetRecords ((BTC_USDT.swap, 60 * 60)) Especificar informações de variedade, especificar um ciclo específico de linha K para solicitar dados de linha K.
  • exchange.GetRecords (( BTC_USDT.swap, 60, 1000) Especificar informações de variedades, especificar um ciclo específico de linha K, referir o comprimento de linha K que se espera obter regularmente e solicitar dados de linha K. Observe que quando o parâmetro limite excede o comprimento máximo de uma solicitação feita pela bolsa, é gerado um pedido de divisão de página (ou seja, várias chamadas para a interface da linha K da bolsa).

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

img

升级exchange.GetOrders函数

A função GetOrders também foi adicionada.symbolParâmetros que permitem especificar diretamente a variedade da consulta que está pendente; também suporta a consulta de todas as listas pendentes; é compatível com o modo de chamada original.

exchange.GetOrders()A função pode ser chamada da seguinte forma:

  • exchange.GetOrders (em inglês) Consultar todos os pedidos não concluídos com o código do par/contrato atual.
  • exchange.GetOrders (http://www.exchange.getorders.com/) Para consultar todas as encomendas pendentes do USDT para contratos permanentes da BTC.
  • exchange.GetOrders (em inglês) Consultar todos os pedidos não concluídos na divisão de dimensões atual do exchange (divisão de dimensões de acordo com a interface API do exchange).

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", ""]) {
        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

Quando o parâmetro não é transmitido, o padrão solicita o atual par de transações BTC_USDT, todos os pendentes não concluídos de contratos permanentes de swap.

img

Especificar parâmetrosETH_USDT.swapQuando o parâmetro é solicitado, todos os contratos permanentes pendentes não concluídos do par de negociações ETH_USDT são solicitados.

img

Introdução de strings em branco""A partir de agora, o servidor poderá solicitar todos os contratos locais do USDT e todas as listas pendentes não concluídas.

升级exchange.GetPosition函数

Ainda é compatível com o nome da função de captação de armazenamento antiga, e também adicionou um parâmetro de símbolo para especificar informações de variedade de dados de armazenamento solicitados especificamente. Funções de usoexchange.GetPositions()O que você está fazendo é errado.

升级exchange.IO函数

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

img

3 Impacto das interfaces API

影响exchange.GetOrder函数

A escalada afetou principalmente:exchange.GetOrder(id)Parâmetros da funçãoidO parâmetro id foi alterado do id original da ordem do exchange para um formato de string que contém uma variedade de transações. Todos os IDs de encomendas na plataforma FMZ são para este formato.

Por exemplo:

  • O ID da ordem original da bolsa, definida na ordem da bolsa, é:123456Antes desta atualização, para chamar a função GetOrder, o ID de ordem enviado era:123456
  • O código do produto com o nome da bolsa definido na ordem da bolsa:BTC-USDTNã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.

影响exchange.CancelOrder函数

A escalada foi feita paraexchange.CancelOrder()Efeito das funçõesexchange.GetOrder()A função é a mesma.

影响exchange.Buy函数

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

影响exchange.Sell函数

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

4. Ajuste estrutural

Estrutura do ticker

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. O formato do campo éexchange.GetTicker()O formato dos parâmetros do símbolo da função é perfeitamente uniforme.

Estruturas de ordem

Esta atualização para o estruturador de Orders adiciona o campo Symbol, que é formatado com o formato de um campo.exchange.GetTicker()O formato dos parâmetros do símbolo da função é perfeitamente uniforme. A atualização também alterou o campo Id da estrutura Order para registrar informações de variedades, informações de pedidos originais e referências em um novo formato de ordem Id.exchange.GetOrder()Descrição do ID da ordem na função, não mais aqui.

Estruturas de posição

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.

5o Sistema de Retrospecção

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.

Atualizações adicionais

1 Account Estrutura de novos campos Equity UPnL

Funções de membros para objetos de câmbio de futurosGetAccountVoltouAccountA estrutura foi ampliada em campos.

  • Equidade O total de direitos de propriedade dos ativos de garantia atuais, com exceção de mercados de futuros muito específicos, não é suportado, mas a maioria suporta o campo.

  • UPnL Os ganhos não realizados de todas as posições atualmente mantidas em moedas de ativos garantidos, com exceção de trocas de futuros muito específicas, não são suportados.

2, Função de SetMarginLevel suporte para parâmetros de símbolos de atualização

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

Mais.

- 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.