O CTP de futuros de commodities e a troca de API de criptomoedas têm diferenças significativas. Conhecer a negociação de programação de troca de criptomoedas não significa estar familiarizado com a programação de CTP de futuros de commodities. não podemos simplesmente copiar o método e a experiência.
A interface do CTP não fornece cotação de mercado histórica, e a cotação de mercado histórica precisa ser resolvida através da agência de cotação de mercado. Se os dados de mercado forem perdidos devido à falha no login, o CTP não fornece um mecanismo de reabastecimento de mercado. As cotações de mercado históricas só podem ser obtidas através de agência de terceiros. A maioria das bolsas de criptomoedas geralmente fornece uma interface para obter a linha K e o histórico de transações.
A API de troca de criptomoedas é geralmente umREST
ewebsocket
O CTP encapsula internamente a lógica relacionada à rede e comunica com o fundo do CTP usando o protocolo FTD baseado no protocolo TCP. Dividido em três modos:
Modo de resposta de solicitação: o cliente inicia uma solicitação e o fundo do CTP recebe e responde à solicitação.
Modo de comunicação em transmissão: depois de o cliente subscrever a cotação do mercado do contrato, o CTP empurra as cotações do mercado através da transmissão.
Modo de comunicação privada: Após o cliente encomendar um contrato, as informações de encomenda, retorno da transação, etc. são empurradas pelo CTP ponto a ponto.
Todas as cotações e transações de ordem do acordo CTP serão notificadas após alterações, enquanto as ordens de consulta, contas e posições são ativamente consultadas.
A profundidade do protocolo CTP são apenas o último preço de compra e venda, as cotações de mercado mais profundas, como cinco camadas de preço de compra e venda são caras, você precisa pagar dinheiro extra para a bolsa de futuros para obtê-lo. por outro lado, A troca de criptomoedas geralmente pode obter profundidade total até 200 camadas de preços de compra e venda.
Além disso, o CTP não empurra as cotações de transações reais, ele só pode ser revertido por mudanças de posição, e a API de troca de criptomoedas pode obter cotações de transações detalhadas reais.
As trocas de criptomoedas são geralmente limitadas a 10 ticks por segundo. Não há requisitos especiais para retiradas de pedidos. A CTP tem restrições estritas sobre pedidos que precisam ser enviados ativamente. Geralmente, uma vez por 2 segundos é bastante segura, e também há requisitos para o número de retiradas.
O protocolo CTP é muito estável e quase não há erros ou problemas de rede. Devido à troca de criptomoedas ter menos restrição, mais tempo de transação, manutenção do sistema, atraso de dados e erros de rede são muito comuns.
CTP modo padrão para obter a interface de mercado, tais comoGetTicker
, GetDepth
, GetRecords
são dados em cache para obter o mais recente, se não houver dados vai esperar até que haja dados, por isso a estratégia não pode usarSleep
Quando há uma alteração de cotação de mercado,ticker
, depth
, erecords
Neste ponto, qualquer interface será devolvida imediatamente quando for chamada. Em seguida, o estado de interface chamada é definido para esperar o modo de atualização, Quando a próxima vez que a mesma interface for chamada, ele esperará que novos dados retornem.
Alguns contratos comerciais impopulares ou o preço atinge o preço limitado diário ocorrerá por um longo tempo sem qualquer atividade comercial, o que é normal para a estratégia para ficar preso por um longo tempo.
Se você quiser obter os dados toda vez que você obter a cotação do mercado, mesmo os dados antigos, você pode mudar para o mercado imediatamente atualizar o modoexchange.IO ("mode", 0)
Neste ponto, a estratégia não pode ser escrita como um condutor de evento.SLeep
Algumas estratégias de baixa frequência podem usar este modo, e o design da estratégia é simples.exchange.IO("mode", 1)
para voltar ao modo de cache padrão.
No entanto, se houver vários contratos de negociação, é possível que um contrato não tenha sido atualizado, resultando em um bloqueio da interface do mercado e outras atualizações de cotações de mercado de contratos de negociação não estejam disponíveis. Para resolver este problema, você pode usar o modo de atualização imediata, mas não é conveniente escrever uma estratégia de alta frequência. Neste ponto, você pode usar o modo push de evento para obter o push de ordens e cotações.exchange.IO("wait")
Se múltiplos objetos de troca são adicionados, esta é uma situação rara na negociação de futuros de commodities, você pode usarexchange.IO ("wait_any")
, e o devolvidoindex
indicará o índice da troca devolvida.
Cotação de mercadotick
Empurra para mudar:
{Event:"tick", Index: exchange index (in the order of robot exchange added), Nano: event nanosecond time, Symbol: contract name}
Ordem empurrar:
{Event:"order", Index: Exchange Index, Nano: Event Nanosecond Time, Order: Order Information (consistent with 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")){ //Determine the link status
exchange.IO("mode", 0)
_C (exchange.SetContractType, "MA888") // subscribe to the MA, only the first time is the real request to send a subscription, the following are just program switch, won't consume any time.
_C(exchange.SetContractType, "rb888") // Subscribe 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)
}
}
}