3
focar em
1444
Seguidores

Semelhanças e diferenças entre APIs de futuros de commodities e de câmbio de criptomoedas

Criado em: 2019-09-21 17:37:21, atualizado em: 2024-12-17 20:41:43
comments   0
hits   2551

Semelhanças e diferenças entre APIs de futuros de commodities e de câmbio de criptomoedas

Há diferenças significativas entre o CTP de futuros de commodities e a API de moeda digital. Aqueles que estão familiarizados com a negociação programática de moeda digital, mas não com a negociação programática de futuros de commodities, não podem simplesmente copiar sua experiência. Este post irá resumir as semelhanças e diferenças entre eles.

Dados históricos

A interface CTP não fornece informações históricas de mercado, que devem ser obtidas por meio de provedores de informações de mercado. Se os dados de mercado forem perdidos devido a falha de login ou desconexão, o CTP não fornece um mecanismo de recuperação de dados de mercado. Condições históricas de mercado só podem ser obtidas por meio de dados de terceiros. Moedas digitais geralmente fornecem interfaces para obter K-line e histórico de transações.

Protocolos diferentes

As APIs de criptomoeda são geralmente protocolos REST e websocket. O CTP encapsula a lógica relacionada à rede internamente e usa o protocolo FTD com base no protocolo TCP para se comunicar com o plano de fundo do CTP. Existem três modos:

  • Modo de solicitação-resposta: o cliente inicia ativamente uma solicitação e o backend CTP recebe e responde à solicitação
  • Modo de comunicação de transmissão: depois que o cliente assina o mercado de contratos, o CTP envia informações de mercado para o exterior por meio de transmissão.
  • Modo de comunicação privada: depois que o cliente faz uma encomenda de um contrato, as informações do pedido, o retorno da transação, etc. são enviadas ponto a ponto pelo CTP.

Todas as condições de mercado e transações de ordens do protocolo CTP serão notificadas somente após alterações, enquanto consultas sobre ordens, contas e posições são consultas ativas. Os três modos acima podem ser encontrados em formas semelhantes em APIs de moeda digital.

Diferentes níveis de sofisticação de dados

A profundidade do protocolo CTP é de apenas uma compra e uma venda, e as taxas de mercado de cinco níveis são caras. As moedas digitais geralmente podem obter profundidade total ou 200 níveis. O CTP não envia transações reais e só pode ser inferido por meio de mudanças nas posições, enquanto a API de câmbio de moeda digital pode obter transações individuais reais. O nível de tick dos dados de mercado na plataforma CTP doméstica é de 2 ticks por segundo. A maioria dos websockets de câmbio de moeda digital pode fazer isso 10 vezes por segundo.

Diferentes restrições de acesso

As bolsas de moedas digitais geralmente limitam as transações a 10 vezes por segundo. Normalmente não há requisitos especiais para cancelamento de pedidos. O CTP tem restrições rígidas sobre solicitações que precisam ser emitidas ativamente. Geralmente, é mais seguro fazer isso uma vez a cada 2 segundos. Também há requisitos para o número de cancelamentos de pedidos.

Estabilidade

O protocolo CTP é muito estável e quase livre de erros e problemas de rede. As moedas digitais devem ter menos restrições e tempos de transação mais longos, e manutenção, atrasos de dados, erros de rede, etc. são muito comuns.

Melhores práticas do protocolo CTP na plataforma quantitativa FMZ

No modo padrão do CTP, as interfaces para obter informações de mercado, como GetTicker, GetDepth e GetRecords, só podem obter os dados mais recentes se houver dados em cache. Se não houver dados, ele esperará até que haja dados, então o estratégia não precisa dormir. Quando houver uma mudança de mercado, o ticker, a profundidade e os registros serão atualizados. Neste momento, chamar qualquer uma dessas interfaces retornará imediatamente, e o status da interface chamada será definido como modo de espera de atualização. A próxima chamada para a mesma interface aguardará até que novos dados estejam disponíveis. retornar. Alguns contratos ou limites de preço impopulares não serão negociados por um longo tempo. É normal que a estratégia fique presa por um longo tempo.

Se você quiser obter dados sempre que acessar o mercado, mesmo dados antigos, você pode alternar para o modo de atualização de mercado exchange.IO(“mode”, 0). Neste momento, a estratégia não pode ser escrita como orientada a eventos. Um evento Sleep precisa ser adicionado para evitar um loop infinito rápido. Algumas estratégias com baixa frequência podem usar esse modo, e o design da estratégia é simples. Use exchange.IO(“mode”, 1) para retornar ao modo de cache padrão.

Ao operar um único contrato, use o modo padrão. Entretanto, se houver vários contratos, é possível que um contrato não tenha atualizado as informações de mercado, resultando em um bloqueio na interface de aquisição de informações de mercado, e as atualizações de informações de mercado de outros contratos não podem ser obtidas. Para resolver esse problema, você pode usar o modo de atualização imediata, mas é inconveniente escrever estratégias de alta frequência. Neste momento, você pode usar o modo push de evento para obter informações de ordens e de mercado. O método de configuração é exchange.IO(“wait”). Se vários objetos de câmbio forem adicionados, o que é raro em futuros de commodities, você pode usar exchange.IO(“wait_any”), e o índice retornado indicará o índice de câmbio retornado.

Mudança de tick de mercado push: {Evento:“tick”, Índice:Índice de troca (na ordem em que a troca do robô é adicionada), Nano:Tempo de nanossegundos do evento, Símbolo:Nome do contrato} Envio de ordem: {Evento:“ordem”, Índice:Índice de troca, Nano:Evento tempo de nanossegundo, Ordem:Informações da ordem (o mesmo que GetOrder)}

Neste ponto, a estrutura da estratégia pode ser escrita como:

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //判断链接状态
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
            _C(exchange.SetContractType, "rb888")//订阅rb
            while(True){
                var e = exchange.IO("wait")
                if(e){
                    if(e.event == "tick"){
                        on_tick(e.Symbol)
                    }else if(e.event == "order"){
                        on_order(e.Order)
                    }
                }
           }
        }else{
            Sleep(10*1000)
        }
    }
}