O que é o Tick? Por exemplo, os dados de transação podem ser imaginados como um rio, e o Tick é os dados de uma seção do rio.
Como é que a maioria dos softwares domésticos obtém o Tick?
Em seguida, muitas vezes há mais de uma transação em 500 milissegundos, e a situação específica nele é completamente uma caixa preta.
A maioria das estruturas de negociação no mercado usa um modo de callback, o que significa que há no máximo um Tick em 500 milissegundos em situação ideal. Sob a situação real onBar/onTick, é bom não perder o Tick. por quê? Porque você tem que lidar com toda a lógica de código na função onBar/onTick, o que custa muito tempo. Quer você queira ou não, sua lógica de estratégia deve ser interrompida, você deve usar o estado inactivo, assim:
Mecanismo mais avançado
A plataforma de negociação quantitativa FMZ não adota esse mecanismo de callback para trás, mas adota o mecanismo de função principal que não interrompe a lógica da estratégia, permitindo que os usuários controlem o fluxo da estratégia de forma mais natural. Usando C ++ e Golang como um nível subjacente de estratégia, o nível superior da estratégia usa JavaScript / Python para lidar com problemas lógicos. Combinado com o mecanismo de gatilho de eventos, a estratégia também pode ser usada para processar o mercado na velocidade mais rápida na primeira vez.
Não diga que a linguagem de scripting é lenta, a menos que você a use para treinamento de redes neurais, mesmo que fosse, ela pode ser usada em qualquer ocasião depois de adicionar a compilação quente do Jit. A estratégia de nível de entrada não está escrita aqui, e fale sobre a síntese de futuros de alta frequência Tick. Por exemplo, se nos conectarmos a uma empresa de futuros, só podemos receber o mercado dessa empresa de futuros. A velocidade e a qualidade de nossa recepção estão relacionadas à nossa própria rede, e também estão relacionadas à carga da máquina front-end da empresa de futuros.
Então, como podemos obter dados mais precisos de Tick futuros mais rapidamente? Sob o modelo de estratégia do FMZ Quant
Demo de código
Este código só pode ser usado no mercado real e não pode ser testado. Ao adicionar a bolsa, muitas empresas de futuros podem ser adicionadas para realizar o processamento simultâneo de fusão do mercado.
O código é o seguinte:
Efeito demo
Como mostrado acima, às 21:24:44, os dados da primeira empresa de futuros são anteriores ao segundo. Adicionar duas empresas de futuros pode mostrar o efeito, se você adicionar mais de 5 empresas de futuros para se fundirem, então você basicamente não tem possibilidade de perder o Tick; se você estiver desenvolvendo uma estratégia de negociação de alta frequência, você resolveu um passo muito importante e decisivo, a saber, a velocidade e a estabilidade da recepção do Tick.
Obtenha o código completo:
function main() {
log("Prepare to connect to the exchange and subscribe to the market")
//step 1:All futures front-end machines are starting to subscribe to the variety
_.each(exchanges, function(e){
/*Waiting to connect to the exchange. The strategy is running without
interruption, and it is not the logic of the event callback. */
while(!e.IO("status"))Sleep(1000);
/*Use _C function to troubleshoot network errors. If subscribe to the market just
after connecting to exchanges, there may be a CTP unprepared error. */
_C(e.SetContractType, "MA801")
/*Switch the market receiving mode to the immediate return mode instead of the
event trigger mode. Refer to the API documentation on FMZ website. */
e.IO("mode", 0)
})
Log("start fusing the data")
//step 2: the important part begins
var preVolume = 0
while (true) {
var ts = new Date().getTime()
//Return if any exchanges occur tick event
var ret = exchange.IO("wait_any")
//Reset Volume at the right time
if (ret.Nano/1000000 - ts > 60000) {
preVolume = 0
}
//Target the exchange where the event occurred
var e = exchanges[ret.Index]
//Get ticker, because of switching mode as return before, so here is the updated market, and GetTicker won't fail
//Only the Tick with increasing volume is displayed. It no need to compare actual process, just process it.
var ticker = e.GetTicker()
if (ticker.Volume >= preVolume){
Log(ret,ticker.Last, ticker.Volume)
preVolume = ticker.Volume
}
}
}