Qwfix trading system
QWFIX C Equities é o desenvolvimento mais recente da linha de produtos QWFIX que visa o comércio de ações domésticas dos EUA Inicialmente, vamos apoiar cinco trocas NYSE, ARCA, NASDAQ, BATS e Edge direta. Equities negociação enfrenta alguns desafios em relação ao comércio de futuros Primeiro de tudo, O algoritmo pode ter de manter o controle de cada mensagem de dados do mercado, filtrar os que não está interessado e rastrear os livros da lista de observação ea posição da fila de suas próprias encomendas todo o time. Considering a quantidade de dados envolvidos 5- 10GB por troca por dia eo padrão de negociação carteira de dezenas ou mesmo centenas de ações, a chave é a construção de um manipulador de latência baixa alimentação que pode reduzir o tick-to-trade latency. Feed manipulador também tem de interagir com a ordem de gestão Sistema, porque necessita manter-se a par de posições da fila da ordem também. A chave é eficiência Construir o sistema de troca eficiente melhorará a eficiência da operação menos máquinas e co-local mais baixo e custo da conectividade e trad Ing que está à frente de outros para pegar a liquidez Fazendo isso vai exigir uma gestão eficiente de design e implementação. Em um mercado de opções superior fazendo firme, eles usam uma máquina para negociar apenas um símbolo, basicamente tentando seu melhor para reduzir qualquer latência possível. Nossa pesquisa, podemos ver ocasionalmente uma possível falta de preço de liquidez é tomada dentro de menos de 100 microssegundo viagem de ida e volta, imediatamente após ele foi postado Os dados de mercado não vai mentir, não se pode esconder o seu trade. Assuming seu sistema comercial é de 200 nanossegundos Mais lento do que o sistema do concorrente por ação em termos de manipulação de dados de mercado Supondo que seu algoritmo tem de manter o controle de 100 ações Então, seu sistema é em média 10 microssegundo mais lento do que o sistema concorrente, o que é suficiente para fazer a diferença quando competir no mesmo ou Sinais semelhantes. Normalmente, uma alta empresa de negociação de alta freqüência usa uma máquina apenas para o comércio de ações cerca de 20-30, com muitos de saída conectividade entrada de ordem para enviar ordens no round robin. The Prod Uct Sistema True Lock Free O sistema QWFIX C Equities é verdadeiro bloqueio livre Além de otimizar nosso sistema de localidade de cache e pipeline amigável, fizemos quase completamente lock-free. O único lugar que usamos bloqueio é bloquear guarda enviando carteira de ordens A partir de vários segmentos, e usamos um bloqueio de rotação para fazê-lo Além desse bloqueio único, todo o sistema é completamente livre de bloqueio, mesmo livre de instruções atômicas. O resultado é incrível, o sistema pode executar através de um valor de dia inteiro de Dados históricos de cerca de 10GB, mantendo a trilha do livro de 600 ações ativas e simular a posição da fila de ordem, dentro de um minuto. Nosso projeto dá ao usuário a capacidade de explorar paralelismo máximo Normalmente um núcleo é dedicado a um segmento para um algoritmo Dados de mercado Atualização e recuperação pode ser feito em paralelo dentro de threads de diferença eo sistema won t ser abrandado para baixo a qualquer taxa, não importa quantos threads estão simultaneamente recuperando os dados de mercado. O único lugar que requer o s Pin lock é a parte da gestão da ordem No entanto, esse efeito é mínimo Em primeiro lugar, a API é projetado para ter um portfólio de ordens em um momento Em segundo lugar, a latência introduzida por esse único bloqueio é apenas cerca de 100-200 nanossegundos se não houver contenção . O sistema QWFIX C Equities compartilha o mesmo console de gerenciamento com nosso produto de futuros Mais widgets de interface do usuário são adicionados para o gerenciamento de negociação de ações. A API é cuidadosamente projetada para unificar o ambiente de pesquisa e produção A mesma implementação de algoritmo pode ser usada diretamente para simular negociação com histórico Os dados de mercado Esse método é usado como uma etapa final do desenvolvimento da estratégia. Em outra palavra, desenvolvedor usar a nossa API para desenvolver algoritmos Antes de usar o dinheiro real para o comércio, podemos executar o algoritmo no modo simulador com dados históricos Ele irá simular com precisão o algoritmo Será a mesma API e mesmo código para produção e simulação Custo e risco serão significativamente reduzidos desta forma. Para o desenvolvimento em Nos primeiros estágios, usamos HDF5 para armazenar os dados de mercado com diferentes níveis de detalhes Por exemplo, top de livro, n níveis de livro, etc O conjunto de dados será usado por linguagens como Python, C, Java ou etc para fins de pesquisa. QWFIX Equities deverá estar em produção dentro de dois meses Estamos trabalhando em desenvolvimento, testes e pesquisa em paralelo. Por um lado, se competir em velocidade, haverá apenas um vencedor no mercado Por outro lado, a velocidade só Questões se as pessoas estão competindo sobre o mesmo sinal ou semelhante Isso é por isso mesmo se as pessoas don t sabe mesmo quando eles vão precisar de ser rápido, eles não podem dar ao luxo de perder a vantagem de velocidade. Tecnicamente falando, o protocolo FIX é difícil de ser Otimizado para a velocidade Não é simplesmente projetado para negociação de baixa latência, tanto em termos de codificação de protocolo de decodificação e protocolo de sessão No entanto, ainda podemos gerenciar para otimizar a manipulação de ordem com base em FIX para obter baixa latência Depois de tudo, colocar Os pacotes que recebe mais cedo para a frente da fila de um livro de encomendas. Um bom design deve atingir não só de alto desempenho, mas também facilidade de programação de usabilidade e baixa manutenção O design do QWFIX alcançou todas essas metas sem sacrificar qualquer. A chave é a Ordem Management API OMS API Oculta completamente a descodificação de mensagens de baixo nível e o gerenciamento de sessão O aplicativo só precisa lidar com ordens de criar, cancelar ou modificar enquanto ainda está desfrutando latência de sub-microsegundos O framework suporta não apenas o protocolo FIX, mas virtualmente qualquer protocolo usado em Qualquer intercâmbio neste mundo, como OUCH ou ETS. Outro desafio durante o tempo de design é o suporte para múltiplas trocas Cada troca precisa de implementações especiais mais ou menos Nós conseguimos fazer os desenvolvedores se sintam o mais confortável possível trabalhando com QWFIX Em nosso projeto, há Apenas uma classe de Ordem universal Existem dois tipos de classe OrderManager que trabalham em conjunto Um tipo é independente de troca Outro tipo é dependente de câmbio que fornece funcionalidades de manipulação de pedidos específicas de troca. A OMS API é projetada para se encaixar em toda a estrutura QFT HFT O sistema inteiro não só é otimizado para latência, mas também para a taxa de transferência também. Usamos a mensagem CME NewOrderSingle FIX para Executar o benchmark. On nosso servidor Intel Xeon 3 33 GHz, conseguimos 0 8707 us 870 ns por mensagem para as seguintes operações combined. Create um FIX NewOrderSingle Message. Set campos na mensagem. Conservar a manutenção com OMS API. Encode mensagem para FIX Dado que podemos usar até dois threads por sessão de FIX de saída, a taxa de transferência real não será limitada por esse número de latência se a rede não for o gargalo. Posso Melhorar ainda mais o desempenho se o desempenho do nosso sistema é desafiado por qualquer outro sistema. Depois que eu postei o blog sobre o decodificador FAST mais rápido, eu fiz algumas melhorias Aqui está o último resultado usando o Mesmo arquivo de dados CME. Total tempo 11 797371 segundos Packets entrada maxEntries 34217764 165204011 116 0 344773 microssegundo por pacote 0 071411 microssegundos por entrada. Testado no mesmo 3 3 GHz Xeon. Jeff fez algumas melhorias e agora ele pode processar o mesmo arquivo dentro de 9 5 segundos em um 3 3 GHz Core i7 Portanto, seu resultado ainda é cerca de 20 better. After falar com ele eu percebi que nossos decodificadores têm diferentes requisitos do usuário Eu tentei fazer meu decoder propósito mais geral ao custo de um pouco de performance. All Posso dizer que é dado o mesmo requisito de usuário que eu posso fazer uma implementação tão rápida quanto a dele. Mas eu gostaria de ficar com minhas classes normalizadas atuais. Minha implementação será capaz de preencher os campos decodificados em uma classe predefinida, sem qualquer suposição sobre o Modelo de mensagem Cada campo tem uma marca de presença de tipo bool que ocupa 8 bytes na estrutura A mensagem é gerenciada eficientemente dentro de um pool de objetos e toda vez que a mensagem é retornada para o pool ela precisa ser redefinida Ed, ou seja, a presença sinalizadores tem de ser memset para false. Below é a definição das duas mensagens mais utilizadas em CME, MDIncRefresh e MDEntries Nota é foi gerado automaticamente pelo meu sistema Na verdade, o meu sistema pode gerar código agradável como este a partir de qualquer dado FAST O decodificador sabe como preencher eficientemente a estrutura. Pode levar muitos manipuladores de modelo gerados estaticamente, bem como manipuladores gerados dinamicamente durante o tempo de execução. Evidentemente, os manipuladores gerados estaticamente melhoram, mas o manipulador gerado dinamicamente garante a flexibilidade e robustez. Juntamente com cada versão diferente do modelo FAST para garantir que o sistema pode detectar dinamicamente a mudança de versão de modelo na inicialização. Outra característica agradável sobre este projeto é que o decodificador pode ignorar alguns campos que não está interessado, com um pouco de melhoria de desempenho Exemplo, eu nunca me importei com o campo TradeDate, porque para os instrumentos estou intereste D nele é apenas a sessão atual date. Unfortunately esta flexibilidade resulta em algum custo em termos de desempenho Comentando a mensagem memset reset terá 1 5 segundos de melhoria usando os mesmos dados CME Para não mencionar o custo de definir as bandeiras de presença Durante a decodificação poderia ser semelhante ou mesmo higher. Overall estou bastante feliz com o meu descodificador FAST Ele pode decodificar a taxa de transferência sustentável de mais de 200MB s. Tudo começou a partir de um post linkedin Um post sobre o desempenho de um determinado descodificador FAST transformado em uma série De comentários com reivindicações e perguntas. Um comentário em particular pegou o meu interesse, de Jeffrey M Birnbaum Ele postou o benchmark de seu decodificador com alguns números excepcionais Embora levantou um monte de dúvidas eu sei que não é impossível Como uma questão de fato eu escrevi Em um comentário anterior com alguns pensamentos sobre como eu posso fazer para melhorar o meu decodificador É apenas alguns pensamentos e eu nunca me incomodei para implementá-lo O trabalho de Jeffery inspirou-me a começar a implementar Minhas idéias. Então eu passei um fim de semana inteiro sobre a melhoria O resultado é bastante significativo vejo uma melhoria de desempenho três vezes com a minha nova implementação Assim, eu emailed Jeffrey com o meu resultado e agradeceu-lhe por sua inspiração Jeff amável retornou meu e-mail E eu aprendi dois Coisas de seu e-mail Primeiro de tudo, parece que seu método é diferente do que o meu Segundo, ele é extremamente confiante sobre a superioridade do seu decoder. So eu decidi tomar o seu desafio e entrar em uma partida amigável contra ele Assim como Jeff disse, Eu gosto de um pouco de competição e no final vamos fazer uns aos outros um pouco melhor Eu tenho que dizer melhorias ainda não é fácil Eu sei o que fazer, mas é todo o trabalho tedioso e leva esforços para chegar lá Para fazer longa história curta, Eu consegui fazer algum tempo para o trabalho e agora, depois de uma semana, eu tenho um resultado. Antes de ir mais longe, deixe-me explicar primeiro os dados de mercado de CME que eu usei CME dissemina tanto a mudança de cotação e informações comerciais em forma rápida Em A mensagem ou segmento FAST é embrulhado em pacotes UDP multicast Atualmente um pacote UDP contém apenas uma mensagem FAST O método de codificação FAST pode comprimir informações com taxa de compressão muito alta. A estrutura da mensagem FAST é muito flexível e bastante complicado É basicamente uma árvore Estrutura com esquema predefinido Modelo FAST no formato XML A mensagem mais comumente usada é chamada IncrementalRefresh O IncrementalRefresh pode conter várias entradas com cotação e alterações comerciais. Por exemplo, se o melhor lance e oferta atual de mercado for Oferta 129000 X 200 Bid 128975 X 50 E Há duas ordens que sentam-se na melhor oferta com 25 contratos cada Se alguém emitiu uma ordem do mercado para fazer exame de 50 contratos do lado da oferta Pode resultar em um IncrementalRefresh com 3 MDEinterries Comércio 25 128975 Comércio 25 128975 Citação Remover o nível da oferta 1.There pode haver algum Confusões sobre o resultado de benchmark FAST porque alguns referem mensagem como pacote UDP e alguns referem mensagem como cada segmento rápido no exemplo acima , Se a mensagem é referida como cada Segmento Rápido, então o total de mensagens é 3 caso contrário, é 1.Jeff sugere que MB seg é a única comparação justa e eu concordo com ele. Agora aqui vem o meu resultado, testado no meu 33GHz Xeon Servidor com GCC 4 4 0. Tempo total 14 743588 segundos Pacotes Entradas MaxEntriesPerPacket 34217764 165204011 116 0 430875 microssegundo por pacote 0 089245 microssegundo por entrada. Benchmarked usando um arquivo com tamanho de 2.838.336.532 bytes No resultado de benchmark listado acima, o pacote refere-se a UDP Pacotes de entrada CME só se refere a MDEntry contido no pacote não incluindo o MDIncRefresh ou MDSnapshotFullRefresh body. We pode dizer que para esse dia há uma média de 0 43 0 089 4 83 MDEntries por pacote UDP No entanto, a maior mensagem contém 116 entradas em Um pacote único. Posso melhorá-lo ainda É claro que eu posso Agora eu tenho otimizado o integer, PMAP e fluxo de manipulação Manipulação de seqüência é apenas parcialmente otimizado E dicionário não é otimizado em tudo isso Ainda está usando várias matrizes vetoriais std eu posso facilmente espremer dezenas de nanossegundos extra de cada transformação de entrada s. A beleza sobre o protocolo FAST é que uma vez que a implementação é feita, só precisa obter um arquivo de modelo de trocas que suporta FAST baseados dados de mercado Arca livro, Eures, etc EBS, a fim de decodificar os dados de mercado da troca Então, sim, minha implementação é universal. Então o que significa. Para algumas estratégias, se é preciso sempre competir com os outros em certa quantidade de ações, Ele poderia significar responder muitos microssegundos mais rápido do que os concorrentes sob determinadas condições de mercado. Nós ouvimos falar de reivindicação de desempenho de FPGAs Mas ambos Jeff e eu concordamos que é um pouco sobrevalorizado Será difícil para FPGA para corresponder ao desempenho do descodificador de software puramente implementado, Se não impossível Agora o maior gargalo é TCP UDP rede processador Pode ser algo FPGA pode fazer para fazer melhorias significativas Mas infelizmente eu não vi qualquer produto FPGA ir Se você está interessado na partida amigável entre Jeff e eu, tudo o que posso dizer é que o número original de Jeff é mesmo um pouco melhor do que o meu, ele está usando um 2 99 GHz Core i7 e um conjunto de dados diferentes Enquanto eu ainda estou esperando por seu resultado atualizado, eu diria que será difícil para qualquer um de nós para soprar as portas fora do outro s. Update A partir de 08 de fevereiro de 2017, À meia-noite, Jeff Me enviou seu resultado de benchmark atualizado com os mesmos dados em um 2 93 GHz Core I7 É 12 5 segundos para processar todo o arquivo Neste caso, eu vou ser obrigado a melhorar a minha implementação Espero que eu possa fazê-lo por Amanhã Deixe o jogo continuar E ficar afinado. QWFIX HFT CME é um conjunto completo de plataforma de negociação de alta freqüência, totalmente certificada, executando em produção para negociação CME As principais características incluem. QWFIX C algoritmo de execução C puro algoritmo. Sub 5 microssegundo tick-to - trade latency. Simple, gerenciamento de pedidos flexível OMS API. Strategy Motor API implementar e QA um novo algoritmo dentro de configuração de 2 days. GUI baseado, monitoramento em tempo real e ferramentas de pesquisa. Research tools. Realistic C baseado em teste de simulador on-line e QA seu código de produção com dados em tempo real market. Realistic baseados offline simulador API Testar o seu algoritmo com dados de mercado históricos. Post-trade analyzer API analisar o seu historial de comércio log. GUI baseado histórico tick-by-tick market analisador de dados. A concepção e implementação de QWFIX centra-se na simplicidade sem sacrificar o desempenho. QWFIX usa as seguintes técnicas para Alcançar 5 microssegundo tick-to-trade performance. Lock modelo de threading livre Todo o código crítico de desempenho usa bloqueios de rotação only. Customized gerenciamento de memória Todo o código crítico de desempenho usa gerenciamento de memória personalizado e sem bloqueio com pool de memória preallocated. Advanced arquitetura Threading modelo, IO Modelo e gerenciamento de memória são projetados para colaborar para alcançar o melhor desempenho geral. O trabalho com o Linux RT Kernel e cartão de rede Solarflare com OpenOnLoad driver. Programmer Friendly API. QWFIX C API é extremamente simples e fácil de usar Geralmente leva um dia para implementar um novo algoritmo, teste e QA no dia seguinte e coloque Em produção no terceiro dia. Order Management API. Uma gerência de ordem é criada para cada instrumento em cada dia de negociação API é fornecida para enviar, cancelar e modificar ordens Informações estáticas, como Symbol e SecurityDesc, só são inicializadas uma vez quando a ordem Gerente é criado, a fim de melhorar o desempenho. Múltiplas estratégias podem ser executados simultaneamente Cada estratégia é identificada por um número único inteiro, eu costumo usar um número de data, como 20170101.Implementing uma nova estratégia é extremamente fácil Programador só precisa subclasse um objeto Estratégia E implementar os seus próprios handlers. High Performance Logging. Logging é rápido e fácil É preciso duas linhas de código para adicionar uma entrada ao log do sistema Ele leva cerca de 200 nanossegundos e será writte N para o disco de forma assíncrona A entrada registrada pode ser visualizada com GUI ferramenta de gerenciamento em tempo real ou recuperada com análise de pós-negociação API. Configuration Management GUI. Enterprise Manager é usado para configurar o sistema QWFIX Possui o seguinte. Customizing FIX esquema dicionário CME pode ocasionalmente Alterar o requisito para a mensagem FIX, adicionando ou modificando as tags necessárias em message. Customizing FIX sessões Especificar o iniciador e aceitador CompID, endereços IP, programador e outros parâmetros. Customizing FIX engine. QWTradeMonitor é usado para gerenciar o processo de negociação automatizada em tempo real. O QWTradeMonitor também pode ser usado como uma ferramenta de depuração durante a implementação do algoritmo. Os alertas de logs em tempo real gerados pelo processo remoto podem ser monitorados com a ferramenta GUI. Note que os mesmos logs também podem ser recuperados através da API pós-trade programmatically. Ser visto com detalhes completos, incluindo 3 timestamps Por favor não como rapidamente é de antes da criação da mensagem timstamp1 Para a chamada de envio retorna timestamp3 para a mensagem de logon Observe que demora um pouco mais para processar a mensagem de logon Para mensagens relacionadas com a ordem leva apenas cerca de 2-3 microssegundos. Real tempo de dados de mercado remoto Data. Market pode ser exibido juntamente com informações de ordem breve Ordens e quantidades totais em cada nível de preço. Real-tempo Ordens, Execução, Posição e P L. Every ordem, cada execução e cada campo na mensagem FIX pode ser monitorado em tempo real, juntamente com a posição em tempo real e P Estratégias de negociação L. Remote pode ser totalmente controlado por QWTradeMonitor. QWFIX C simulador on-line pode ser usado para testar realisticamente e QA produção automática sistema de negociação. Simulador off-line offline simulador pode ser usado para investigar realisticamente estratégias de negociação. A API de pós-negociação API de pós-negociação pode ser usada para fazer análise de pós-negociação Demora cerca de 10 linhas de código para recuperar todos os detalhes do fluxo de pedidos inteiro As ordens podem ser agrupadas por estratégia diferente Cada ordem ou execução pode ser comparada com os dados de mercado exatos No momento em que foi processado. Toda a mudança de estado pode ser analisada ainda mais visualmente com a ferramenta de pesquisa baseada na GUI QWTradeAnalyzer. GUI Baseado QWTradeAnalyzer. QWTradeAnalyzer pode ser usado para analisar tick-by-tick dados históricos do mercado. Múltiplos instrumentos podem ser sincronizados por timestamps Para explorar propagação cross-asset-classe oportunidade de negociação. Orders e execuções podem ser sincronizados com dados de carrapatos para a pesquisa de estratégia de negociação ou de pós-negociação analysis. Session nível ou nível de negócios mensagem Reject. Session nível Rejeitar e nível de aplicação BusinessMessageReject mensagens tornar o gerenciamento de pedidos mais Complicado. Por exemplo, um aplicativo de lado de compra enviou uma nova ordem para o lado de venda A mensagem de sessão de lado de venda validato R ou as regras personalizadas de Visual Lambda podem rejeitar a mensagem no nível de sessão Nesse caso, uma mensagem Rejeitar FIX é enviada para o lado de compra E o aplicativo de lado de venda nunca terá a chance de ver a mensagem porque foi rejeitada no nível de sessão Sem ter a chance de alcançar o nível do aplicativo. Para receber eventos relacionados ao nível de sessão rejeita o aplicativo é necessário para implementar um FIXSessionOrderManagerSessionRejectListener interface. Listener pode ser adicionado ou removido de uma instância FIXSessionOrderManager chamando e. Event Handlers. In QWFIX, Rejeições de nível de sessão são devidamente tratadas para as seguintes mensagens de FIX. FIX Tipo de Mensagem. A Mensagem de Pedido de Status de Pedido é rejeitada Vender lado won t ver o request. Note a rejeição não deve acontecer no ambiente de produção Indica a implementação problemática da lógica de negócios No QWFIX Fazemos o nosso melhor para minimizar o impacto do problema Entretanto, mensagens de alerta de erro serão gravadas no log, whic H é acessível por meio de nossa ferramenta de gerenciamento baseada em GUI, QWRTAnalyzer. Business Message Reject. Business Message Reject somente gera uma entrada no log de eventos de alerta Recomendamos usar o Business Message Reject para rejeitar mensagens inválidas relacionadas a listas e ordens cruzadas. Nossos clientes como implementar a lógica porque ele não faz parte da especificação padrão FIX. Teraspaces irá trabalhar em estreita colaboração com os nossos clientes para adicionar o seu erro personalizado lidar com a lógica de negócios em nosso componente de gerenciamento de pedidos. Automatic Order Status Update. O QWFIX Order Manager runtime wil Automaticamente corrigir o status da ordem quando uma mensagem é rejeitada no nível de sessão. Por exemplo, se uma ordem é enviar e rejeitado pelo contraparte no nível de sessão, não só um evento sessionRejectedOrder será acionado O OrdStatus da ordem será automaticamente Mudou para Rejeitado E um evento será acionado também. A mesma coisa acontece quando um pedido de cancelamento ou pedido de substituição Cance é rejeitado No nível da sessão Esses pedidos serão removidos de pedidos pendentes O efeito é o mesmo que o de um Cancel Reject. Performance - Latency, Throughput etc. Fizemos um teste de latência do QWFIX Trading System em diferentes sabores As versões regulares regulares de Java e RTSJ Versão com Java. We tempo real executar dois processos na mesma máquina Um processo de servidor e um processo de cliente Existem 5 sessões de FIX entre cliente e servidor, executando versões FIX de 4 1 a 5 0SP1 Ambos os processos são construídos com QWFIX SDK com QWFIX ordem API de gerenciamento. Por favor, note no teste de benchmark, medimos a latência de todo o sistema, não apenas a latência do motor FIX. A latência será a latência do mecanismo FIX mais o sistema de gerenciamento de pedidos. Porque é difícil sincronizar o Tempo, nós funcionamos o processo do cliente eo processo do usuário na mesma máquina E nós medimos a latência do desengate redondo no side. Without do cliente sem perda de generalidade, cada vez que o cliente enviará um New Order Si Ngle FIX mensagem, para uma sessão selecionada aleatoriamente entre todas as 5 sessões disponíveis Quando o servidor recebe a mensagem New Order Single, ele executa todas as verificações necessárias, tais como ClOrdID verificar evitar duplicado ClOrdID e faz todo livro mantém, também Então o servidor irá gerar uma confirmação Executar Relatório para essa ordem específica e enviá-lo de volta Quando o cliente recebe o Relatório de Execução, ele registra a latência para essa única ordem e repetindo o processo, enviando uma outra order. In o teste 1 milhão New Order Single mensagens são enviadas a partir do cliente, e Por sua vez 1 milhão de mensagens de relatório de execução são enviadas pelo servidor O cliente registra 1 milhão de números de latência em micro-segundos. Hardware e hardware OS. The é uma estação de trabalho com um processador de 2 67GHz Intel Core i7 920, 12GB de memória e 1 5TB de seagate Está funcionando em um Windows Vista Ultimate de 64 bits As versões de QWFIXJ e de QWFIXRTSJ estão funcionando em um linux de 64 bits OpenSuse 11 1 com kernel. Latency em tempo real Resultado para QWF IXRTSJ. Como esperado, o QWFIXRTSJ executando em um Sun Java VM em tempo real oferece o melhor número de latência. Uma única latência de viagem única 0 32ms.99 999 mensagens tem 1ms latency.0 mensagens 001 tem 2ms latency.1 fora de 1 milhão de mensagens tem anormalmente Jitter de 10-400ms Acreditamos que é causado pelo sistema de arquivos e não há nada que possamos fazer sobre it. As mostrado no diagrama abaixo, o QWFIX RTSJ oferece uma latência média de 633 microssegundo 0 633 milissegundo de latência de ida e volta. Note cada A latência de ida e volta incluirá a codificação de 2 mensagens FIX, a descodificação de duas mensagens FIX ea lógica de negócios de gerenciamento de ordens, além da sobrecarga de rede entre dois processos rodando em uma única máquina. A primeira mensagem de 30 FIX de cada sessão FIX terá leve maior Latência primeira mensagem é de cerca de 18 ms, eo restante 30 terá cerca de 2ms-3ms latência de ida e volta É causada pelo JIT just-in-time compilador da máquina virtual Esse comportamento é observado em ambas as máquinas virtuais Java O JIT tem Para compilar dinamicamente o código sempre que o código é executado É feito dinamicamente porque é impraticável para compilar todo o ambiente de tempo de execução na hora de início. RTSJ tem uma maneira de pré-gravar alguns possíveis caminhos de execução e pré-compilar tudo ao longo do caminho durante O início up. We ter um trabalho muito engraçado em torno de enviar 30 pedidos dumy no início do dia e cancelá-los imediatamente e ele funcionou muito bem. Jitters - 2ms - 4ms Round Trip latência 1 em 100.000 mensagens. Nós fizemos periodicamente observar ligeiramente Maior latência durante o teste Para cada mensagem em cerca de 100,0000 mensagens, teremos uma latência de ida e volta de cerca de 2ms e 4ms. Extreme Jitters - 4ms - 400ms 1 em um milhão chance. There são 4 de 4 milhões de mensagens FIX Nós processamos incured latências muito maiores Essas latências acontece maneira fora da linha, variando de dezenas de milissegundos para centenas de milissegundos Felizmente, as chances de que os picos de latência extrema são muito raros Esperar uma tal latência Por cada 1 milhão de mensagens FIX. Suspeitamos que o 1 de um milhão de picos de latência de chance são disparados pelo sistema de arquivos, o que é totalmente fora do controle de qualquer pessoa. Acreditamos que tais latências são o resultado da falha do sistema e não podem ser evitadas Agora, não importa qual linguagem de programação você usa. Como esperado, QWFIX realmente não pode fornecer qualquer garantia de latência Atualmente só vem com coletor de lixo regular que periodicamente pausar o mundo para fazer coleta de lixo Cerca de 2 do total de mensagens sofrem uma latência de ida e volta de 2ms - 100 ms. No entanto, a oferta muito maior taxa de transferência do que Java Na mesma máquina, observamos a latência média de cerca de 0 33ms, 60 melhor do que QWFIXJ e QWFIXRTSJ. Our e QWFIXJ seguem exatamente o mesmo projeto Como uma questão de fato, Fez mais otimização em versão Java do que versão No entanto, a versão Net ainda está funcionando muito mais rápido do que a versão Java, em todas as plataformas. QWFIXJ doesn t oferecer boa latência, quer Durante o teste, nós descobrimos o perf Ormance é melhor no Linux do que no Windows Vista. Discussão - QWFIXRTSJ vs QWFIXJ. The tempo real Java RTSJ é fantástico Ele oferece o desempenho exatamente como prometeu Sun É muito adequado para negociação de alta freqüência trading. Our QWFIXRTSJ tem exatamente o mesmo projeto como E QWFIXJ O código-fonte de QWFIXRTSJ é quase o mesmo que QWFIXJ A diferença é menos de 50 linhas de código. Agora a questão é Por que não substituir completamente QWFIXJ com QWFIXRTSJ. Well, o QWFIXRTSJ tem um inconveniente, e apenas um inconveniente A partir de agora Sun oferece apenas 32 bits versão do RTSJ Na prática, podemos apenas alocar cerca de 3GB de memória para RTSJ habilitado processos Podemos armazenar em cache cerca de 6 milhões de mensagens FIX em cerca de 2GB de memória e deixar o resto 1GB para outro uso E isso é Praticamente o limite superior de capacidade de QWFIXRTSJ por processo, que se traduz em cerca de pouco mais de 1 milhão de pedidos. QWFIXJ é otimizado para 32 bits e 64 bits de máquina virtual Em 64 bits Java a capacidade de Q WFIXJ é praticamente ilimitado. Discussão - QWFIXRTSJ vs. Primeiro de tudo, eles usam diferentes tecnologias Net vs Java. According a nossa observação, a máquina virtual é geralmente mais rápido do que Java VM, pelo menos para QWFIX products. However Net só está disponível para Windows Plataforma Mesmo que Mono tenha evoluído bastante maduro em outras plataformas, a taxa de adoção para aplicações comerciais em Mono ainda é bastante pequeno. Há muitos fatores precisam ser considerados quando se trata de qual plataforma de tecnologia para escolher Estamos muito bem preparados para oferecer todos Diferentes sabores para os nossos clientes. Nem Windows nem é difícil sistema de tempo real por agora Em primeiro lugar, o kernel do Windows é apenas como kernels Linux normal, que não é totalmente preventiva O kernel não pode garantir um trabalho de alta prioridade vai preempt um trabalho de baixa prioridade em A qualquer momento Podemos fazer um kernel do Linux totalmente preventivo, aplicando o patch do kernel apropriado No entanto, não há tal opção na plataforma Windows. Faz o Windows e completamente fora do acaso f Ou negociação de alta freqüência Bem, mesmo que o Windows não é duro tempo real OS Ainda é muito rápido e pode servir como um sistema operacional em tempo real suave em muito bem No próximo ano, a Microsoft lançará 4 0, que contará com um novo tipo de GC chamado Background GC, que é muito semelhante ao GC em tempo real usado em RTSJ Será interessante ver como funciona em 4 0.Remember com RTSJ ainda temos nervosismo, mesmo que isso aconteça muito raramente Estamos lidando com um sistema bastante complicado e nada Pode ser garantido Que é a realidade Teoricamente, Mesmo um espirro pode afetar a vibração do seu disco rígido e, portanto, afetar a taxa de transferência. Felizmente, temos uma maneira de testar o desempenho do nosso sistema e são bastante confiantes sobre como ele se comporta Depois de tudo , No mundo de negociação estamos lidando com incerteza muito maior Nós fornecemos informações suficientes para os nossos clientes e cabe a eles escolher qual a tecnologia é o melhor deles. QWFIX é um propósito geral, FIX protocolo com base no sistema de negociação com abou T 50 linhas de código um pode gerenciar todo o fluxo de ordem intra-dia. Para obter informações sobre o design do QWFIX Trading System, por favor leia o nosso white paper de design.
Comments
Post a Comment