Forex zmq
ZeroMQ comunicação assíncrona - biblioteca para o MetaTrader 4.
Estas são ligações parciais à biblioteca zeromq juntamente com uma demonstração de um soquete tcp zeromq. Se alguém faz ligações mais completas, compartilhe! Talvez eu precise de todos os recursos. A versão do vinho Linux também está incluída.
& quot; Ø A biblioteca de soquetes que atua como uma estrutura de simultaneidade.
Ø Carrega mensagens em inproc, IPC, TCP e multicast.
Ø Conecte N-to-N via fanout, pubsub, pipeline, request-reply.
Ø Rápido o suficiente para produtos em cluster e supercomputando.
Ø Asynch I / O para aplicativos escaláveis de passagem de mensagens multicore.
Ø Comunidade ampla e ativa de código aberto.
Ø 20 idiomas, incluindo C, C ++, Java,, Python.
Ø A maioria dos sistemas operacionais incluindo Linux, Windows, OS X.
Ø software livre LGPL com suporte comercial completo. & Quot;
E é muito simples de usar. Observe que você não pode se conectar automaticamente a um soquete bruto, estamos conectando o zeromq ao zeromq aqui. Embora eu pense que há suporte para adicionar sockets brutos em uma rede usando zeromq_poll, embora eu ainda não liguei isso.
VERSÃO 2: bibliotecas précompiladas para Windows e Linux x86 32 bits adicionados (usando zeromq versão 2.0.10). Adicionado o script de compilação do cmake para o Windows. Atualizou o script zeromq para que ele use a porta 127.0.0.1, em vez de 'localhost' que não funciona. E, o mais importante, corrigiu um erro de memória compartilhada entre a biblioteca mql4 e zeromq - basicamente, agora copiamos as strings enviadas para a nossa biblioteca de wrappers e copiamos novas strings quando solicitamos dados de uma mensagem. Observe que não há cheque se o malloc retornar nulo no código de exemplo, talvez isso também deve ser incluído em casos raros quando a memória insuficiente está disponível? Então, não atacamos metatrader tentando passar por um ponteiro nulo? Vou testar isso em breve ...
VERSÃO 3: pub / sub, multipart send (no receive), polling em um soquete, sem mais uso de mensagens brutas (criado / excluído automaticamente). Adicionado commando e pub / sub exemplo, atualizou outro exemplo. NOTA: eu não sei como destruir com segurança um objeto de pesquisa, eu tentei acidentes livres (ptr) e metatrader. se alguém puder ajudar aqui.
Forex zmq
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como usar o ZeroMQ para enviar taxas FOREX do Terminal MetaTrader & amp; use o ZeroMQ para log-los no servidor nodejs?
Meu arquivo nodejs / express server. js:
O que eu preciso fazer para enviar taxas forex para tcp: //127.0.0.1: 3000 do terminal MetaTrader, que está sendo executado localmente em paralelo com o aplicativo nodejs?
Basicamente eu quero emiti-los usando um socket. io para os clientes.
No seu perito, acho que algo assim funcionará. Não tentei.
Forex zmq
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
ZMQ vinculativo para a linguagem MQL (ambos 32 bits MT4 e 64 bits MT5)
Esta é uma ligação completa da biblioteca ZeroMQ para o idioma MQL4 / 5 fornecido pelo MetaTrader4 / 5.
Os comerciantes com habilidades de programação sempre quiseram uma solução de mensagens como o ZeroMQ, simples e poderoso, muito melhor do que o truque PIPE, conforme sugerido pelos artigos oficiais. No entanto, as ligações para o MQL foram desatualizadas ou não completas (principalmente projetos de brinquedos e somente recursos básicos são implementados). Esta ligação baseia-se na versão 4.2 mais recente da biblioteca e fornece todas as funcionalidades conforme especificado na documentação da API.
Esta ligação tenta permanecer compatível entre o MQL4 / 5. Usuários de ambas as versões podem usar essa ligação, com um único conjunto de cabeçalhos. MQL4 e MQL5 são basicamente os mesmos na medida em que são incorporados em versões recentes. A diferença está no ambiente de tempo de execução (MetaTrader5 é 64bit por padrão, enquanto o MetaTrader4 é de 32 bits). O sistema de comércio também é diferente, mas não é preocupante desta ligação.
Esta ligação contém três conjuntos de arquivos:
A ligação em si está no diretório Include / Zmq. Observe que existe um diretório Mql em Incluir, que faz parte do mql4-lib. Previous Common. mqh e GlobalHandle. mqh são realmente desta biblioteca. Na versão 1.4, isso se torna uma referência direta, com conteúdo mql4-lib copiado aqui textualmente. Recomenda-se que você instale o mql4-lib completo, pois contém muitos outros recursos. Mas para aqueles que querem usar o mql-zmq sozinho, é bom implantar apenas o pequeno subconjunto incluído aqui.
Os scripts de teste e os exemplos do guia zmq estão no diretório Scripts. Os arquivos de script são mq4 por padrão, mas você pode alterar a extensão para mq5 para usá-los no MetaTrader5.
As DLLs pré-compiladas de 64 bits (Biblioteca / MT5) e 32 bits (Biblioteca / MT4) ZeroMQ (4.2.0) e libsodium (1.0.11) são fornecidas. Copie as DLL correspondentes para a pasta Biblioteca do seu terminal MetaTrader. Se você estiver usando o MT5 32bit, use a versão 32bit da Biblioteca / MT4. As DLLs exigem que você tenha o tempo de execução do Visual C ++ mais recente (2015).
Observe que, se você estiver usando MT5 32bit, você precisa comentar a definição de macro __X64__ na parte superior do Include / Mql / Lang / Native. mqh. Eu suponho que MT5 é de 64 bits, uma vez que não é possível detectar 32 bits por macros nativas e para definir valores relacionados ao ponteiro, uma macro como essa é necessária.
Observe que essas DLLs são compiladas a partir de fontes oficiais, sem qualquer modificação. Você pode compilar o seu próprio caso não confie nesses binários. O libsodium. dll é copiado da versão binária oficial. Se você deseja suportar mecanismos de segurança diferentes da curva, ou você deseja usar transportes como o OpenPGM, você precisa compilar sua própria DLL.
Nota para os usuários do WINE, se os binários padrão não funcionarem para você, você pode tentar os binários no diretório Library / VC2010. Os novos binários são um pouco mais novos (libzmq 4.2.2 e libsodium 1.0.36). Eles são compilados com o Visual C ++ 2010 Express SP1 (usando o SDK do Windows 7.1) e supostamente compatíveis com o VINHO do que com a versão VS2015. Eles dependem do tempo de execução do VC2010 (msvcr100.dll e msvcp100.dll). Na verdade, testei as DLLs antigas e novas no WINE 2.0.3 (Debian Jessie PlayOnLinux 32bit com o MetaTrader4 build 1090) e ambos funcionam. Portanto, não é garantido, mas é bom ter uma alternativa. O novo libzmq. dll só é executado no Windows Vista ou no Windows mais recente porque liguei a opção de pesquisa de pesquisa. Isso melhora o desempenho um pouco. Uma vez que o MetaTrader4 oficialmente não suporta mais o Windows XP, suponho que isso não seria um problema.
As cadeias MQL são as cadeias Win32 UNICODE (basicamente UTF-16 de 2 bytes). Nesta ligação, todas as seqüências de caracteres são convertidas em strings utf-8 antes de enviar para a camada dll. O ZmqMsg suporta um construtor de seqüências de caracteres MQL, o padrão não é encerrado nulo.
No guia oficial:
Você deve criar e usar exatamente um contexto em seu processo. Tecnicamente, o contexto é o recipiente para todos os soquetes em um único processo, e atua como o transporte para sockets inproc, que são a maneira mais rápida de conectar threads em um processo. Se no tempo de execução um processo tem dois contextos, estes são como instâncias ZeroMQ separadas.
No MetaTrader, cada Script e Expert Advsior tem seu próprio tópico, mas todos eles compartilham um processo, ou seja, o Terminal. Portanto, é aconselhável usar um único contexto global em todos os seus programas MQL. O parâmetro compartilhado do Context é usado para a sincronização de criação e destruição de contexto. É melhor nomear globalmente, e de uma maneira que não é facilmente reconhecida pelos humanos, por exemplo: __3kewducdxhkd__.
Você pode encontrar um script de teste simples em Scripts / Test, e você pode encontrar exemplos do guia oficial em Scripts / ZeroMQGuideExamples. Pretendo traduzir todos os exemplos para essa ligação, mas agora apenas o exemplo do mundo do Olá é fornecido. Eu gradualmente adicionarei esses exemplos. Obviamente, bifurcar essa ligação se você estiver interessado e bem-vindo para enviar solicitações de tração.
Aqui está uma amostra do HelloWorldServer. mq4:
Escreva mais testes. Adicione mais exemplos do guia oficial do ZMQ. Mais documentação API de alto nível para padrões comuns.
2017-10-28: Lançado 1.5: Importante: mudança de API para Socket. send; Remove API duplicada PollItem (# 11); Corrigir o aviso do compilador (# 10) e compilar a falha (# 12); Adicione o exemplo RTReq do Guia do ZMQ Capítulo 3. 2017-08-18: Lançado 1.4: corrigir o erro do setData do ZmqMsg; Alterar licença para o Apache 2.0; Inlcude mql4-lib dependências diretamente. 2017-07-18: Lançado 1.3: suporte de pesquisa refatorada; Adicione exemplos do Capítulo 2 do guia oficial do ZMQ. 2017-06-08: Lançado 1.2: corrigir o erro GlobalHandle; Adicione o método de reconstrução ao ZmqMsg; Complete todos os exemplos no Guia do ZMQ Capítulo 1. 2017-05-26: Lançado 1.1: adicione a capacidade de compartilhar um contexto ZMQ globalmente em um terminal 2016-12-27: lançado 1.0.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
zeromq.
O setor financeiro vive da tecnologia de mensagens. Em "Wall Street" (o negócio global de negociação de ações), capacidade e latência são tudo. A infra-estrutura atual, altamente sintonizada para obter milhões de mensagens por segundo, e latências sub-milissegundos, ainda falha quando o comércio fica frenético. Enormes quantidades de dinheiro dependem de ser o primeiro a obter dados e o primeiro a negociar.
O negócio de negociação de ações está evoluindo dramaticamente. O preço Penny gera mais dados. Novos regulamentos dos EUA e da UE aumentam o número de partes envolvidas nos mercados financeiros. As novas tecnologias de negociação algorítmica aumentam a demanda por dados de estoque atualizados e números de ordens iguais. Embora a infraestrutura existente possa duplicar em capacidade ou velocidade por 18 meses, espera-se que o tráfego cresça 20 vezes nos próximos três anos 1.
Ao mesmo tempo, os preços da tecnologia de mensagens estão aumentando constantemente. O middleware de mensagens - software que conecta aplicativos ou peças de aplicativos em uma forma de plug-and-play generalizada - é um dos últimos itens de grande bilhete ainda não transformados em uma commodity pela era da internet de software barato.
Os mainframes obtiveram grande parte do seu poder de mensagens inteligentes, sistemas de processamento de transações como o IBM CICS. Mas hoje mesmo o middleware padrão dos anos 1980 - ao contrário de bancos de dados, sistemas operacionais, compiladores, editores, GUIs e assim por diante - ainda não está amplamente disponível para desenvolvedores comuns. A indústria de software está produzindo várias aplicações de negócios e peças de aplicativos, e as ferramentas para fazer isso, em quantidades cada vez maiores, e preços cada vez mais baixos, mas o bit de mensagens ainda está faltando. A falta de uma maneira de conectar essas aplicações tornou-se não apenas um terreno não conquistado, mas também um sério obstáculo para o crescimento, especialmente para novas empresas que, em teoria, poderiam competir de forma agressiva com empresas maiores e mais antigas, se pudessem combinar barato blocos existentes de software.
Essa frustração é visível em muitos mercados e levou ao crescimento de mensagens-sobre-HTTP (SOAP) e outros compromissos. Arquiteturas como o SOAP funcionam, mas não resolvem os dois principais problemas de uma mensagem de nível empresarial, nomeadamente o roteamento e a fila. Assim, as empresas que usam essas tecnologias não podem escalar e não podem competir em mercados realmente grandes, a menos que escrevam seu próprio software de mensagens ou compram um produto comercial. Várias outras tentativas de padronização foram feitas para commoditise o mercado: CORBA, JMS e ultimamente AMQP, CORBA sendo infrutífero por causa da metáfora RPC que não se adequa às necessidades dos mercados financeiros, JMS sucesso no mundo Java, mas incapaz de expandir ainda mais e AMQP ainda sendo um grande desconhecido.
A demanda crescente e a falta de concorrência real mostram nas demonstrações financeiras de fornecedores de mensagens high-end como o Tibco Software Inc: "A receita total no primeiro trimestre do ano fiscal de 2007 comparado ao mesmo trimestre do ano passado aumentou em US $ 11,0 milhões ou 10 %. O aumento foi composto por um aumento de US $ 7,0 milhões ou 11% na receita de serviço e manutenção e por um aumento de US $ 4,0 milhões ou 8% na receita da licença. & Quot; 2 clientes da Tibco informam que as taxas de licença estão aumentando, ano a ano.
O mercado.
O mercado global de negociação de ações é foco primordial de ØMQ, porque é aí que a maior ênfase é colocada na mensagem, a maioria dos recursos é acumulada e a maioria das tecnologias de ponta são usadas.
A principal característica do mercado é a fome de entrega rápida. Em cada milissegundo, a cotação de ações ou a ordem comercial é mais rápida do que a concorrente se traduz em lucro financeiro direto, então as empresas envolvidas estão naturalmente ansiosas por qualquer vantagem que possam obter.
Atualmente, no estoque de negociação, a carga do tráfego é tão alta e a latência tão crítica, que o middleware precisa ser altamente otimizado. As latências são dadas em microssegundos e throughputs em milhões de mensagens por segundo e # 8230; Apesar disso, o comércio geralmente experimenta problemas quando a carga da mensagem atinge um pico. A latência pode de repente cair para segundos (ou mesmo dezenas de segundos) e grandes quantidades de dinheiro podem ser perdidas à medida que os negócios são atrasados ou falham. 3.
A situação está piorando por vários motivos:
Em 2001, a NYSE e o NASDAQ mudaram de preço de suas ações em unidades de 1/16 dólares para unidades de centavo único. Este chamado "preço do centavo" e quot; significa que os mercados de ações produzem mais dados e esses dados devem ser deslocados em redes. Tanto nos EUA como na UE, os reguladores estão obrigando os mercados financeiros a competir de forma mais aberta e agressiva, no interesse dos consumidores. Por exemplo, as mudanças regulatórias da SEC dos EUA permitem que novas empresas atuem como intermediários no setor de comércio de ações, enquanto a Diretriz de Mercados em Instrumentos Financeiros da UE (MiFID) 4 deverá aumentar as taxas de tráfego de ações na UE para corresponder aos volumes vistos nos EUA após o Reg NMS 5. Muitas empresas novas e agressivas estão entrando no mercado, especialmente construindo ou usando plataformas de "negociação algorítmica". A negociação algorítmica executa grande quantidade de ordens de baixo volume em oposição a uma pequena quantidade de ordens de alto volume executadas por comerciantes humanos tradicionais.
Portanto, aumentamos os fluxos de dados, para mais participantes, que estão empurrando para desenvolver novos modelos de negócios que dependem de obter esses dados rapidamente, detectar anomalias temporárias do mercado e responder a ele (com trades) antes de seus concorrentes. Um ambiente regulatório mais flexível está abrindo mercados previamente protegidos para uma nova competição. No geral, vemos uma corrida de armamentos para largura de banda e latência em que melhor tecnologia se traduz diretamente em mais lucros. 6.
O tráfego de mensagens deverá crescer significativamente no curto prazo - ouvimos números diferentes de até 30 vezes nos próximos três anos - e os sistemas existentes só podem duplicar a capacidade a cada 18 meses.
Há muitas tentativas para resolver esse problema emergente. As melhorias mais dramáticas no desempenho provêm da substituição do intermediário central clássico por uma arquitetura peer-to-peer em que as mensagens podem fluir diretamente na rede sem saltos extras. Nem todos os sistemas de mensagens podem adaptar sua arquitetura desta maneira.
Além da arquitetura, o local óbvio para otimizar mensagens é na "pilha", isto é, as camadas que separam o programa aplicativo da rede física. O software em si já está fortemente otimizado na maioria dos casos, então os fornecedores estão mudando para outras opções, tais como:
Otimizando a arquitetura de rede por provedores de conectividade para obter melhores latências, incluindo a mudança de clientes de mensagens perto (em termos de rede) para os produtores de mensagens; 7, 8. Clientes que se deslocam dos fluxos consolidados de cotações de ações para conectividade direta com as bolsas; 9 Otimizando formatos nos quais os dados são passados (FIX / FAST 10); Fornecer soluções de hardware completas (Tervela, Exegy, etc.); Substituindo a camada de transporte físico (Infiniband 11, 10GB Ethernet); Otimizando hardware de rede existente. Motores de descarregamento TCP, tecnologia I / OAT da Intel; 12, etc .; Modificando o sistema operacional para lidar com as mensagens em tempo real. Vários sistemas operacionais em tempo real, como o SLERT 13 da Novell; Modificando o sistema operacional para usar uma pilha de mensagens mais eficiente: E / S assíncronas, SDP, várias técnicas de cópia zero, etc. Usando multicast para distribuir cotações de ações na LAN do cliente;
Além dessas otimizações, que se concentram em aspectos individuais da pilha ou arquitetura de mensagens, também vemos tentativas que consideram o problema como um todo:
Laboratório de baixa latência da Intel 14 Centro de análise de tecnologia de valores mobiliários (STAC) 15 Diversas medidas & amp; Soluções de monitoramento (Endace etc.)
Produtos altamente otimizados com suporte de hardware extensivo tornam-se muito caros. Somente as maiores empresas comerciais podem pagar toda a gama de produtos e mesmo para essas empresas, os custos continuam sendo uma preocupação persistente. Para as pequenas empresas, muitas das soluções simplesmente não são uma opção.
Oportunidades.
Nesta seção, analisamos as oportunidades de novos produtos de mensagens de alto desempenho, como os que estamos construindo.
Saída de alto desempenho.
O primeiro e mais óbvio alvo é qualquer empresa que use middleware comercial high-end para negociação de ações, onde podemos fornecer um equivalente mais barato. Este mercado é sensível aos custos e, na nossa experiência, está disposto a absorver mudanças e riscos, a fim de obter um preço atraente e / ou uma vantagem de desempenho em relação aos seus concorrentes.
Além disso, existem muitas empresas que não podem pagar esses produtos, mas os usariam se o custo fosse menor. A lei de Zipf (geralmente usada para linguagem, mas também aplicável aos tamanhos de negócios) sugere que o número de empresas e seu tamanho segue um índice de energia inversa, de modo que oferecer um produto a 20% do preço dos líderes de mercado de alto custo deve abrir um mercado cinco vezes tão grande. (Na verdade, provavelmente não é tão grande, porque as pequenas empresas vão comprar ou alugar plataformas de negociação em vez de tentar construir suas próprias.)
Plataformas de negociação.
As plataformas de negociação são aplicativos de software que as empresas comerciais podem comprar pronto, em vez de se construir usando middleware de mensagens. Dada a demanda por operações mais baratas e rápidas, existe um grande mercado para essas plataformas. Obviamente, uma empresa que constrói uma plataforma de negociação é sensível ao custo da mensagem que ela usa e essas empresas fornecem um mercado para nossos produtos planejados.
Bancos de investimento.
Os bancos de investimento criam seus próprios sistemas de negociação e (da nossa experiência limitada) gostam de ter controle sobre a tecnologia que usam. Os sistemas baseados em padrões são altamente atraentes aqui. O cálculo é que uma tecnologia padrão é mais fácil de controlar, e é servida por um mercado maior de especialistas mais baratos. Qualquer solução AMQP tem atração imediata. O custo também é um motorista, mas para as empresas que realizam um desenvolvimento significativo em torno da mensagem, a redução dos custos secundários (como o número e o custo dos consultores internos) é um aspecto importante.
Ficou claro por que a JPMorganChase foi motivada a empurrar e investir no processo AMQP, mesmo tendo riscos consideráveis na época: o AMQP permite economias muito grandes em despesas de TI, para licenças de mensagens, desenvolvimento personalizado, controle operacional e assim por diante. Podemos oferecer uma proposta de risco muito menor para outros bancos de investimento, mas com os mesmos tipos de benefícios.
Consolidadores de dados.
O mundo do comércio de ações conecta muitas trocas (NASDAQ, NYSE, etc.) a muitos clientes. Os grandes clientes fazem conexões separadas para cada troca, mas a maioria trabalha através de consolidadores de dados, empresas como a Reuters que fornecem fluxos unificados de várias fontes.
Os consolidadores de hoje executam software de mensagens personalizadas altamente personalizadas, não é baseado em padrões e tem pouca margem para se tornar mais barato e mais rápido. Pode ser mais rápido, mas apenas a um custo elevado, que punha as empresas que ficam com mensagens personalizadas e oferece uma vantagem para as empresas que utilizam mensagens baseadas em padrões, que espalham os custos e aproveitam muito mais o desempenho.
Há uma oportunidade definitiva para abrir esse mercado e permitir que novas empresas compitam como consolidadores de dados, usando nossos produtos de alto desempenho para levar cotações aos clientes. Novas regulamentações dos EUA estão abrindo esse mercado para uma concorrência real.
As trocas (bolsas de valores, câmbio, commodities, etc.) são fortemente impactadas pelo crescimento da demanda por seus serviços. Parece inevitável que os padrões nas bordas irão forçar seu caminho para o centro, e devemos ser capazes de acompanhar as ofertas de produtos.
Além disso, estão surgindo novos tipos de plataformas de negociação (ATS, MTF e piscinas escuras 16) que gradualmente adquirem ainda maior participação no mercado das trocas tradicionais. Dado que essa tendência é bastante nova e ainda ganha impulso, esperamos ver crescente demanda por sistemas de mensagens de ponta neste mercado.
Movendo o valor para diferentes mercados.
Um dos objetivos do ØMQ é usar o dinheiro, os recursos e a experiência acumulados durante a corrida de armamentos de baixa latência no negócio de negociação de ações para oferecer soluções de mensagens de uso geral de ponta de gama alta gratuitas para o resto do setor de TI.
Algumas das áreas em que ØMQ pode ser útil.
Mensagens comerciais e institucionais.
Enviar pagamentos, fazer comunicação de empresa a empresa, passar documentos dentro de organizações governamentais, etc., é o principal mercado a se concentrar além da negociação de ações. A razão é que este é o campo onde a mensagem é usada tradicionalmente, com muitos especialistas em TI experientes conscientes de mensagens e usando isso por um longo período de tempo.
Também deve ser levado em consideração que mesmo as aplicações que não usam mensagens adequadas podem ainda estar enviando "mensagens" por diferentes meios. Considere um aplicativo localizado no local A, escrevendo um registro para o servidor de banco de dados remoto e outro no lugar B, lendo o registro. Na verdade, houve uma mensagem enviada de A para B, mesmo que o programador possa não estar ciente disso. Mesmo a comunicação entre processos e inter-threads pode ser considerada mensagens. Sincronizar diferentes aplicativos, copiando arquivos para destinos remotos, uma vez por dia também pode ser considerado como mensagem (embora seja um caso de baixa latência espetacular).
Basicamente, qualquer aplicação feita para o setor financeiro ou institucional precisa de algum tipo de mensagem e o custo da implementação varia entre 10 e 30% do custo total do projeto, de modo que usar a implementação de middleware baseada em padrões atual parece ser um investimento bastante bom.
Embora a baixa latência não seja um requisito fundamental nesta esfera, esperamos que as taxas de transação crescentes (considere regulamentos como SEPA 17 da UE e esforços de padronização como o TWIST 18) forçará lentamente as instituições financeiras a adotar soluções de mensagens de alto desempenho, causando a atual pequena A fatia do mercado de mensagens abordado por soluções de alto desempenho crescerá constantemente, até chegar em 100%.
Sistemas embutidos.
Os sistemas embutidos geralmente têm requisitos em tempo real semelhantes aos observados no negócio de negociação de ações. Considere, por exemplo, um equipamento que mede algum valor crítico em um processo tecnológico. Os dados devem ser entregues na unidade que controla o processo dentro de 1 & # 160; ms, caso contrário, todo o processo será estragado.
Os sistemas embutidos geralmente não precisam da taxa de transferência fornecida por pilhas de estoque de negociação, no entanto, se a latência, a confiabilidade e os tempos de entrega deterministas forem garantidos, eles podem aproveitar isso, mesmo que não use toda a capacidade de banda disponível.
Multimídia.
O mesmo comentário sobre os requisitos em tempo real aplica-se a multimídia (transmissão de áudio e vídeo, teleconferência, etc.). Ao contrário dos sistemas incorporados, a latência não é tão crítica, sendo o primordial o tempo de entrega determinista e o alto rendimento.
No futuro, podemos descobrir que o modelo de pequenas e pequenas mensagens de aplicativos de estoque comercial é incompatível com a abordagem multimídia baseada em fluxo. No entanto, não acreditamos que este seja o caso. Para testar a hipótese, construímos um aplicativo de teleconferência de prova de conceito sobre o AMQP e nós o vimos funcionar sem problemas.
Computação em grade.
Tendo quase os mesmos requisitos que a negociação de ações, os sistemas de grade são uma área natural para empregar pilha ØMQ.
As grelhas são icreasingly usadas nas financeiras 19 e - não surpreendentemente - na negociação de ações propriamente dita, fornecendo uma solução para problemas computacionalmente caros, como gerenciamento de risco e negociação algorítmica 20.
A bolha de baixa latência.
O mercado de soluções de baixa latência é muito animado e está expandindo nos dias de hoje. No entanto, alguns têm a sensação de que o valor do mercado é superestimado e que as corridas de armas de baixa latência continuam resultando no estouro da bolha, semelhante ao crash do ponto-com do início dos anos 2000.
Vamos examinar possíveis causas da quebra do mercado:
Há leis da física que colocam o limite inferior na latência. Especificamente, a velocidade da luz não pode ser excedida e, uma vez que a mensagem atinge esse limite, não haverá muito espaço para a competição e a corrida de armamentos de baixa latência chegará ao fim. Os custos de mensagens rápidas estão crescendo constantemente. Uma vez que atingimos o ponto em que melhorar a latência exigirá investimentos que excedam os lucros que possivelmente possam render, o fluxo de dinheiro no mercado acabará. Os gastos não razoáveis em soluções de baixa latência podem resultar em histeria, uma vez que o crescente mercado de baixa latência começa a diminuir. A histeria pode fazer o mercado cair mesmo abaixo do valor real.
Nossa visão dos problemas acima é a seguinte:
A velocidade da luz é certamente uma barreira final, no entanto, como pode ser visto com os microprocessadores, as barreiras vistas como definitivas são bastante propensas a serem cruzadas uma e outra vez. Nos negócios de mensagens, por exemplo, vemos soluções de proximidade emergentes (lidando velocidade do problema da luz colocando as aplicações interdependentes fisicamente fechadas uma à outra) ou a tendência para otimizar a parte do software da pilha de mensagens, removendo assim a latência do ponto final em vez da latência on-the-wire . Na verdade, não acreditamos que existam barreiras reais e impenetráveis para impedir a corrida de armas de baixa latência pelo menos nos próximos anos. Embora o custo da mensagem de baixa latência cresça de forma constante, deve ser levado em consideração que o preço da tecnologia - hardware e software - está diminuindo constantemente ao mesmo tempo. O que custou US $ 100 no ano passado, custa US $ 50 hoje. Assim, mesmo em um mercado estável e não expansível, onde os gastos com TI se mantêm constantes, haverá uma demanda por novas soluções para acompanhar as novas tecnologias. A histeria pode acontecer a qualquer momento e não há como evitar isso completamente. No entanto, como a troca de estoque de mensagens é, de certa forma, um mundo para si, esperamos que a histeria seja restrita a este pequeno mercado turbulento, deixando o restante do mercado de mensagens intacto. Assim, as principais vítimas serão as empresas que fornecem soluções especializadas de negociação de ações em vez de mensagens de propósito geral. Especificamente, o projeto ØMQ, aproveitando os recursos acumulados no mercado de TI focado na negociação de estoque para desenvolver uma solução de mensagens de propósito geral, pode sobreviver à quebra do mercado, dependendo de sua presença em diferentes setores do mercado de mensagens.
Conclusão.
O foco principal do ØMQ começa com a negociação de ações porque esse mercado possui uma demanda bem definida e crescente por soluções de alto nível, e as opções para colaborações e retorno sobre o investimento são abundantes. No entanto, a construção de um sistema de mensagens de baixo custo com base em padrões que pode competir de frente com o melhor do mundo abre portas em muitos outros domínios também.
Comentários: 0.
Se você encontrou esta página útil, avalie-a para que outros a encontrem.
Quem está vigiando esta página?
O design e o conteúdo do site são direitos autorais (c) 2014 iMatix Corporation. Entre em contato para suporte profissional. Conteúdo do site licenciado sob cc-by-sa 3.0 ØMQ é copyright (c) Copyright (c) 2007-2014 iMatix Corporation e Contribuintes. ØMQ é um software livre licenciado sob a LGPL. ØMQ e ZEROMQ são marcas comerciais da iMatix Corporation. Termos de Uso & # 8212; Política de Privacidade.
zeromq.
Este documento descreve um algoritmo de correspondência que fornece todas as funcionalidades necessárias para a correspondência de tópicos e a maioria das funcionalidades necessárias para o roteamento baseado em conteúdo. Este documento foi originalmente escrito por Pieter Hintjens da iMatix Corporation como parte das especificações do OpenAMQ e as técnicas descritas aqui formam a base do mecanismo de correspondência de tópicos do OpenAMQ. Posteriormente, o documento foi atualizado para cobrir algoritmos de roteamento de tópicos optimizados e problemas de filtragem de mensagens.
As mensagens correspondentes aos pedidos são um gargalo típico em um servidor de middleware orientado a mensagens. O mecanismo padrão é o "seletor", uma cláusula semelhante ao SQL que é interpretada para dar um resultado verdadeiro / falso. Os seletores são a ferramenta básica para o "roteamento baseado em conteúdo". Dado um alto volume de mensagens e pedidos, o custo dos seletores cresce exponencialmente. O & quot; tópico & quot; O mecanismo usado pelos servidores de middleware fornece um algoritmo de correspondência mais rápido baseado em um sistema de nomeação hierárquico, mas isso ainda funciona como um gargalo em cenários de alto volume.
Definimos um "pedido" como constituído por um ou mais "critérios", e uma mensagem como fornecendo um ou mais "campos". A solicitação especifica os critérios desejados em termos de campos: por exemplo, um campo com um determinado valor ou combinando um determinado padrão.
A correspondência de tópicos é baseada em padrões (por exemplo, forex * *), enquanto o roteamento baseado em conteúdo é baseado em valores de campo (& quot; moeda = USD ou GBP & quot;)?
A técnica de correspondência mais óbvia é comparar cada mensagem com cada solicitação. Se o custo de tal comparação for C, o custo da correspondência de uma mensagem é:
Onde R é o número de pedidos. O custo de C é proporcional à complexidade do pedido - ou seja, o número médio de critérios por solicitação. Em um cenário de baixo volume, R pode ser 1-10. Em um cenário de alto volume, podemos ter:
10.000 solicitações ativas (R = 10.000) um custo de correspondência de 100 microsegundos (C = 100)
Dando um custo de 10000 * 100 microsegundos por mensagem, ou 1 segundo por mensagem.
Podemos melhorar isso, observando que muitos pedidos são idênticos. Se assumirmos que o valor máximo para R será de cerca de 100, podemos reduzir o custo por mensagem para 0,01 segundos por mensagem, dando-nos um throughput máximo de 100 mensagens por segundo.
Nosso objetivo é obter um custo de correspondência de menos de 10 microssegundos por mensagem, para um potencial de transferência de até 100.000 mensagens por segundo.
A técnica de bitmap invertida.
Em 1980-81, trabalhar para Lockheed, Leif Svalgaard e Bo Tveden construiu o Sistema de Assistência de Diretório para a companhia de telefone de Nova York. O sistema consistiu em 20 computadores em rede que atendem a 2000 terminais, atendendo mais de 2 milhões de pesquisas por dia. Em 1982, Svalgaard e Tveden adaptaram o sistema para uso no Pentágono (Serviço Telefônico de Defesa). Este sistema ainda está em operação.
Svalgaard e Tveden inventaram o conceito de "bitmaps invertidos" para permitir a correspondência rápida de pedidos com nomes no diretório.
A técnica de bitmap invertida baseia-se nestes princípios:
Nós mudamos dados raramente, mas buscamos com freqüência. O número de pesquisas possíveis é finito e pode ser representado por uma grande e dispersa série de itens contra critérios, com um 1 em cada posição em que um item corresponde a um critério e 0 em outro lugar.
A técnica de indexação funciona da seguinte forma:
Nós numeramos cada item pesquisável de 0 para cima. Analisamos cada item para dar um conjunto de "critérios" Nome e valor de tuplas. Nós armazenamos a tupla de critérios em uma tabela indexada pelo nome e valor. Para cada tupla de critérios, armazenamos um bitmap longo que representa cada item que o corresponde.
A técnica de pesquisa funciona da seguinte forma:
Analisamos o pedido de pesquisa para fornecer um conjunto de critérios de nome e valor de tuplas. Buscamos cada tupla de critérios na tabela, dando um conjunto de bitmaps. Nós AND e OU ou cada bitmap para dar um bitmap de resultado final. Cada 1 bit no bitmap do resultado representa um item correspondente.
Observe que os mapas de bits podem ser enormes, representando milhões de itens e geralmente são altamente compressíveis. Grande parte da arte no uso de bitmaps invertidos vem de:
Derivando os tuplos de critérios precisos de itens e solicitações de pesquisa. Careful compression techniques on the large sparse bitmaps. Post-filtering search results to discard false positives.
Today's web search engines use such techniques. We (Hintjens et al) have built several search engines using these techniques (from STAR in 1990, to sms in 2001).
Application to Message Matching.
The inverted bitmap technique thus works by pre-indexing a set of searchable items so that a search request can be resolved with a minimal number of operations.
It is efficient if and only if the set of searchable items is relatively stable with respect to the number of search requests. Otherwise the cost of re-indexing is excessive.
When we apply the inverted bitmap technique to message matching, we may be confused into thinking that the message is the "searchable item". This seems logical except that message matching requests are relatively stable with respect to messages.
So, we must invert the roles so that:
The "searchable item" is the matching request, which we will call a "subscription" for the purposes of discussion. The "search request" is the message.
The indexing process now works as follows:
We number each match request from 0 upwards. We analyse each match request to give a set of criteria tuples. We store the criteria tuples in a table indexed by name and value. For each criteria tuple we store a long bitmap representing each match request that asks for it.
The message matching process works as follows:
We analyse the message to give a set of criteria tuples. We look up each tuple in the table, giving a set of bitmaps. We accumulate the bitmaps to give a final result bitmap. Each 1 bit in the result bitmap represents a matching subscription.
Worked Examples.
Topic Matching Example.
Imagine we have these topics:
Imagine these subscriptions, where * matches one topic name section.
When we index the matches for each subscription we get these bitmaps:
Now let us examine in detail what happens for a series of messages:
Field Matching Example.
For our example we will allow matching on field value and/or presence. That is, a subscription can specify a precise value for a field or ask that the field be present.
Imagine these subscriptions:
When we index the field name/value tuples for each subscription we get these bitmaps:
Now let us examine in detail what happens for a series of messages:
Message A: "currency=JPY, market=forex, slow"
Message B: "currency=JPY, urgent"
Message C: "market=forex, currency=EUR"
Note that the hit count is:
zero for subscriptions that do not match. 1 or greater for subscriptions that have at least one matching criteria (a logical OR match). Equal to the criteria count when ALL criteria match (a logical AND match).
Optimised topic routing algorithm.
While routing on topics as presented above is extremely fast, it tends to consume too much memory in large stock trading scenarios (millions of distinct topics, thousands of subscriptions). This section introduces optimised topic routing algorithm with modest memory requirements.
First of all, let's break individual subscriptions into their constituent parts. There's a 1st part of the topic, 2nd part of the topic etc. The longest subscription determines maximal number of parts we're going to take into account. If there's a message with more parts that the maximal number we've computed, it's safe to assume it doesn't match any subscription. We can drop such a message straight away without doing any additional processing.
If the topic doesn't exceed maximal size, we'll match each individual constituent with corresponding constituents of the subscriptions using inverted bitmap technique described above.
Say we have following subscriptions "trade, forex. eur, forex.*". Maximal number of constituents is 2:
Inverted bitmap for the first constituent:
Inverted bitmap for second constituent:
Note the " null " row in each bitmap. & quot; null " means that the particular has no corresponding constituent. For instance, "trade" has no second constituent, thus it is assumed to be equal to " null ".
Also note the " other " row. This is a way to limit the number of rows in each bitmap to match the number of possible alternatives for the constituent as they appear in subscriptions. There's no need to add new rows for values that don't appear in subscriptions. Say, the message " forex. usd " contains second constituent " usd ", however, as it is not mentioned in any subscription we don't need a separate line in the bitmap for it. We'll simply treat it as " other " valor.
The matching algorithm itself is easy: Break the topic of the message into its constituents, find a corresponding row in each inverted bitmap and perform logical AND on the selected rows. Note that this means that at most N rows are combined, N being maximal number of constituents in any subscription. This is quite a low number, presumably less than 10.
Additionally, it's not always necessary to perform logical conjunction on all the rows. Once you get an empty bitmap after processing couple of rows, there's no point and doing AND for subsequent rows - the topic does not match any subscription anyway.
Here are few examples of how the matching works:
Message has " forex. eur " topic. Get the " forex " row from the first consituent bitmap, " eur " row from the second constituent bitmap and perform logical AND on the rows:
Now the same thing for a message with " forex. jpy " topic:
One more example. This time message with single-constituent topic (" trade "):
There's one important optimisation that haven't been mentioned so far. If the topic of the message contains a sequence of nulls (e. g. " forex. null. null. null. null. null ") there's no need to worry about constituents corresponding to the second and any subsequent nulls. in case of " forex. null. null. null. null. null " algorithm has to AND the row from first constituent bitmap and the row from second constituent bitmap, however, it can safely ignore the rows for third to sixth constituent. (The proof of correctness of the optimisation is left as an exercise for the reader.)
The above optimisation is especially important in the case the topic tree is unbalanced. For instance if most topics consist of three constituents, however, there's a single topic with 100 constituents, subscribing for that topic causes inverted bitmaps to have 100 rows. Thus, without above optimisation, each message matching requires 100 bitmap conjunctions, while in 99% of cases 3 conjunctions are enough to perform the matching.
Filtering is similar to matching, the only distinction being that you are not interested in which particular subscriptions match, rather what you want to know whether at least one subscription is matches.
Filtering is especially useful in multicast scenarios where all messages are transferred over the wire and it's receiver's responsibility to filter out those that don't match any local subscription.
While exactly the same inverted bitmap algorithm is used, it is possible to optimise it even further for the filtering use case.
With filtering we are basically interested in whether there is at least one bit set in the resulting bitmap. Thus, if we find out that the first bit is 1, there's no need to evaluate the remaining bits. Consequently, the algorithm can evaluate individual subscriptions from left to right and stop when it encounters the first one that matches.
Consider the " forex. eur " example above:
Note that AND is not done for the third subscription. Although this may seem to be of little help, with large bitmaps consisting of thousands of subscriptions it can save a lot of processing.
Obviously, doing logical AND on per-bit basis is terribly inefficient. In real-world implementation AND should be done from left to right in batches containing 32 or 64 subscriptions, depending on the processor data bus width or even batches of 128 or more with dedicated SIMD instructions.
Research ideas.
There are several ways to speed the matching algorithm even more, trading more work to do on subscribing/unubscribing for faster message matching and filtering.
One possibility is to lower the number of subscriptions by subsuming them. In the filtering use case, if there's " forex.* " subscription, there's no need for " forex. eur " subscription, because the former is a superset of the latter.
Another possibility is to move the subscriptions that we expect to match the most messages to the left of the bitmap while leaving those that have only small probability of succeeding on the right. In combination with left-to-right evaluation of logical conjunction in the filtering use case, we can get an algorithm that will in most cases succeed early on, hopefully after evaluating first few columns of the inverted bitmap.
There's even an obvious heuristic to determine whether a particular subscription is likely to match: The more wildcards (*) there are in the subscription the larger set of messages it is able to match and thus more likely it is that it'll succeed. That way, moving the subscriptions with large number of wildcards to the left while keeping those with no or little wildcards on the right is likely to give a very efficient algorithm.
Conclusão.
We believe that application of the above algorithms can give a system that will be able to match or filter a single message in the range of nanoseconds or couple of microseconds even it the case of large amount of different topics and subscriptions.
Comments: 13.
I ready somewhere among the pages/articles of zeromq that it uses a trie for filtering/matching messages when subscription is done using SUB socket.
The article here describes about topic matching and message filtering again , which method is actually used . Is this article only relevant to AMQP or is this even used in zero MQ , if it is indeed used in zero MQ then what is the trie matching/filtering about ? Could you elaborate more on the performance diffence , how/why is that filtering different than this , why not the most optimized filtering/matching everywhere.
The topic matching described here is very fast and flexible, can handle any kind of match, but does heavy work each time there's a new topic key, which is bad for low-latency systems. Tries are simpler and give more predictable performance.
Well even with trie I would assume you would have to update the trie because a new topic is added and each node of trie would contain a bitmap representing which queues the message should be forwarded to.
Could you explain how do you intend to use trie (for pub and sub filtering),?
You can read the code to see how the trie is used.
well , i do understand for the subscriber code , but could you throw some more details on pub side code.
In case of message matching what if number of matching criteria is say couple of them per subscription but message contains 10s of field / Value.
in this case most of the field/value will not be present in index table correct and will be a miss and time spent for no use ?
Usually then you separate the fields you want to match on (put them in a header) from the rest of the fields. If you really want to allow matching on _any_ field, you're going to have a less efficient process.
If there is a subscription like orange.#.yellow. How the bitmap can be created by using this?
If you read the explanation in the article it should be clear.
I mean during the implementation as we cannot predict the consitutents initially, when adding a new table for consitutent keeping track of the subscriptions which have # wildcards in the middle will make the implementation more complex. I am asking whether is there are any easy ways to implement this?
the article explains this ..
u build a table for all the criteria say sub1 is orange.#.yellow and sub2 is apple. custard.*
so sub1 bitmap will be 1100 and sub2 will be 0011.
and then for each message u create a bitmap.
0 0 0 0 ->its not 1100 so message doesnt match, also no matching fields.
0 0 1 0 ->its not 0011 so message doesnt match, but has one matching fields.
1 1 0 0 ->its 1100 so message matches, chk for order though.
How you did the performance test after adding this algorithm. I means what is the tool you used.
I just ran a single threaded test case which created subscriptions and then matched against random messages.
Written: 07 Aug 2007 10:19.
Revised: 17 Apr 2012 11:55.
If you found this page useful, please rate it up so others will find it.
Who's watching this page?
Web site design and content is copyright (c) 2014 iMatix Corporation. Contact us for professional support. Site content licensed under cc-by-sa 3.0 ØMQ is copyright (c) Copyright (c) 2007-2014 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ and ZEROMQ are trademarks of iMatix Corporation. Terms of Use — Política de Privacidade.
ZeroMQ – Trade Execution in MetaTrader (ZMQ-II)
This post builds on the contents of the previous article in this series, namely ZeroMQ – How to Interface Python/R with MetaTrader 4.
Therein, we proposed a solution to creating trading strategies in ZeroMQ supported programming languages outside the MetaTrader environment, with the latter simply acting as the intermediary to the market.
Leveraging ZeroMQ’s convenient communication patterns such as Request (REQ) / Reply (REP) and PUSH/PULL , we demonstrated how to plan and develop a simple yet powerful, distributed trading architecture that opens doors to more sophisticated trading strategy development otherwise not possible within the confines of the MetaTrader terminal.
In this post we’ll describe how to execute new orders and manage existing ones via ZeroMQ, through any supported programming language such as Python or R.
Our route to market will continue to be MetaTrader 4, all trading decisions being made outside it the entire time.
Em termos técnicos & # 8211; as before, any trading strategy will behave as a Client and MetaTrader as the Server .
We will also develop a simple message topology for performing these execution and reporting functions, such that the same topology is understood by both Clients (trading strategies) and Servers (MetaTrader).
The Message Topology Opening, Modifying & Closing Trades Getting Account/Market Information Getting Trade Reports.
This post will cover the Message Topology and Opening/Modifying/Closing Trades sections. The next post in this series will describe the latter two.
1) Message Topology.
ZeroMQ – Distributed Messaging.
Before moving forward, we first need to define some discrete messaging rules that both our trading strategies and MetaTrader can understand.
In the MQL source code provided in the previous post, these rules will need to be implemented in the InterpretZmqMessage function, the definition for which is:
These rules will in essence map particular messages to actions, for example:
For this post’s implementation, let’s define the following message formats:
Opening, Modifying & Closing Trades:
With the message topology in place, we can now construct messages containing trading/reporting instructions.
The ZeroMQ enabled MetaTrader server will receive and execute the instructions via the REQ/REP socket as defined in the first post, and send information back to requesting clients using either the REQ/REP or PUSH/PULL socket depending on the instruction.
One implementation for example, could use REQ/REP for “critical” messages, e. g. Open/Modify/Close trading instructions and their corresponding results, while “non-critical” instructions such as displaying account equity for reporting purposes could use the PUSH/PULL socket.
At the end of the day, there are a number of ways this logic could be implemented.
Your choice of communication pattern (REQ/REP or PUSH/PULL) will depend entirely on how critical you consider one instruction set vs. another.
Generally, it pays dividends to plan this in advance of any development, as different control flows will have different performance results and come with their own considerations (good or bad problems if you will).
In the next 3 sections, we’ll run through some examples of how each message format above can be used in practice.
The ZMQ EA Template for MetaTrader 4 shared in the last post, is already setup with the appropriate code placeholders in the InterpretZmqMessage() function so readers can implement these easily.
2) Opening, Modifying & Closing Trades.
As above, we’ll use the following format for trade instructions:
Let’s break this down further, into what each component of this message could contain:
For example, our trading strategy in Python or R could send the following message to the ZeroMQ EA deployed in MetaTrader 4:
Here, our trading strategy is requesting that:
A trade be executed (OPEN), Order Type (1) is OP_SELL (meaning sell at Market) Symbol to trade is EURUSD Open/Close price is set to 0 (which in your code should default to executing at the available market price). Stop loss of 50 pips Take Profit of 50 pips Trade’s comment to be set to “R-to-MetaTrader4” Ticket # is 0 (as ticket ID’s are not specified when executing trades in MetaTrader 4).
Implementing this logic in InterpretZmqMessage() inside the MQL EA provided, you can then populate a call to MetaTrader’s OrderSend() function and send the order to market.
Ordens pendentes.
In the case of Pending Orders (Buy Stop, Buy Limit, Sell Stop Sell Limit) , the code you write should of course not ignore Open/Close price.
A call needs to then be made to OrderSend() with “ price ” set to this value, and “ cmd ” set to the appropriate command as received in the message via ZeroMQ,
i. e. OP_BUYLIMIT (if 2) , OP_SELLLIMIT (if 3), OP_BUYSTOP (if 4) and OP_SELLSTOP (if 5).
Note: The numeric values (1,2,3,4,5) are chosen arbitrarily of course. You may choose any values you consider meaningful, as long as you implement their corresponding logic exactly in MetaTrader as you do in your external trading strategy (in e. g. Python or R).
Modifying Orders.
In this case, your logic in the InterpretZmqMessage() function will need to ignore Open/Close price once again, and instead populate a call to MetaTrader’s OrderModify() function with its “stoploss” and “takeprofit” parameters set to those received in the ZeroMQ message.
Order Type can be ignored as an existing order is being modified.
You will also need to read the Ticket ID field and specify it in OrderModify()’s “ ticket ” parameter, so MetaTrader knows which trade to modify, in this case “12345678”.
Closing / Deleting Orders.
The procedure for closing orders in MetaTrader 4 is fairly straightforward.
All you would need is to pass the Ticket ID received via ZeroMQ to an OrderClose() call, along with parameter values for “ lots ” specifying lot size to close, the “ price ” you wish to close at (e. g. Bid or Ask) and the maximum “ slippage ” you’re willing to tolerate on the transaction.
Deleting existing pending orders is even simpler -> simply pass the Ticket ID received via ZeroMQ to OrderDelete(), populating its “ticket” parâmetro.
In the next post (ZMQ-III), we’ll take this one step further and describe how to implement Account & Trade Reporting via ZeroMQ.
As always, we would greatly appreciate if you shared this content with your colleagues and networks.
And please do feel free to ask questions / provide feedback / make requests / anything in between, via the comments section below.
Webinar Recording: How to Interface Python/R Trading Strategies with MetaTrader 4.
This post describes how to construct a currency portfolio composed of any number of currency pairs (from those available on the Darwinex platform) and allocations, in MetaTrader. A few common use-cases for constructing currency portfolios include: Studying the correlation of a trading strategy’s returns to market volatility. Trading currency strength instead of single pairs themselves. [& hellip;]
In this post, we present a technique employing ZeroMQ (an Open Source, Asynchronous Messaging Library and Concurrency Framework) for building a basic – but easily extensible – high performance bridge between external (non-MQL) programming languages and MetaTrader 4. Reasons for writing this post: Lack of comprehensive, publicly available literature about this topic on the […]
This post describes how to construct a currency portfolio composed of any number of currency pairs (from those available on the Darwinex platform) and allocations, in MetaTrader. A few common use-cases for constructing currency portfolios include: Studying the correlation of a trading strategy’s returns to market volatility. Trading currency strength instead of single pairs themselves. [& hellip;]
This post describes how to prepare and analyse OHLC time series objects in R, from DARWIN datasets available publicly on our GitHub profile. Unlike the introductory posts in this series (see below) where we focused on environment configuration and fundamentals, from here on all concepts will be presented in a practical manner, with fully functional code examples […]
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
ZMQ vinculativo para a linguagem MQL (ambos 32 bits MT4 e 64 bits MT5)
Esta é uma ligação completa da biblioteca ZeroMQ para o idioma MQL4 / 5 fornecido pelo MetaTrader4 / 5.
Os comerciantes com habilidades de programação sempre quiseram uma solução de mensagens como o ZeroMQ, simples e poderoso, muito melhor do que o truque PIPE, conforme sugerido pelos artigos oficiais. No entanto, as ligações para o MQL foram desatualizadas ou não completas (principalmente projetos de brinquedos e somente recursos básicos são implementados). Esta ligação baseia-se na versão 4.2 mais recente da biblioteca e fornece todas as funcionalidades conforme especificado na documentação da API.
Esta ligação tenta permanecer compatível entre o MQL4 / 5. Usuários de ambas as versões podem usar essa ligação, com um único conjunto de cabeçalhos. MQL4 e MQL5 são basicamente os mesmos na medida em que são incorporados em versões recentes. A diferença está no ambiente de tempo de execução (MetaTrader5 é 64bit por padrão, enquanto o MetaTrader4 é de 32 bits). O sistema de comércio também é diferente, mas não é preocupante desta ligação.
Esta ligação contém três conjuntos de arquivos:
A ligação em si está no diretório Include / Zmq. Observe que existe um diretório Mql em Incluir, que faz parte do mql4-lib. Previous Common. mqh e GlobalHandle. mqh são realmente desta biblioteca. Na versão 1.4, isso se torna uma referência direta, com conteúdo mql4-lib copiado aqui textualmente. Recomenda-se que você instale o mql4-lib completo, pois contém muitos outros recursos. Mas para aqueles que querem usar o mql-zmq sozinho, é bom implantar apenas o pequeno subconjunto incluído aqui.
Os scripts de teste e os exemplos do guia zmq estão no diretório Scripts. Os arquivos de script são mq4 por padrão, mas você pode alterar a extensão para mq5 para usá-los no MetaTrader5.
As DLLs pré-compiladas de 64 bits (Biblioteca / MT5) e 32 bits (Biblioteca / MT4) ZeroMQ (4.2.0) e libsodium (1.0.11) são fornecidas. Copie as DLL correspondentes para a pasta Biblioteca do seu terminal MetaTrader. Se você estiver usando o MT5 32bit, use a versão 32bit da Biblioteca / MT4. As DLLs exigem que você tenha o tempo de execução do Visual C ++ mais recente (2015).
Observe que, se você estiver usando MT5 32bit, você precisa comentar a definição de macro __X64__ na parte superior do Include / Mql / Lang / Native. mqh. Eu suponho que MT5 é de 64 bits, uma vez que não é possível detectar 32 bits por macros nativas e para definir valores relacionados ao ponteiro, uma macro como essa é necessária.
Observe que essas DLLs são compiladas a partir de fontes oficiais, sem qualquer modificação. Você pode compilar o seu próprio caso não confie nesses binários. O libsodium. dll é copiado da versão binária oficial. Se você deseja suportar mecanismos de segurança diferentes da curva, ou você deseja usar transportes como o OpenPGM, você precisa compilar sua própria DLL.
Nota para os usuários do WINE, se os binários padrão não funcionarem para você, você pode tentar os binários no diretório Library / VC2010. Os novos binários são um pouco mais novos (libzmq 4.2.2 e libsodium 1.0.36). Eles são compilados com o Visual C ++ 2010 Express SP1 (usando o SDK do Windows 7.1) e supostamente compatíveis com o VINHO do que com a versão VS2015. Eles dependem do tempo de execução do VC2010 (msvcr100.dll e msvcp100.dll). Na verdade, testei as DLLs antigas e novas no WINE 2.0.3 (Debian Jessie PlayOnLinux 32bit com o MetaTrader4 build 1090) e ambos funcionam. Portanto, não é garantido, mas é bom ter uma alternativa. O novo libzmq. dll só é executado no Windows Vista ou no Windows mais recente porque liguei a opção de pesquisa de pesquisa. Isso melhora o desempenho um pouco. Uma vez que o MetaTrader4 oficialmente não suporta mais o Windows XP, suponho que isso não seria um problema.
As cadeias MQL são as cadeias Win32 UNICODE (basicamente UTF-16 de 2 bytes). Nesta ligação, todas as seqüências de caracteres são convertidas em strings utf-8 antes de enviar para a camada dll. O ZmqMsg suporta um construtor de seqüências de caracteres MQL, o padrão não é encerrado nulo.
No guia oficial:
Você deve criar e usar exatamente um contexto em seu processo. Tecnicamente, o contexto é o recipiente para todos os soquetes em um único processo, e atua como o transporte para sockets inproc, que são a maneira mais rápida de conectar threads em um processo. Se no tempo de execução um processo tem dois contextos, estes são como instâncias ZeroMQ separadas.
No MetaTrader, cada Script e Expert Advsior tem seu próprio tópico, mas todos eles compartilham um processo, ou seja, o Terminal. Portanto, é aconselhável usar um único contexto global em todos os seus programas MQL. O parâmetro compartilhado do Context é usado para a sincronização de criação e destruição de contexto. É melhor nomear globalmente, e de uma maneira que não é facilmente reconhecida pelos humanos, por exemplo: __3kewducdxhkd__.
Você pode encontrar um script de teste simples em Scripts / Test, e você pode encontrar exemplos do guia oficial em Scripts / ZeroMQGuideExamples. Pretendo traduzir todos os exemplos para essa ligação, mas agora apenas o exemplo do mundo do Olá é fornecido. Eu gradualmente adicionarei esses exemplos. Obviamente, bifurcar essa ligação se você estiver interessado e bem-vindo para enviar solicitações de tração.
Aqui está uma amostra do HelloWorldServer. mq4:
Escreva mais testes. Adicione mais exemplos do guia oficial do ZMQ. Mais documentação API de alto nível para padrões comuns.
2017-10-28: Lançado 1.5: Importante: mudança de API para Socket. send; Remove API duplicada PollItem (# 11); Corrigir o aviso do compilador (# 10) e compilar a falha (# 12); Adicione o exemplo RTReq do Guia do ZMQ Capítulo 3. 2017-08-18: Lançado 1.4: corrigir o erro do setData do ZmqMsg; Alterar licença para o Apache 2.0; Inlcude mql4-lib dependências diretamente. 2017-07-18: Lançado 1.3: suporte de pesquisa refatorada; Adicione exemplos do Capítulo 2 do guia oficial do ZMQ. 2017-06-08: Lançado 1.2: corrigir o erro GlobalHandle; Adicione o método de reconstrução ao ZmqMsg; Complete todos os exemplos no Guia do ZMQ Capítulo 1. 2017-05-26: Lançado 1.1: adicione a capacidade de compartilhar um contexto ZMQ globalmente em um terminal 2016-12-27: lançado 1.0.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
zeromq.
O setor financeiro vive da tecnologia de mensagens. Em "Wall Street" (o negócio global de negociação de ações), capacidade e latência são tudo. A infra-estrutura atual, altamente sintonizada para obter milhões de mensagens por segundo, e latências sub-milissegundos, ainda falha quando o comércio fica frenético. Enormes quantidades de dinheiro dependem de ser o primeiro a obter dados e o primeiro a negociar.
O negócio de negociação de ações está evoluindo dramaticamente. O preço Penny gera mais dados. Novos regulamentos dos EUA e da UE aumentam o número de partes envolvidas nos mercados financeiros. As novas tecnologias de negociação algorítmica aumentam a demanda por dados de estoque atualizados e números de ordens iguais. Embora a infraestrutura existente possa duplicar em capacidade ou velocidade por 18 meses, espera-se que o tráfego cresça 20 vezes nos próximos três anos 1.
Ao mesmo tempo, os preços da tecnologia de mensagens estão aumentando constantemente. O middleware de mensagens - software que conecta aplicativos ou peças de aplicativos em uma forma de plug-and-play generalizada - é um dos últimos itens de grande bilhete ainda não transformados em uma commodity pela era da internet de software barato.
Os mainframes obtiveram grande parte do seu poder de mensagens inteligentes, sistemas de processamento de transações como o IBM CICS. Mas hoje mesmo o middleware padrão dos anos 1980 - ao contrário de bancos de dados, sistemas operacionais, compiladores, editores, GUIs e assim por diante - ainda não está amplamente disponível para desenvolvedores comuns. A indústria de software está produzindo várias aplicações de negócios e peças de aplicativos, e as ferramentas para fazer isso, em quantidades cada vez maiores, e preços cada vez mais baixos, mas o bit de mensagens ainda está faltando. A falta de uma maneira de conectar essas aplicações tornou-se não apenas um terreno não conquistado, mas também um sério obstáculo para o crescimento, especialmente para novas empresas que, em teoria, poderiam competir de forma agressiva com empresas maiores e mais antigas, se pudessem combinar barato blocos existentes de software.
Essa frustração é visível em muitos mercados e levou ao crescimento de mensagens-sobre-HTTP (SOAP) e outros compromissos. Arquiteturas como o SOAP funcionam, mas não resolvem os dois principais problemas de uma mensagem de nível empresarial, nomeadamente o roteamento e a fila. Assim, as empresas que usam essas tecnologias não podem escalar e não podem competir em mercados realmente grandes, a menos que escrevam seu próprio software de mensagens ou compram um produto comercial. Várias outras tentativas de padronização foram feitas para commoditise o mercado: CORBA, JMS e ultimamente AMQP, CORBA sendo infrutífero por causa da metáfora RPC que não se adequa às necessidades dos mercados financeiros, JMS sucesso no mundo Java, mas incapaz de expandir ainda mais e AMQP ainda sendo um grande desconhecido.
A demanda crescente e a falta de concorrência real mostram nas demonstrações financeiras de fornecedores de mensagens high-end como o Tibco Software Inc: "A receita total no primeiro trimestre do ano fiscal de 2007 comparado ao mesmo trimestre do ano passado aumentou em US $ 11,0 milhões ou 10 %. O aumento foi composto por um aumento de US $ 7,0 milhões ou 11% na receita de serviço e manutenção e por um aumento de US $ 4,0 milhões ou 8% na receita da licença. & Quot; 2 clientes da Tibco informam que as taxas de licença estão aumentando, ano a ano.
O mercado.
O mercado global de negociação de ações é foco primordial de ØMQ, porque é aí que a maior ênfase é colocada na mensagem, a maioria dos recursos é acumulada e a maioria das tecnologias de ponta são usadas.
A principal característica do mercado é a fome de entrega rápida. Em cada milissegundo, a cotação de ações ou a ordem comercial é mais rápida do que a concorrente se traduz em lucro financeiro direto, então as empresas envolvidas estão naturalmente ansiosas por qualquer vantagem que possam obter.
Atualmente, no estoque de negociação, a carga do tráfego é tão alta e a latência tão crítica, que o middleware precisa ser altamente otimizado. As latências são dadas em microssegundos e throughputs em milhões de mensagens por segundo e # 8230; Apesar disso, o comércio geralmente experimenta problemas quando a carga da mensagem atinge um pico. A latência pode de repente cair para segundos (ou mesmo dezenas de segundos) e grandes quantidades de dinheiro podem ser perdidas à medida que os negócios são atrasados ou falham. 3.
A situação está piorando por vários motivos:
Em 2001, a NYSE e o NASDAQ mudaram de preço de suas ações em unidades de 1/16 dólares para unidades de centavo único. Este chamado "preço do centavo" e quot; significa que os mercados de ações produzem mais dados e esses dados devem ser deslocados em redes. Tanto nos EUA como na UE, os reguladores estão obrigando os mercados financeiros a competir de forma mais aberta e agressiva, no interesse dos consumidores. Por exemplo, as mudanças regulatórias da SEC dos EUA permitem que novas empresas atuem como intermediários no setor de comércio de ações, enquanto a Diretriz de Mercados em Instrumentos Financeiros da UE (MiFID) 4 deverá aumentar as taxas de tráfego de ações na UE para corresponder aos volumes vistos nos EUA após o Reg NMS 5. Muitas empresas novas e agressivas estão entrando no mercado, especialmente construindo ou usando plataformas de "negociação algorítmica". A negociação algorítmica executa grande quantidade de ordens de baixo volume em oposição a uma pequena quantidade de ordens de alto volume executadas por comerciantes humanos tradicionais.
Portanto, aumentamos os fluxos de dados, para mais participantes, que estão empurrando para desenvolver novos modelos de negócios que dependem de obter esses dados rapidamente, detectar anomalias temporárias do mercado e responder a ele (com trades) antes de seus concorrentes. Um ambiente regulatório mais flexível está abrindo mercados previamente protegidos para uma nova competição. No geral, vemos uma corrida de armamentos para largura de banda e latência em que melhor tecnologia se traduz diretamente em mais lucros. 6.
O tráfego de mensagens deverá crescer significativamente no curto prazo - ouvimos números diferentes de até 30 vezes nos próximos três anos - e os sistemas existentes só podem duplicar a capacidade a cada 18 meses.
Há muitas tentativas para resolver esse problema emergente. As melhorias mais dramáticas no desempenho provêm da substituição do intermediário central clássico por uma arquitetura peer-to-peer em que as mensagens podem fluir diretamente na rede sem saltos extras. Nem todos os sistemas de mensagens podem adaptar sua arquitetura desta maneira.
Além da arquitetura, o local óbvio para otimizar mensagens é na "pilha", isto é, as camadas que separam o programa aplicativo da rede física. O software em si já está fortemente otimizado na maioria dos casos, então os fornecedores estão mudando para outras opções, tais como:
Otimizando a arquitetura de rede por provedores de conectividade para obter melhores latências, incluindo a mudança de clientes de mensagens perto (em termos de rede) para os produtores de mensagens; 7, 8. Clientes que se deslocam dos fluxos consolidados de cotações de ações para conectividade direta com as bolsas; 9 Otimizando formatos nos quais os dados são passados (FIX / FAST 10); Fornecer soluções de hardware completas (Tervela, Exegy, etc.); Substituindo a camada de transporte físico (Infiniband 11, 10GB Ethernet); Otimizando hardware de rede existente. Motores de descarregamento TCP, tecnologia I / OAT da Intel; 12, etc .; Modificando o sistema operacional para lidar com as mensagens em tempo real. Vários sistemas operacionais em tempo real, como o SLERT 13 da Novell; Modificando o sistema operacional para usar uma pilha de mensagens mais eficiente: E / S assíncronas, SDP, várias técnicas de cópia zero, etc. Usando multicast para distribuir cotações de ações na LAN do cliente;
Além dessas otimizações, que se concentram em aspectos individuais da pilha ou arquitetura de mensagens, também vemos tentativas que consideram o problema como um todo:
Laboratório de baixa latência da Intel 14 Centro de análise de tecnologia de valores mobiliários (STAC) 15 Diversas medidas & amp; Soluções de monitoramento (Endace etc.)
Produtos altamente otimizados com suporte de hardware extensivo tornam-se muito caros. Somente as maiores empresas comerciais podem pagar toda a gama de produtos e mesmo para essas empresas, os custos continuam sendo uma preocupação persistente. Para as pequenas empresas, muitas das soluções simplesmente não são uma opção.
Oportunidades.
Nesta seção, analisamos as oportunidades de novos produtos de mensagens de alto desempenho, como os que estamos construindo.
Saída de alto desempenho.
O primeiro e mais óbvio alvo é qualquer empresa que use middleware comercial high-end para negociação de ações, onde podemos fornecer um equivalente mais barato. Este mercado é sensível aos custos e, na nossa experiência, está disposto a absorver mudanças e riscos, a fim de obter um preço atraente e / ou uma vantagem de desempenho em relação aos seus concorrentes.
Além disso, existem muitas empresas que não podem pagar esses produtos, mas os usariam se o custo fosse menor. A lei de Zipf (geralmente usada para linguagem, mas também aplicável aos tamanhos de negócios) sugere que o número de empresas e seu tamanho segue um índice de energia inversa, de modo que oferecer um produto a 20% do preço dos líderes de mercado de alto custo deve abrir um mercado cinco vezes tão grande. (Na verdade, provavelmente não é tão grande, porque as pequenas empresas vão comprar ou alugar plataformas de negociação em vez de tentar construir suas próprias.)
Plataformas de negociação.
As plataformas de negociação são aplicativos de software que as empresas comerciais podem comprar pronto, em vez de se construir usando middleware de mensagens. Dada a demanda por operações mais baratas e rápidas, existe um grande mercado para essas plataformas. Obviamente, uma empresa que constrói uma plataforma de negociação é sensível ao custo da mensagem que ela usa e essas empresas fornecem um mercado para nossos produtos planejados.
Bancos de investimento.
Os bancos de investimento criam seus próprios sistemas de negociação e (da nossa experiência limitada) gostam de ter controle sobre a tecnologia que usam. Os sistemas baseados em padrões são altamente atraentes aqui. O cálculo é que uma tecnologia padrão é mais fácil de controlar, e é servida por um mercado maior de especialistas mais baratos. Qualquer solução AMQP tem atração imediata. O custo também é um motorista, mas para as empresas que realizam um desenvolvimento significativo em torno da mensagem, a redução dos custos secundários (como o número e o custo dos consultores internos) é um aspecto importante.
Ficou claro por que a JPMorganChase foi motivada a empurrar e investir no processo AMQP, mesmo tendo riscos consideráveis na época: o AMQP permite economias muito grandes em despesas de TI, para licenças de mensagens, desenvolvimento personalizado, controle operacional e assim por diante. Podemos oferecer uma proposta de risco muito menor para outros bancos de investimento, mas com os mesmos tipos de benefícios.
Consolidadores de dados.
O mundo do comércio de ações conecta muitas trocas (NASDAQ, NYSE, etc.) a muitos clientes. Os grandes clientes fazem conexões separadas para cada troca, mas a maioria trabalha através de consolidadores de dados, empresas como a Reuters que fornecem fluxos unificados de várias fontes.
Os consolidadores de hoje executam software de mensagens personalizadas altamente personalizadas, não é baseado em padrões e tem pouca margem para se tornar mais barato e mais rápido. Pode ser mais rápido, mas apenas a um custo elevado, que punha as empresas que ficam com mensagens personalizadas e oferece uma vantagem para as empresas que utilizam mensagens baseadas em padrões, que espalham os custos e aproveitam muito mais o desempenho.
Há uma oportunidade definitiva para abrir esse mercado e permitir que novas empresas compitam como consolidadores de dados, usando nossos produtos de alto desempenho para levar cotações aos clientes. Novas regulamentações dos EUA estão abrindo esse mercado para uma concorrência real.
As trocas (bolsas de valores, câmbio, commodities, etc.) são fortemente impactadas pelo crescimento da demanda por seus serviços. Parece inevitável que os padrões nas bordas irão forçar seu caminho para o centro, e devemos ser capazes de acompanhar as ofertas de produtos.
Além disso, estão surgindo novos tipos de plataformas de negociação (ATS, MTF e piscinas escuras 16) que gradualmente adquirem ainda maior participação no mercado das trocas tradicionais. Dado que essa tendência é bastante nova e ainda ganha impulso, esperamos ver crescente demanda por sistemas de mensagens de ponta neste mercado.
Movendo o valor para diferentes mercados.
Um dos objetivos do ØMQ é usar o dinheiro, os recursos e a experiência acumulados durante a corrida de armamentos de baixa latência no negócio de negociação de ações para oferecer soluções de mensagens de uso geral de ponta de gama alta gratuitas para o resto do setor de TI.
Algumas das áreas em que ØMQ pode ser útil.
Mensagens comerciais e institucionais.
Enviar pagamentos, fazer comunicação de empresa a empresa, passar documentos dentro de organizações governamentais, etc., é o principal mercado a se concentrar além da negociação de ações. A razão é que este é o campo onde a mensagem é usada tradicionalmente, com muitos especialistas em TI experientes conscientes de mensagens e usando isso por um longo período de tempo.
Também deve ser levado em consideração que mesmo as aplicações que não usam mensagens adequadas podem ainda estar enviando "mensagens" por diferentes meios. Considere um aplicativo localizado no local A, escrevendo um registro para o servidor de banco de dados remoto e outro no lugar B, lendo o registro. Na verdade, houve uma mensagem enviada de A para B, mesmo que o programador possa não estar ciente disso. Mesmo a comunicação entre processos e inter-threads pode ser considerada mensagens. Sincronizar diferentes aplicativos, copiando arquivos para destinos remotos, uma vez por dia também pode ser considerado como mensagem (embora seja um caso de baixa latência espetacular).
Basicamente, qualquer aplicação feita para o setor financeiro ou institucional precisa de algum tipo de mensagem e o custo da implementação varia entre 10 e 30% do custo total do projeto, de modo que usar a implementação de middleware baseada em padrões atual parece ser um investimento bastante bom.
Embora a baixa latência não seja um requisito fundamental nesta esfera, esperamos que as taxas de transação crescentes (considere regulamentos como SEPA 17 da UE e esforços de padronização como o TWIST 18) forçará lentamente as instituições financeiras a adotar soluções de mensagens de alto desempenho, causando a atual pequena A fatia do mercado de mensagens abordado por soluções de alto desempenho crescerá constantemente, até chegar em 100%.
Sistemas embutidos.
Os sistemas embutidos geralmente têm requisitos em tempo real semelhantes aos observados no negócio de negociação de ações. Considere, por exemplo, um equipamento que mede algum valor crítico em um processo tecnológico. Os dados devem ser entregues na unidade que controla o processo dentro de 1 & # 160; ms, caso contrário, todo o processo será estragado.
Os sistemas embutidos geralmente não precisam da taxa de transferência fornecida por pilhas de estoque de negociação, no entanto, se a latência, a confiabilidade e os tempos de entrega deterministas forem garantidos, eles podem aproveitar isso, mesmo que não use toda a capacidade de banda disponível.
Multimídia.
O mesmo comentário sobre os requisitos em tempo real aplica-se a multimídia (transmissão de áudio e vídeo, teleconferência, etc.). Ao contrário dos sistemas incorporados, a latência não é tão crítica, sendo o primordial o tempo de entrega determinista e o alto rendimento.
No futuro, podemos descobrir que o modelo de pequenas e pequenas mensagens de aplicativos de estoque comercial é incompatível com a abordagem multimídia baseada em fluxo. No entanto, não acreditamos que este seja o caso. Para testar a hipótese, construímos um aplicativo de teleconferência de prova de conceito sobre o AMQP e nós o vimos funcionar sem problemas.
Computação em grade.
Tendo quase os mesmos requisitos que a negociação de ações, os sistemas de grade são uma área natural para empregar pilha ØMQ.
As grelhas são icreasingly usadas nas financeiras 19 e - não surpreendentemente - na negociação de ações propriamente dita, fornecendo uma solução para problemas computacionalmente caros, como gerenciamento de risco e negociação algorítmica 20.
A bolha de baixa latência.
O mercado de soluções de baixa latência é muito animado e está expandindo nos dias de hoje. No entanto, alguns têm a sensação de que o valor do mercado é superestimado e que as corridas de armas de baixa latência continuam resultando no estouro da bolha, semelhante ao crash do ponto-com do início dos anos 2000.
Vamos examinar possíveis causas da quebra do mercado:
Há leis da física que colocam o limite inferior na latência. Especificamente, a velocidade da luz não pode ser excedida e, uma vez que a mensagem atinge esse limite, não haverá muito espaço para a competição e a corrida de armamentos de baixa latência chegará ao fim. Os custos de mensagens rápidas estão crescendo constantemente. Uma vez que atingimos o ponto em que melhorar a latência exigirá investimentos que excedam os lucros que possivelmente possam render, o fluxo de dinheiro no mercado acabará. Os gastos não razoáveis em soluções de baixa latência podem resultar em histeria, uma vez que o crescente mercado de baixa latência começa a diminuir. A histeria pode fazer o mercado cair mesmo abaixo do valor real.
Nossa visão dos problemas acima é a seguinte:
A velocidade da luz é certamente uma barreira final, no entanto, como pode ser visto com os microprocessadores, as barreiras vistas como definitivas são bastante propensas a serem cruzadas uma e outra vez. Nos negócios de mensagens, por exemplo, vemos soluções de proximidade emergentes (lidando velocidade do problema da luz colocando as aplicações interdependentes fisicamente fechadas uma à outra) ou a tendência para otimizar a parte do software da pilha de mensagens, removendo assim a latência do ponto final em vez da latência on-the-wire . Na verdade, não acreditamos que existam barreiras reais e impenetráveis para impedir a corrida de armas de baixa latência pelo menos nos próximos anos. Embora o custo da mensagem de baixa latência cresça de forma constante, deve ser levado em consideração que o preço da tecnologia - hardware e software - está diminuindo constantemente ao mesmo tempo. O que custou US $ 100 no ano passado, custa US $ 50 hoje. Assim, mesmo em um mercado estável e não expansível, onde os gastos com TI se mantêm constantes, haverá uma demanda por novas soluções para acompanhar as novas tecnologias. A histeria pode acontecer a qualquer momento e não há como evitar isso completamente. No entanto, como a troca de estoque de mensagens é, de certa forma, um mundo para si, esperamos que a histeria seja restrita a este pequeno mercado turbulento, deixando o restante do mercado de mensagens intacto. Assim, as principais vítimas serão as empresas que fornecem soluções especializadas de negociação de ações em vez de mensagens de propósito geral. Especificamente, o projeto ØMQ, aproveitando os recursos acumulados no mercado de TI focado na negociação de estoque para desenvolver uma solução de mensagens de propósito geral, pode sobreviver à quebra do mercado, dependendo de sua presença em diferentes setores do mercado de mensagens.
Conclusão.
O foco principal do ØMQ começa com a negociação de ações porque esse mercado possui uma demanda bem definida e crescente por soluções de alto nível, e as opções para colaborações e retorno sobre o investimento são abundantes. No entanto, a construção de um sistema de mensagens de baixo custo com base em padrões que pode competir de frente com o melhor do mundo abre portas em muitos outros domínios também.
Comentários: 0.
Se você encontrou esta página útil, avalie-a para que outros a encontrem.
Quem está vigiando esta página?
O design e o conteúdo do site são direitos autorais (c) 2014 iMatix Corporation. Entre em contato para suporte profissional. Conteúdo do site licenciado sob cc-by-sa 3.0 ØMQ é copyright (c) Copyright (c) 2007-2014 iMatix Corporation e Contribuintes. ØMQ é um software livre licenciado sob a LGPL. ØMQ e ZEROMQ são marcas comerciais da iMatix Corporation. Termos de Uso & # 8212; Política de Privacidade.
zeromq.
Este documento descreve um algoritmo de correspondência que fornece todas as funcionalidades necessárias para a correspondência de tópicos e a maioria das funcionalidades necessárias para o roteamento baseado em conteúdo. Este documento foi originalmente escrito por Pieter Hintjens da iMatix Corporation como parte das especificações do OpenAMQ e as técnicas descritas aqui formam a base do mecanismo de correspondência de tópicos do OpenAMQ. Posteriormente, o documento foi atualizado para cobrir algoritmos de roteamento de tópicos optimizados e problemas de filtragem de mensagens.
As mensagens correspondentes aos pedidos são um gargalo típico em um servidor de middleware orientado a mensagens. O mecanismo padrão é o "seletor", uma cláusula semelhante ao SQL que é interpretada para dar um resultado verdadeiro / falso. Os seletores são a ferramenta básica para o "roteamento baseado em conteúdo". Dado um alto volume de mensagens e pedidos, o custo dos seletores cresce exponencialmente. O & quot; tópico & quot; O mecanismo usado pelos servidores de middleware fornece um algoritmo de correspondência mais rápido baseado em um sistema de nomeação hierárquico, mas isso ainda funciona como um gargalo em cenários de alto volume.
Definimos um "pedido" como constituído por um ou mais "critérios", e uma mensagem como fornecendo um ou mais "campos". A solicitação especifica os critérios desejados em termos de campos: por exemplo, um campo com um determinado valor ou combinando um determinado padrão.
A correspondência de tópicos é baseada em padrões (por exemplo, forex * *), enquanto o roteamento baseado em conteúdo é baseado em valores de campo (& quot; moeda = USD ou GBP & quot;)?
A técnica de correspondência mais óbvia é comparar cada mensagem com cada solicitação. Se o custo de tal comparação for C, o custo da correspondência de uma mensagem é:
Onde R é o número de pedidos. O custo de C é proporcional à complexidade do pedido - ou seja, o número médio de critérios por solicitação. Em um cenário de baixo volume, R pode ser 1-10. Em um cenário de alto volume, podemos ter:
10.000 solicitações ativas (R = 10.000) um custo de correspondência de 100 microsegundos (C = 100)
Dando um custo de 10000 * 100 microsegundos por mensagem, ou 1 segundo por mensagem.
Podemos melhorar isso, observando que muitos pedidos são idênticos. Se assumirmos que o valor máximo para R será de cerca de 100, podemos reduzir o custo por mensagem para 0,01 segundos por mensagem, dando-nos um throughput máximo de 100 mensagens por segundo.
Nosso objetivo é obter um custo de correspondência de menos de 10 microssegundos por mensagem, para um potencial de transferência de até 100.000 mensagens por segundo.
A técnica de bitmap invertida.
Em 1980-81, trabalhar para Lockheed, Leif Svalgaard e Bo Tveden construiu o Sistema de Assistência de Diretório para a companhia de telefone de Nova York. O sistema consistiu em 20 computadores em rede que atendem a 2000 terminais, atendendo mais de 2 milhões de pesquisas por dia. Em 1982, Svalgaard e Tveden adaptaram o sistema para uso no Pentágono (Serviço Telefônico de Defesa). Este sistema ainda está em operação.
Svalgaard e Tveden inventaram o conceito de "bitmaps invertidos" para permitir a correspondência rápida de pedidos com nomes no diretório.
A técnica de bitmap invertida baseia-se nestes princípios:
Nós mudamos dados raramente, mas buscamos com freqüência. O número de pesquisas possíveis é finito e pode ser representado por uma grande e dispersa série de itens contra critérios, com um 1 em cada posição em que um item corresponde a um critério e 0 em outro lugar.
A técnica de indexação funciona da seguinte forma:
Nós numeramos cada item pesquisável de 0 para cima. Analisamos cada item para dar um conjunto de "critérios" Nome e valor de tuplas. Nós armazenamos a tupla de critérios em uma tabela indexada pelo nome e valor. Para cada tupla de critérios, armazenamos um bitmap longo que representa cada item que o corresponde.
A técnica de pesquisa funciona da seguinte forma:
Analisamos o pedido de pesquisa para fornecer um conjunto de critérios de nome e valor de tuplas. Buscamos cada tupla de critérios na tabela, dando um conjunto de bitmaps. Nós AND e OU ou cada bitmap para dar um bitmap de resultado final. Cada 1 bit no bitmap do resultado representa um item correspondente.
Observe que os mapas de bits podem ser enormes, representando milhões de itens e geralmente são altamente compressíveis. Grande parte da arte no uso de bitmaps invertidos vem de:
Derivando os tuplos de critérios precisos de itens e solicitações de pesquisa. Careful compression techniques on the large sparse bitmaps. Post-filtering search results to discard false positives.
Today's web search engines use such techniques. We (Hintjens et al) have built several search engines using these techniques (from STAR in 1990, to sms in 2001).
Application to Message Matching.
The inverted bitmap technique thus works by pre-indexing a set of searchable items so that a search request can be resolved with a minimal number of operations.
It is efficient if and only if the set of searchable items is relatively stable with respect to the number of search requests. Otherwise the cost of re-indexing is excessive.
When we apply the inverted bitmap technique to message matching, we may be confused into thinking that the message is the "searchable item". This seems logical except that message matching requests are relatively stable with respect to messages.
So, we must invert the roles so that:
The "searchable item" is the matching request, which we will call a "subscription" for the purposes of discussion. The "search request" is the message.
The indexing process now works as follows:
We number each match request from 0 upwards. We analyse each match request to give a set of criteria tuples. We store the criteria tuples in a table indexed by name and value. For each criteria tuple we store a long bitmap representing each match request that asks for it.
The message matching process works as follows:
We analyse the message to give a set of criteria tuples. We look up each tuple in the table, giving a set of bitmaps. We accumulate the bitmaps to give a final result bitmap. Each 1 bit in the result bitmap represents a matching subscription.
Worked Examples.
Topic Matching Example.
Imagine we have these topics:
Imagine these subscriptions, where * matches one topic name section.
When we index the matches for each subscription we get these bitmaps:
Now let us examine in detail what happens for a series of messages:
Field Matching Example.
For our example we will allow matching on field value and/or presence. That is, a subscription can specify a precise value for a field or ask that the field be present.
Imagine these subscriptions:
When we index the field name/value tuples for each subscription we get these bitmaps:
Now let us examine in detail what happens for a series of messages:
Message A: "currency=JPY, market=forex, slow"
Message B: "currency=JPY, urgent"
Message C: "market=forex, currency=EUR"
Note that the hit count is:
zero for subscriptions that do not match. 1 or greater for subscriptions that have at least one matching criteria (a logical OR match). Equal to the criteria count when ALL criteria match (a logical AND match).
Optimised topic routing algorithm.
While routing on topics as presented above is extremely fast, it tends to consume too much memory in large stock trading scenarios (millions of distinct topics, thousands of subscriptions). This section introduces optimised topic routing algorithm with modest memory requirements.
First of all, let's break individual subscriptions into their constituent parts. There's a 1st part of the topic, 2nd part of the topic etc. The longest subscription determines maximal number of parts we're going to take into account. If there's a message with more parts that the maximal number we've computed, it's safe to assume it doesn't match any subscription. We can drop such a message straight away without doing any additional processing.
If the topic doesn't exceed maximal size, we'll match each individual constituent with corresponding constituents of the subscriptions using inverted bitmap technique described above.
Say we have following subscriptions "trade, forex. eur, forex.*". Maximal number of constituents is 2:
Inverted bitmap for the first constituent:
Inverted bitmap for second constituent:
Note the " null " row in each bitmap. & quot; null " means that the particular has no corresponding constituent. For instance, "trade" has no second constituent, thus it is assumed to be equal to " null ".
Also note the " other " row. This is a way to limit the number of rows in each bitmap to match the number of possible alternatives for the constituent as they appear in subscriptions. There's no need to add new rows for values that don't appear in subscriptions. Say, the message " forex. usd " contains second constituent " usd ", however, as it is not mentioned in any subscription we don't need a separate line in the bitmap for it. We'll simply treat it as " other " valor.
The matching algorithm itself is easy: Break the topic of the message into its constituents, find a corresponding row in each inverted bitmap and perform logical AND on the selected rows. Note that this means that at most N rows are combined, N being maximal number of constituents in any subscription. This is quite a low number, presumably less than 10.
Additionally, it's not always necessary to perform logical conjunction on all the rows. Once you get an empty bitmap after processing couple of rows, there's no point and doing AND for subsequent rows - the topic does not match any subscription anyway.
Here are few examples of how the matching works:
Message has " forex. eur " topic. Get the " forex " row from the first consituent bitmap, " eur " row from the second constituent bitmap and perform logical AND on the rows:
Now the same thing for a message with " forex. jpy " topic:
One more example. This time message with single-constituent topic (" trade "):
There's one important optimisation that haven't been mentioned so far. If the topic of the message contains a sequence of nulls (e. g. " forex. null. null. null. null. null ") there's no need to worry about constituents corresponding to the second and any subsequent nulls. in case of " forex. null. null. null. null. null " algorithm has to AND the row from first constituent bitmap and the row from second constituent bitmap, however, it can safely ignore the rows for third to sixth constituent. (The proof of correctness of the optimisation is left as an exercise for the reader.)
The above optimisation is especially important in the case the topic tree is unbalanced. For instance if most topics consist of three constituents, however, there's a single topic with 100 constituents, subscribing for that topic causes inverted bitmaps to have 100 rows. Thus, without above optimisation, each message matching requires 100 bitmap conjunctions, while in 99% of cases 3 conjunctions are enough to perform the matching.
Filtering is similar to matching, the only distinction being that you are not interested in which particular subscriptions match, rather what you want to know whether at least one subscription is matches.
Filtering is especially useful in multicast scenarios where all messages are transferred over the wire and it's receiver's responsibility to filter out those that don't match any local subscription.
While exactly the same inverted bitmap algorithm is used, it is possible to optimise it even further for the filtering use case.
With filtering we are basically interested in whether there is at least one bit set in the resulting bitmap. Thus, if we find out that the first bit is 1, there's no need to evaluate the remaining bits. Consequently, the algorithm can evaluate individual subscriptions from left to right and stop when it encounters the first one that matches.
Consider the " forex. eur " example above:
Note that AND is not done for the third subscription. Although this may seem to be of little help, with large bitmaps consisting of thousands of subscriptions it can save a lot of processing.
Obviously, doing logical AND on per-bit basis is terribly inefficient. In real-world implementation AND should be done from left to right in batches containing 32 or 64 subscriptions, depending on the processor data bus width or even batches of 128 or more with dedicated SIMD instructions.
Research ideas.
There are several ways to speed the matching algorithm even more, trading more work to do on subscribing/unubscribing for faster message matching and filtering.
One possibility is to lower the number of subscriptions by subsuming them. In the filtering use case, if there's " forex.* " subscription, there's no need for " forex. eur " subscription, because the former is a superset of the latter.
Another possibility is to move the subscriptions that we expect to match the most messages to the left of the bitmap while leaving those that have only small probability of succeeding on the right. In combination with left-to-right evaluation of logical conjunction in the filtering use case, we can get an algorithm that will in most cases succeed early on, hopefully after evaluating first few columns of the inverted bitmap.
There's even an obvious heuristic to determine whether a particular subscription is likely to match: The more wildcards (*) there are in the subscription the larger set of messages it is able to match and thus more likely it is that it'll succeed. That way, moving the subscriptions with large number of wildcards to the left while keeping those with no or little wildcards on the right is likely to give a very efficient algorithm.
Conclusão.
We believe that application of the above algorithms can give a system that will be able to match or filter a single message in the range of nanoseconds or couple of microseconds even it the case of large amount of different topics and subscriptions.
Comments: 13.
I ready somewhere among the pages/articles of zeromq that it uses a trie for filtering/matching messages when subscription is done using SUB socket.
The article here describes about topic matching and message filtering again , which method is actually used . Is this article only relevant to AMQP or is this even used in zero MQ , if it is indeed used in zero MQ then what is the trie matching/filtering about ? Could you elaborate more on the performance diffence , how/why is that filtering different than this , why not the most optimized filtering/matching everywhere.
The topic matching described here is very fast and flexible, can handle any kind of match, but does heavy work each time there's a new topic key, which is bad for low-latency systems. Tries are simpler and give more predictable performance.
Well even with trie I would assume you would have to update the trie because a new topic is added and each node of trie would contain a bitmap representing which queues the message should be forwarded to.
Could you explain how do you intend to use trie (for pub and sub filtering),?
You can read the code to see how the trie is used.
well , i do understand for the subscriber code , but could you throw some more details on pub side code.
In case of message matching what if number of matching criteria is say couple of them per subscription but message contains 10s of field / Value.
in this case most of the field/value will not be present in index table correct and will be a miss and time spent for no use ?
Usually then you separate the fields you want to match on (put them in a header) from the rest of the fields. If you really want to allow matching on _any_ field, you're going to have a less efficient process.
If there is a subscription like orange.#.yellow. How the bitmap can be created by using this?
If you read the explanation in the article it should be clear.
I mean during the implementation as we cannot predict the consitutents initially, when adding a new table for consitutent keeping track of the subscriptions which have # wildcards in the middle will make the implementation more complex. I am asking whether is there are any easy ways to implement this?
the article explains this ..
u build a table for all the criteria say sub1 is orange.#.yellow and sub2 is apple. custard.*
so sub1 bitmap will be 1100 and sub2 will be 0011.
and then for each message u create a bitmap.
0 0 0 0 ->its not 1100 so message doesnt match, also no matching fields.
0 0 1 0 ->its not 0011 so message doesnt match, but has one matching fields.
1 1 0 0 ->its 1100 so message matches, chk for order though.
How you did the performance test after adding this algorithm. I means what is the tool you used.
I just ran a single threaded test case which created subscriptions and then matched against random messages.
Written: 07 Aug 2007 10:19.
Revised: 17 Apr 2012 11:55.
If you found this page useful, please rate it up so others will find it.
Who's watching this page?
Web site design and content is copyright (c) 2014 iMatix Corporation. Contact us for professional support. Site content licensed under cc-by-sa 3.0 ØMQ is copyright (c) Copyright (c) 2007-2014 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ and ZEROMQ are trademarks of iMatix Corporation. Terms of Use — Política de Privacidade.
ZeroMQ – Trade Execution in MetaTrader (ZMQ-II)
This post builds on the contents of the previous article in this series, namely ZeroMQ – How to Interface Python/R with MetaTrader 4.
Therein, we proposed a solution to creating trading strategies in ZeroMQ supported programming languages outside the MetaTrader environment, with the latter simply acting as the intermediary to the market.
Leveraging ZeroMQ’s convenient communication patterns such as Request (REQ) / Reply (REP) and PUSH/PULL , we demonstrated how to plan and develop a simple yet powerful, distributed trading architecture that opens doors to more sophisticated trading strategy development otherwise not possible within the confines of the MetaTrader terminal.
In this post we’ll describe how to execute new orders and manage existing ones via ZeroMQ, through any supported programming language such as Python or R.
Our route to market will continue to be MetaTrader 4, all trading decisions being made outside it the entire time.
Em termos técnicos & # 8211; as before, any trading strategy will behave as a Client and MetaTrader as the Server .
We will also develop a simple message topology for performing these execution and reporting functions, such that the same topology is understood by both Clients (trading strategies) and Servers (MetaTrader).
The Message Topology Opening, Modifying & Closing Trades Getting Account/Market Information Getting Trade Reports.
This post will cover the Message Topology and Opening/Modifying/Closing Trades sections. The next post in this series will describe the latter two.
1) Message Topology.
ZeroMQ – Distributed Messaging.
Before moving forward, we first need to define some discrete messaging rules that both our trading strategies and MetaTrader can understand.
In the MQL source code provided in the previous post, these rules will need to be implemented in the InterpretZmqMessage function, the definition for which is:
These rules will in essence map particular messages to actions, for example:
For this post’s implementation, let’s define the following message formats:
Opening, Modifying & Closing Trades:
With the message topology in place, we can now construct messages containing trading/reporting instructions.
The ZeroMQ enabled MetaTrader server will receive and execute the instructions via the REQ/REP socket as defined in the first post, and send information back to requesting clients using either the REQ/REP or PUSH/PULL socket depending on the instruction.
One implementation for example, could use REQ/REP for “critical” messages, e. g. Open/Modify/Close trading instructions and their corresponding results, while “non-critical” instructions such as displaying account equity for reporting purposes could use the PUSH/PULL socket.
At the end of the day, there are a number of ways this logic could be implemented.
Your choice of communication pattern (REQ/REP or PUSH/PULL) will depend entirely on how critical you consider one instruction set vs. another.
Generally, it pays dividends to plan this in advance of any development, as different control flows will have different performance results and come with their own considerations (good or bad problems if you will).
In the next 3 sections, we’ll run through some examples of how each message format above can be used in practice.
The ZMQ EA Template for MetaTrader 4 shared in the last post, is already setup with the appropriate code placeholders in the InterpretZmqMessage() function so readers can implement these easily.
2) Opening, Modifying & Closing Trades.
As above, we’ll use the following format for trade instructions:
Let’s break this down further, into what each component of this message could contain:
For example, our trading strategy in Python or R could send the following message to the ZeroMQ EA deployed in MetaTrader 4:
Here, our trading strategy is requesting that:
A trade be executed (OPEN), Order Type (1) is OP_SELL (meaning sell at Market) Symbol to trade is EURUSD Open/Close price is set to 0 (which in your code should default to executing at the available market price). Stop loss of 50 pips Take Profit of 50 pips Trade’s comment to be set to “R-to-MetaTrader4” Ticket # is 0 (as ticket ID’s are not specified when executing trades in MetaTrader 4).
Implementing this logic in InterpretZmqMessage() inside the MQL EA provided, you can then populate a call to MetaTrader’s OrderSend() function and send the order to market.
Ordens pendentes.
In the case of Pending Orders (Buy Stop, Buy Limit, Sell Stop Sell Limit) , the code you write should of course not ignore Open/Close price.
A call needs to then be made to OrderSend() with “ price ” set to this value, and “ cmd ” set to the appropriate command as received in the message via ZeroMQ,
i. e. OP_BUYLIMIT (if 2) , OP_SELLLIMIT (if 3), OP_BUYSTOP (if 4) and OP_SELLSTOP (if 5).
Note: The numeric values (1,2,3,4,5) are chosen arbitrarily of course. You may choose any values you consider meaningful, as long as you implement their corresponding logic exactly in MetaTrader as you do in your external trading strategy (in e. g. Python or R).
Modifying Orders.
In this case, your logic in the InterpretZmqMessage() function will need to ignore Open/Close price once again, and instead populate a call to MetaTrader’s OrderModify() function with its “stoploss” and “takeprofit” parameters set to those received in the ZeroMQ message.
Order Type can be ignored as an existing order is being modified.
You will also need to read the Ticket ID field and specify it in OrderModify()’s “ ticket ” parameter, so MetaTrader knows which trade to modify, in this case “12345678”.
Closing / Deleting Orders.
The procedure for closing orders in MetaTrader 4 is fairly straightforward.
All you would need is to pass the Ticket ID received via ZeroMQ to an OrderClose() call, along with parameter values for “ lots ” specifying lot size to close, the “ price ” you wish to close at (e. g. Bid or Ask) and the maximum “ slippage ” you’re willing to tolerate on the transaction.
Deleting existing pending orders is even simpler -> simply pass the Ticket ID received via ZeroMQ to OrderDelete(), populating its “ticket” parâmetro.
In the next post (ZMQ-III), we’ll take this one step further and describe how to implement Account & Trade Reporting via ZeroMQ.
As always, we would greatly appreciate if you shared this content with your colleagues and networks.
And please do feel free to ask questions / provide feedback / make requests / anything in between, via the comments section below.
Webinar Recording: How to Interface Python/R Trading Strategies with MetaTrader 4.
This post describes how to construct a currency portfolio composed of any number of currency pairs (from those available on the Darwinex platform) and allocations, in MetaTrader. A few common use-cases for constructing currency portfolios include: Studying the correlation of a trading strategy’s returns to market volatility. Trading currency strength instead of single pairs themselves. [& hellip;]
In this post, we present a technique employing ZeroMQ (an Open Source, Asynchronous Messaging Library and Concurrency Framework) for building a basic – but easily extensible – high performance bridge between external (non-MQL) programming languages and MetaTrader 4. Reasons for writing this post: Lack of comprehensive, publicly available literature about this topic on the […]
This post describes how to construct a currency portfolio composed of any number of currency pairs (from those available on the Darwinex platform) and allocations, in MetaTrader. A few common use-cases for constructing currency portfolios include: Studying the correlation of a trading strategy’s returns to market volatility. Trading currency strength instead of single pairs themselves. [& hellip;]
This post describes how to prepare and analyse OHLC time series objects in R, from DARWIN datasets available publicly on our GitHub profile. Unlike the introductory posts in this series (see below) where we focused on environment configuration and fundamentals, from here on all concepts will be presented in a practical manner, with fully functional code examples […]
Comments
Post a Comment