Wednesday 22 November 2017

Qwfix trading system


O QWFIX é uma solução completa do sistema de negociação em todas as principais tecnologias. QWFIX. Net Sistema de negociação baseado em FIX de propósito geral Gateway de FIX de propósito geral Motor de regras complicado projetado para uso corporativo QWFIX Java e QWFIX RTSJ Implementação de Java puro Totalmente interoperável com QWFIX. Net QWFIX C Ultra High Frequency Trading Completamente re-projetado para comércio de alta freqüência Protocolos nativos, sistema multi-threading livre de 100 bloqueios, acesso direto ao mercado Latência interna lt3us. Meio round-trip-wire-to-wire quote-to-trade sobre 10us com o cartão Solarflare e o OpenOnLoad. (Testado com entrada de pedido CME FIXFast e iLink). Futuros, ações e dados de mercado FX e conectividade de pedidos. Certificado com CME e Hotspot Leia mais de 50MB do manual do sistema e da documentação da API do QWFIX. Net e QWFIXJ. QwtradingsystemdocumentsQWFIXIndex. html vendas no qwtradingsystem Copyright Teraspaces Inc. 2007-2017 Todos os direitos reservados. QWFIX C Equities é o último desenvolvimento da linha de produtos QWFIX que visa a negociação de ações domésticas dos EUA. Inicialmente, iremos apoiar cinco bolsas (NYSE, ARCA, NASDAQ, BATS e Direct Edge). A negociação de ações enfrenta alguns desafios em relação ao comércio de futuros. Antes de tudo, o algoritmo pode ter que acompanhar todas as mensagens de dados do mercado, filtrar os que não interessa e rastrear os livros do 8220watch list8221 e a posição da fila de suas próprias ordens o tempo todo. Considerando a quantidade de dados envolvidos (5-10GB por troca por dia) e o padrão de negociação (portfólio de dezenas ou mesmo centenas de ações), a chave é criar um manipulador de alimentação de baixa latência que possa reduzir o tic-to-trade latência. O manipulador de alimentação também precisa interagir com o sistema de gerenciamento de pedidos, pois também precisa acompanhar as posições da fila de pedidos. A chave é a eficiência. Construir um sistema de negociação eficiente melhorará a eficiência da operação (menos máquinas e menor co-localização e custo de conectividade) e lucro comercial (estar à frente dos outros para conquistar a liquidez). Isso exigirá uma gestão eficiente do design e implementação. Em uma das melhores opções de fabricação de mercado, eles usam uma máquina para trocar apenas um símbolo, basicamente tentando o seu melhor para reduzir qualquer latência possível. Em nossa pesquisa, podemos ver ocasionalmente uma possível liquidez de preço incorreto em uma viagem de ida e volta de menos de 100 microssegundos, imediatamente após a publicação. Os dados do mercado won8217t mentir, não se pode esconder o seu comércio. Supondo que seu sistema comercial seja 200 nanossegundos mais lento do que o sistema concorrente8217s por estoque em termos de tratamento de dados de mercado. Assumindo que seu algoritmo deve acompanhar 100 ações. Portanto, seu sistema é, em média, 10 microssegundos mais lento do que o sistema concorrente8217s, o que é suficiente para fazer a diferença ao competir em sinais semelhantes ou similares. Normalmente, uma empresa comercial de alta freqüência usa uma única máquina para negociar cerca de 20-30 ações, com muitas conectividade de entrada de saída para enviar ordens em round robin. O produto 8211 True Lock Free System O sistema QWFIX C Equities é verdadeiro sem bloqueio. Além de otimizar nosso sistema para a localização do cache e o pipeline amigável, nós o fizemos quase completamente sem bloqueio. O único lugar em que usamos o bloqueio é bloquear o envio de carteiras de pedidos de vários segmentos e usamos um bloqueio de rotação para fazê-lo. Além desse único bloqueio, todo o sistema é completamente livre de bloqueio, mesmo livre de instruções atômicas. O resultado é incrível, o sistema pode passar por um dia inteiro de valor histórico de aproximadamente 82 GB (cerca de 10 GB), enquanto acompanha o livro dos principais ativos ativos e simula a posição da fila de pedidos, em cerca de um minuto. Nosso design proporciona ao usuário a capacidade de explorar o máximo de paralelismo. Normalmente, um núcleo é dedicado a um segmento para um algoritmo. A atualização e recuperação de dados de mercado pode ser feita em paralelo em threads de diferenças e o sistema won8217t deve ser reduzido, independentemente de quantos segmentos estão recuperando simultaneamente os dados do mercado. O único lugar que requer o bloqueio de rotação é a parte de gerenciamento de pedidos. No entanto, esse efeito é mínimo. Em primeiro lugar, a API foi projetada para receber um portfólio de pedidos por vez. Em segundo lugar, a latência introduzida por esse único bloqueio é de 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 futuro. Mais widgets UI 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 do algoritmo pode ser usada diretamente para simular o comércio com dados históricos do mercado. Esse método é usado como um passo final do desenvolvimento da estratégia. Em outra palavra, o desenvolvedor usa nossa API para desenvolver algoritmos. Antes de usar o dinheiro real para trocar, podemos executar o algoritmo no modo 8220simulador8221 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. O custo e o risco serão significativamente reduzidos dessa maneira. Para o desenvolvimento em estágios iniciais, utilizamos o HDF5 para armazenar os dados do mercado com diferentes níveis de detalhes. Por exemplo, topo do livro, níveis superiores de livros, etc. O conjunto de dados será usado por idiomas como Python, C, Java ou. Net, etc., para fins de pesquisa. Espera-se que a QWFIX Equities esteja em produção no prazo de dois meses. Estamos trabalhando em desenvolvimento, teste e pesquisa em paralelo. Por um lado, se competimos em velocidade, haverá apenas um vencedor no mercado. Por outro lado, a velocidade só importa se as pessoas estiverem competindo no mesmo sinal (ou similar). Por isso, mesmo que as pessoas que nem sabem quando precisam ser rápidas, elas não podem se dar ao luxo de perder a vantagem da velocidade. Tecnicamente falando, o protocolo FIX é difícil de ser otimizado para a velocidade. Simplesmente não é projetado para negociação de baixa latência, em termos de protocolos de codificação e protocolo de sessão. No entanto, ainda podemos gerenciar otimizar o processamento de pedidos baseado em FIX para obter baixa latência. Afinal, o mecanismo de troca de correspondência provavelmente colocará os pacotes recebidos anteriormente na frente da fila do livro de pedidos. Um bom design deve alcançar não só o alto desempenho, mas também a usabilidade (simpatia de programação) e baixa manutenção. O design do QWFIX alcançou todos esses objetivos sem sacrificar nenhum. A chave é a API de gerenciamento de pedidos (OMS API). Ele oculta completamente a codificação de codificação de mensagens de baixo nível e o gerenciamento de sessão. O aplicativo só precisa lidar com ordens (criar, cancelar ou modificar) enquanto ainda desfruta de latência de submicrosegundos. O framework não suporta apenas o protocolo FIX, mas praticamente qualquer protocolo usado em qualquer troca neste mundo (como OUCH ou ETS). Outro desafio durante o tempo de design é o suporte para trocas múltiplas. Cada troca precisa de implementações especiais mais ou menos. Conseguimos fazer com que os desenvolvedores se sintam tão confortáveis ​​quanto possível trabalhando com o QWFIX. Em nosso design, existe apenas uma classe de Ordem universal. Existem dois tipos de classe OrderManager que funcionam juntas. Um tipo é permuta independente. Outro tipo é dependente da troca que fornece funcionalidades específicas de troca de pedidos de troca. A OMS API foi projetada para se encaixar em toda a estrutura QFTFIX HFT. Todo o sistema não é otimizado apenas para latência, mas também para a produção. Usamos a mensagem CME NewOrderSingle FIX para executar o benchmark. Em nosso servidor Intel Xeon de 3,33 GHz, alcançamos 0,8707 nós (870 ns) por mensagem para as seguintes operações combinadas: Crie um FIX NewOrderSingle Mensagem Set campos na mensagem Reserva mantendo com WHO API Codifique mensagem para fluxo de dados FIX Libere a mensagem FIX Nota 0.8707 us é a latência máxima. Como podemos usar até dois tópicos por sessão FIX de saída, a taxa de transferência real won8217t 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 sistema8217 for desafiado por qualquer outro sistema. Depois de ter publicado o blog sobre o 8220faster FAST decoder 8220, fiz algumas melhorias. Aqui está o resultado mais recente usando o mesmo arquivo de dados do CME. Tempo total 11.797371 segundos PacketsentrymaxEntries 34217764165204011116 0.344773 microssegundo por pacote 0.071411 microssegundo por entrada. Testado no mesmo Xeon de 3,3 GHz. Jeff fez algumas melhorias e agora ele pode processar o mesmo arquivo em 9,5 segundos em um Core i7 de 3,3 GHz. Então, seu resultado ainda é cerca de 20 melhores. Depois de conversar com ele, percebi que nossos decodificadores têm diferentes requisitos de usuário. Tentei fazer meu descodificador mais geral, ao custo de um pouco de desempenho. Tudo o que posso dizer é dado o mesmo requisito do 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 descodificados em uma classe predefinida, sem qualquer suposição sobre o modelo de mensagem. Cada campo possui uma bandeira de presença do tipo bool que ocupa 8 bytes na estrutura. A mensagem é gerenciada de forma eficiente dentro de um pool de objetos e toda vez que a mensagem é retornada ao pool, ela deve ser 8220reseted8221, isto é, as bandeiras de presença devem ser memset para falso. Abaixo está a definição das duas mensagens mais utilizadas no CME, MDIncRefresh e MDEntries. A nota é gerada automaticamente pelo meu sistema. Na verdade, meu sistema pode gerar código legal como esse de qualquer modelo FAST determinado. O decodificador sabe como preencher de forma eficiente a estrutura. Pode levar muitos manipuladores de modelos gerados estaticamente, bem como manipuladores gerados dinamicamente (durante o tempo de execução). É claro que os manipuladores gerados estaticamente funcionam melhor, mas o manipulador gerado dinamicamente garante a flexibilidade e robustez. Será gerada uma única 8220signature8221 juntamente com cada versão diferente do modelo FAST para garantir que o sistema possa detectar dinamicamente a mudança de versão do modelo na inicialização. Outra característica agradável sobre este design é que o decodificador pode ignorar alguns campos em que não se interessa, com um pouco de melhoria de desempenho. Por exemplo, eu nunca me importei com o campo TradeDate porque, para os instrumentos que me interessa, é apenas a data da sessão atual. Infelizmente, essa flexibilidade resulta em algum custo em termos de desempenho. Comentar a restauração da mensagem memset terá 1,5 segundos de melhoria usando os mesmos dados do CME. Para não mencionar o custo de configuração do 8220presence flags8221 durante a decodificação pode ser semelhante ou mesmo maior. No geral, estou bastante feliz com o meu descodificador FAST. Pode decodificar a uma taxa de transferência sustentável de mais de 200 MBs. Tudo começou a partir de uma publicação associada. Uma publicação sobre o desempenho de um decodificador FAST específico transformou-se em uma série de comentários com reivindicações e perguntas. Um comentário particular chamou meu interesse, do Sr. Jeffrey M. Birnbaum. Ele postou o benchmark de seu decodificador com alguns números excepcionais. Embora tenha levantado muitas dúvidas, sei que não é impossível. Na verdade, escrevi em um comentário anterior com alguns pensamentos sobre como eu posso fazer para melhorar meu decodificador. São apenas alguns pensamentos e nunca mandei implementá-lo. O trabalho Jeffery8217s me inspirou para começar a implementar minhas idéias. Então passei um fim de semana inteiro na melhoria. O resultado é bastante significativo. Vejo uma melhoria de desempenho três vezes com a minha nova implementação. Então eu enviei o Jeffrey com meu resultado e agradeci por sua inspiração. Jeff gentilmente retornou meu e-mail. E eu aprendi duas coisas de seu e-mail. Em primeiro lugar, parece que seu método é diferente do meu. Em segundo lugar, ele é extremamente confiante sobre a superioridade de seu decodificador. Então eu decidi tomar seu desafio e entrar em uma partida amistosa contra ele. Assim como Jeff disse, eu gosto de uma pequena competição e, no final, nos tornaremos um pouco melhores8221. Eu tenho que dizer que a melhoria ainda não é fácil. Eu sei o que fazer, mas é todo o trabalho tedioso e leva esforços para chegar lá. Para fazer uma longa história, consegui fazer algum tempo para o trabalho e agora, depois de uma semana, tenho algum resultado. Antes de avançarmos, permitam-me explicar os dados de mercado da CME que usei. A CME difunde informações de troca de cotação e comércio em formato FAST. A mensagem FAST (ou segmento) está envolvida em pacotes de multicast UDP. Atualmente, um pacote UDP contém apenas uma mensagem FAST. O método de codificação FAST pode comprimir informações com uma relação de compressão muito alta. A estrutura da mensagem FAST é muito flexível e bastante complicada. É basicamente uma estrutura de árvore com esquema predefinido (modelo FAST em formato XML). A mensagem mais comumente usada é chamada 8220IncrementalRefresh8221. O 8220IncrementalRefresh8221 pode conter várias entradas com citações e trocas comerciais. Por exemplo, se o melhor lance e oferta do mercado atual for: Oferta: 129000 X 200 Oferta: 128975 X 50 E há duas ordens sentadas na melhor proposta com 25 contratos cada. Se alguém enviou um pedido de mercado para levar 50 contratos do lado das propostas. Pode resultar em um 8220IncrementalRefresh8221 com 3 8220MDEntries8221: Trade 25128975 Comércio 25128975 Quote Remove Bid Level 1 Pode haver algumas confusões sobre o resultado FAST benchmark porque alguns referem 8220message8221 como 8220UDP packet8221 e alguns referem 8220message8221 como cada 8220Fast Segment8221. No exemplo acima, se 8220message8221 é referido como cada 8220Fast Segment8221, as mensagens totais são 3 caso contrário, 1. é o que sugere que 8220MBsec é a única comparação equitativa8221 e eu concordo com ele. Agora, vem o meu resultado, testado no meu servidor Xeon de 3,33 GHz com o GCC 4.4.0. Tempo total 14.743588 segundos PacketsEntriesMaxEntriesPerPacket 34217764165204011116 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 referência listado acima, o 8220packet8221 refere-se a pacotes UDP da CME. A entrada apenas se refere ao MDEntry contido no pacote (não incluindo o corpo MDIncRefresh ou MDSnapshotFullRefresh). Podemos dizer que, nesse dia, há uma média de (0.430.089) 4.83 MDEntries por pacote UDP. No entanto, a maior mensagem contém 116 entradas em um único pacote. Posso melhorar ainda, claro. Posso agora ter otimizado o número inteiro, o PMAP e o processamento de fluxo. O gerenciamento de seqüências de caracteres é parcialmente otimizado. E o dicionário não é otimizado de forma alguma (ainda está usando várias matrizes std :: vector). Eu posso espremer dúzias de nanosegundos extras de cada processamento de entrada8217s. A beleza do protocolo FAST é que, uma vez que a implementação é feita, é preciso apenas obter um arquivo de modelo de trocas que suporte dados de mercado baseados em FAST (livro Arca, Eures, EBS etc.), para decodificar os dados de mercado da troca. Então, sim, minha implementação é universal. Então, o que isso significa: para algumas estratégias, se alguém sempre precisa competir com outras pessoas em certa quantidade de ações, isso pode significar responder vários microseconds mais rápido do que concorrentes sob certas condições de mercado. We8217ve ouvido sobre reivindicação de performance de FPGAs. Mas Jeff e eu concordamos que está um pouco superestimado. Será difícil para o FPGA combinar o desempenho do descodificador de software puro implementado de forma eficiente, se não impossível. Agora, o maior gargalo é o processador de rede TCPUDP. Pode ser algo que a FPGA pode fazer para melhorar significativamente. Mas, infelizmente, não vi nenhum produto FPGA para essa direção. Possa a melhor vitória implícita e negociação feliz. P. S. No caso de você estar interessado na partida 8220friendly entre Jeff e eu, tudo o que posso dizer é que o número original do Jeff8217s é mesmo um pouco melhor que o meu (ele está usando um Core i7 de 2,99 GHz e um conjunto de dados diferente). Enquanto I8217m ainda aguardava seu resultado atualizado, eu diria que será difícil para todos nós tirar as portas dos outros 8217s. Atualização: a partir de 8 de fevereiro de 2017, à meia-noite, Jeff me enviou seu resultado de benchmark atualizado com os mesmos dados em um Core I7 de 2,93 GHz. São 12,5 segundos para processar todo o arquivo. Neste caso, eu vou ser obrigado a melhorar minha implementação. Espero que eu possa fazer isso até amanhã. Deixe o jogo continuar e fique atento QWFIX HFT CME é um conjunto completo de plataforma de negociação de alta freqüência, totalmente certificada, executada em produção para comércio de CME. As características principais incluem: QWFIX C: mecanismo de execução de algoritmo Pure C Sub 5 microssegun latência tick to trade Mecanismo de gerenciamento de ordens simples e flexível (OMS) API mecanismo API implementar e QA um novo algoritmo dentro de 2 dias Configuração baseada em GUI, em tempo real Ferramentas de monitoramento e pesquisa Ferramentas de pesquisa Simulador on-line realista baseado em C (teste e QA seu código de produção com dados de mercado em tempo real) Realista. Activulação baseada em rede baseada em simulador off-line (teste seu algoritmo com dados históricos de mercado) API de análise pós-comercial (analise seu histórico Log de comércio) Analisador histórico de dados do mercado tick-by-tick baseado em GUI O design e implementação do QWFIX se concentra na simplicidade sem sacrificar o desempenho. Desempenho O QWFIX usa as seguintes técnicas para alcançar o desempenho do tick-to-trade sub 5 microssegundo. Bloquear o modelo de encadeamento gratuito: Todo o código crítico de desempenho usa apenas bloqueios de rotação Gerenciamento de memória personalizado: todo o código crítico de desempenho usa gerenciamento de memória personalizado e sem bloqueio com pool de memória pré-alocado Arquitetura avançada: o modelo de Threading, o modelo de IO e o gerenciamento de memória são projetados para colaborar para alcançar Melhor desempenho geral Otimização OSHardware: projetado para funcionar com Linux RT Kernel e placa de rede Solarflare com driver OpenOnLoad API amigável para programadores API QWFIX C é extremamente simples e fácil de usar. Normalmente, leva um dia para implementar um novo algoritmo, teste e QA no próximo dia, e colocá-lo em produção no terceiro dia. Gerenciamento de pedidos API Um gerenciador de pedidos é criado para cada instrumento em cada dia de negociação. A API é fornecida para enviar, cancelar e modificar pedidos. Informações estáticas, como Symbol e SecurityDesc, são inicializadas apenas uma vez quando o gerenciador de pedidos é criado, para melhorar o desempenho. Várias estratégias podem ser executadas simultaneamente. Cada estratégia é identificada por um número exclusivo (número inteiro, geralmente uso um número de data, como 20170101). Implementar uma nova estratégia é extremamente fácil. O programador só precisa subclasse um objeto Estratégia e implementa seus próprios manipuladores de eventos. O log de log de alto desempenho é rápido e fácil. É preciso duas linhas de código para adicionar uma entrada ao log do sistema. Demora cerca de 200 nanossegundos e será escrito em disco de forma assíncrona. A entrada registrada pode ser visualizada com GUI ferramenta de gerenciamento em tempo real ou recuperada com API de análise pós-comércio. Configuração de gerenciamento de amplificação GUI O Enterprise Manager é usado para configurar o sistema QWFIX. Possui o seguinte: Personalizando esquema FIX (dicionário). O CME ocasionalmente pode alterar o requisito de mensagem FIX adicionando ou modificando as tags necessárias na mensagem Personalizando as sessões FIX. Especifique o iniciador e o aceitador CompID, endereços IP, programador e outros parâmetros Personalizando o mecanismo FIX. QWTradeMonitor é usado para gerenciar o processo de negociação automatizado em tempo real. QWTradeMonitor também pode ser usado como uma ferramenta de depuração durante a implementação do algoritmo. Os logsalerts em tempo real gerados pelo processo remoto podem ser monitorados com a ferramenta GUI. Observe que os mesmos registros também podem ser recuperados através da API pós-comércio, por meio de programação. Cada comunicação de mensagem FIX pode ser visualizada com detalhes completos, incluindo 3 timestamps. Por favor, não é tão rápido de antes da criação da mensagem (timstamp1) para as devoluções de chamada de envio () (timestamp3) para a mensagem de logon. Observe que demora um pouco mais para processar a mensagem de Logon. Para mensagens relacionadas a pedidos, leva apenas cerca de 2-3 microssegundos. Dados de mercado remoto em tempo real Os dados do mercado podem ser exibidos juntamente com informações breves de pedidos (pedidos totais e quantidades totais) em cada nível de preço. Ordens, Execução, Posição e PampL em Tempo Real Todas as ordens, todas as execuções e todos os campos da mensagem FIX podem ser monitorados em tempo real, juntamente com a posição em tempo real e o PampL. As estratégias de comércio remoto podem ser controladas pela QWTradeMonitor. O simulador online QWFIX C pode ser usado para testar de forma realista e sistema de negociação automatizado de produção de QA..Net Offline Simulator Net offline simulator pode ser usado para pesquisar de maneira realista estratégias comerciais. API de análise de pós-análise pós-negociação API de publicação pós-rede pode ser usada para fazer análises pós-comércio. Demora cerca de 10 linhas de código para recuperar todos os detalhes do fluxo de pedidos inteiro. Os pedidos podem ser agrupados por diferentes estratégias. Cada ordem ou execução pode ser comparada com os dados de mercado exatos no momento em que foi processado. Toda mudança de status pode ser analisada visualmente com a ferramenta de pesquisa baseada em GUI QWTradeAnalyzer. O QWTradeAnalyzer QWTradeAnalyzer baseado em GUI pode ser usado para analisar os dados históricos do mercado tick-by-tick. Múltiplos instrumentos podem ser sincronizados por timestamps para explorar a oportunidade de negociação spreadcross-asset-class As ordens e execuções podem ser sincronizadas com dados de ticks para pesquisa de estratégia de negociação ou análise pós-negociação. Produtos e serviços relacionados ao FIX Os fornecedores de produtos e serviços habilitados para FIX podem Publique informações sobre produtos e serviços aqui. As postagens são da exclusiva responsabilidade dos fornecedores O FIX Protocol Limited (FPL) não endossa produtos ou serviços do fornecedor. Muitas empresas fornecedoras se juntaram à FPL para apoiar, tanto financeiramente como com seus conhecimentos voluntários, nossos esforços na definição, gerenciamento e promoção do Protocolo FIX para o benefício da comunidade de serviços financeiros em todo o mundo. Valorizamos muito esse patrocínio e reconhecemos nossos membros listando-os primeiro e denotando-os com o ícone FPL ou FPL Premier Global. Produtos de membros da FPL

No comments:

Post a Comment