English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Negociação Bidirecional e de cobertura de posições no MetaTrader 5 Através do Painel de HedgeTerminal, Parte 1

Negociação Bidirecional e de cobertura de posições no MetaTrader 5 Através do Painel de HedgeTerminal, Parte 1

MetaTrader 5Negociação | 17 junho 2015, 11:54
6 119 0
Vasiliy Sokolov
Vasiliy Sokolov

Índice


Introdução

Nos últimos 18 meses, o MetaQuotes tem realizado um extenso trabalho sobre a consolidação das plataformas MetaTrader 4 e MetaTrader 5 num ecossistema de negociação unificada. Agora ambas as plataformas partilham um mercado comum de soluções de programas — Mercado, oferecendo produtos diferentes dos desenvolvedores externos. Os compiladores para ambas as plataformas foram unidos também. Como resultado ambas as plataformas têm um compilador comum baseados no MQL5 e uma linguagem de programação - o MQL com uma função diferente configurada dependendo da plataforma em uso. Todos os códigos-fonte publicamente disponíveis localizados na Base de Código também foram revistos e alguns deles foram ajustados para serem compatíveis com o novo compilador.

Esta grande unificação das plataformas deixou de lado a unificação referente a negociação. Os modelos de negociação do MetaTrader 4 e MetaTrader 5 ainda são incompatíveis apesar da maior parte do ambiente de negociação ser compartilhado. O MetaTrader 4 facilita a gestão individual de posições de negociação através do sistema de ordens - entidades de programas especiais que fazem as negociações bidirecionais neste terminal serem simples e fácil. MetaTrader 5 é destinado para negociações da bolsa onde a principal representação das obrigações do trader é a sua posição líquida global. Ordens no MetaTrader 5 são simplesmente instruções para comprar ou vender um instrumento financeiro.

A diferença entre o desempenho das negociações destas duas plataformas causou uma série de discussões e debates acalorados. No entanto, discussões são discussões. Infelizmente, desde o lançamento do MetaTrader 5, nem uma única solução de trabalho foi publicada que permitisse apresentar as posições bi-direcionadas como obrigações de um trader no MetaTrader 4. Apesar de numerosos artigos publicados sugerirem várias soluções, não foram flexíveis o suficiente para serem usadas convenientemente em larga escala. Além disso, nenhuma dessas decisões são adequadas as negociações de bolsa, o que envolve uma série de nuances a serem levadas em consideração.

Este artigo procura resolver as controvérsias entre os fãs da quarta e quinta versão da plataforma MetaTrader. Isto vai proporcionar uma solução universal através da especificação completa do programa e a exata solução do programa implementado por esta especificação. Este artigo discute o HedgeTerminal, uma biblioteca de virtualização e painel visual que permitem apresentar a obrigação de um trader como nas posições bidirecionais do MetaTrader 4. Ao mesmo tempo, o modelo subjacente do HedgeTerminal leva em conta o caráter da execução das ordens de negociação. Isso significa que ele pode ser implementado com sucesso tanto no mercado FOREX de balcão como nas bolsas centralizadas, como por exemplo, a negociação de valores mobiliários derivativos na seção de derivativos da Bolsa de Moscou.

HedgeTerminal é um terminal de negociação com todos os recursos dentro do terminal MetaTrader 5. Através do mecanismo de virtualização , um trader ou um robô de negociação pode gerenciar suas posições de negociação individualmente, alterando a representação das posições em andamento. Nem o número de posições, nem a sua direção tem qualquer importância. Eu gostaria de dar ênfase ao fato de que estamos falando de virtualização - um mecanismo específico transformando a apresentação das obrigações de um trader, mas não as suas características qualitativas.

Não se trata de distorcer os resultados da atividade financeira do trader, mas sobre a transformação da representação desta atividade. O HedgeTerminal baseia-se no ambiente de negociação MetaTrader 5 e na linguagem de programação do MQL5. Ele não traz novas informações de negociação para o terminal, ele simplesmente faz o ambiente de negociação atual ser visto de um ângulo diferente. Isso significa que o HedgeTerminal é essencialmente MetaTrader 5 bem como esta é o seu aplicativo nativo. Mesmo assim, poderíamos colocar um sinal de identidade entre eles, um sinal de inclusão é mais apropriado ao HedgeTerminal, ou seja, apenas um pequeno dos muitos aplicativos do MetaTrader 5.

A possibilidade de virtualização e a existência HedgeTerminal são baseados em três paradigmas:

  1. Conceitualmente, é possível uma completa e garantida convertibilidade da representação de posições líquidas em operações de negociações bidirecionais individuais. Esta declaração prova o fato de que em algumas plataformas de negociação externas, incluindo as projetados para a negociação de bolsa de valores, existe como gerenciar posições bidirecionais;
  2. O modelo de negociação do MetaTrader 5 a nível do usuário permite criar um caminho de links de ordens para outros. Cálculos mostraram que os links desenhadas de uma certa maneira são resistentes às colisões. Além disso, mesmo no caso de uma histórico corrompido ou qualquer situação de força maior, as operações bidirecionais poderiam ser corrigidas posterioriormente e trazidas a um resultado financeiro calculado em representação líquida;
  3. API avançada em MQL5 permite colocar o sinal de identidade entre MQL5 e a plataforma do terminal MetaTrader 5. Em outras palavras, quase tudo no MetaTrader 5 é acessível através da interface do programa e da linguagem de programação MQL5. Por exemplo, com o HedgeTerminal, a própria versão do terminal pode ser escrito dentro do terminal MetaTrader 5.

Este artigo discute os algoritmos subjacentes e como HedgeTerminal funciona. As especificações e algoritmos que asseguram as negociações bidirecionais consistente são discutidas neste artigo em detalhe. Independentemente de saber se você vai decidir usar o HedgeTerminal para criar sua própria biblioteca e gerir os seus próprios algoritmos de negociação, você vai encontrar informações úteis neste artigo e na sua continuação.

Este artigo não tem como alvo especificamente os programadores. Mesmo não tendo nenhuma experiência em programação você vai entender. O código fonte MQL não está incluído neste artigo deliberadamente. Os códigos fontes foram substituídos por diagramas mais ilustrativos, tabelas e imagens que representam esquematicamente o princípio de funcionamento e a organização de dados. Posso dizer por experiência que mesmo tendo uma boa compreensão dos princípios de programação, é muito mais fácil de ver um padrão comum de código do que analisá-lo.

Na segunda parte deste artigo, vamos falar sobre a integração dos Expert Advisors com a biblioteca de visualização HedgeTerminalAPI e a programação envolvida. Mesmo nessa abordagem, tudo foi feito para simplificar a percepção do código, especialmente para os programadores inexperientes. Por exemplo, construções de um objeto-orientado como classes não são utilizados, embora o HedgeTerminal é um aplicativo objeto-orientado.


Como Ler Este Artigo

Este artigo é bastante longo. Se por um lado, isso é bom, pois pode ser encontrada aqui praticamente qualquer resposta de perguntas sobre este tema. Por outro lado, muitos usuários preferem ler apenas as informações mais importantes sempre que achar necessário. Este artigo cobre na íntegra uma apresentação consistente do material. Similar aos livros, vamos dar um breve resumo de cada capítulo para que você possa verificar se você precisa lê-lo ou não.

  • Parte 1, Capítulo 1. Teoria da organizacional da negociação bidirecional. Este capítulo contém as principais idéias do HedgeTerminal. Se você não quer informações detalhadas sobre a organização das negociações bidirecionais, este capítulo é o suficiente para se ter uma idéia dos princípios gerais de funcionamento do HedgeTerminal. Este capítulo é recomendado para todos os leitores.

  • Parte 1, Capítulo 2. Instalação do HedgeTerminal, primeiro lançamento. Este capítulo descreve o lançamento e como configurar o painel visual do HedgeTerminal. Se você não for usar o painel visual de HedgeTerminal, então você pode ignorar este capítulo, porém se vai usar a biblioteca HedgeTerminalAPI, você terá que ao menos passar pelas seções 2.1 e 2.2 deste capítulo. Eles são dedicados ao instalador HedgeTerminal. O instalador é o componente comum para todos os produtos HedgeTerminal.

  • Parte 1, Capítulo 3. Desvendando o HedgeTerminal. Especificação e princípio das operações. Este capítulo destaca a disposição interna de HedgeTerminal, seu algoritmo e organização de dados internos. Aqueles que estão interessados na negociação bidirecional podem achar este capítulo informativo. Traders profissionais de algorítmicos que desenvolvem suas próprias bibliotecas de virtualização e usam diversos robôs simultaneamente também podem achar muito útil este capítulo.

  • Parte 2, Capítulo 1. Comunicação dos Expert Advisors com o HedgeTerminal e seu painel. Este capítulo será apreciado por aqueles que estão apenas explorando este aspecto e aqueles que estão trabalhando profissionalmente em negociação algorítmica . Ele descreve os princípios comuns de trabalho com a biblioteca HedgeTerminal e a arquitetura do robô de negociação.

  • Parte 2, Capítulo 2. Documentação para a API do HedgeTerminal. Contém documentação sobre como usar as funções da biblioteca HedgeTerminalAPI. O capítulo é escrito como uma lista de documentação que poderá ser referida ao longo do tempo. Não há discussões desnecessárias e excesso de textos. Este capítulo contém apenas protótipos de funções, estruturas e enumerações, bem como breves exemplos de uso.

  • Parte 2, Capítulo 3. Noções básicas sobre operações de negociação assíncronas. O HedgeTerminal utiliza operações assíncronas em seu trabalho. Este capítulo compreende a experiência de usá-las e foi incluído neste artigo para que qualquer leitor possa encontrar alguma informação útil, independentemente de seus planos para usar o HedgeTerminal em seu trabalho.

  • Parte 2, Capítulo 4. Noções básicas de programação multi-threaded no ambiente MetaTrader. Este capítulo explica o que é programação multi-threading, como organizá-la e quais padrões de organização de dados podem ser usados. Como no Capítulo 3, compartilhamos a experiência de desenvolvimento de aplicativos multi-thread com todos os usuários MetaTrader.

Espero que este artigo esteja interessante o suficiente para que você leia-o até o final.


Capítulo 1. Teoria organizacional da negociação bidirecional

1.1. Oportunidades MetaTrader 5 na Organização de Negociação Bidirecional

O artigo "Princípios da Precificação da Bolsa Tomando Como Exemplo o Mercado de Derivativos da Bolsa de Moscou" descreve com cuidado as nuances da formação dos preços da bolsa e métodos de cálculo do resultado financeiro dos operadores no mercado. Ele descreve que os preços e cálculo na Bolsa de Moscou diferem significativamente dos conceitos e métodos de cálculo realizados no mercado FOREX.

No seu conjunto, a formação do preço da bolsa é mais complexa e contém uma grande quantidade de detalhes significativos escondidos se comparados com a negociação Forex e no terminal MetaTrader 4.

Por exemplo, no MetaTrader 4 as ofertas implícitas na ordem de negociação são ocultas enquanto que na MetaTrader 5 essas informações estão disponíveis. Por outro lado, informações detalhadas de negociação MetaTrader 5 nem sempre são necessárias, podendo tornar difícil o trabalho para um usuário inexperiente ou programador iniciante, causando mal-entendidos. Por exemplo, em MetaTrader 4 para descobrir o preço da ordem executada, você simplesmente necessita olhar o valor correspondente na coluna "Preço". Na linguagem de programação MQL4 basta chamar a função OrderOpenPrice(). Em MetaTrader 5 é necessário buscar todos as ofertas executantes da ordem e calcular seu preço médio ponderado. Esta média é o preço de execução da ordem.

Existem outras situações no ambiente de negociação em MetaTrader 5 que necessitam de esforços adicionais para análise. Isso levanta questões lógicas:

Existe uma maneira de fazer o processo de negociação MetaTrader 5 tão simples e claro quanto a MetaTrader 4 e manter a praticidade necessária de todos os detalhes da negociação? Existe uma maneira de organizar a negociação bidirecional usando MetaTrader 5 da mesma forma simples como MetaTrader 4? - As respostas a essas perguntas é: "Sim, existe"!

Vamos consultar o diagrama de recursos dos terminais MetaTrader 4 e MetaTrader 5 para entender como isso é possível:

Fig. 1 Recursos do MetaTrader 4 e MetaTrader 5

Fig. 1. Recursos do MetaTrader 4 e MetaTrader 5

Como podemos ver, o conjunto "MetaTrader 5" inclui o subconjunto "MetaTrader 4". Isso significa que toda a disponibilidade no MetaTrader 4 pode ser realizada na plataforma do terminal MetaTrader 5, mas não o contrário. Novos recursos do MetaTrader 5 inevitavelmente aumentam a quantidade e a complexidade da apresentação das informações de negociações. Esta dificuldade pode ser delegada a programas assistentes especiais de trabalho no ambiente MetaTrader 5. Estes programas podem processar a complexidade, deixando as capacidades do terminal no mesmo nível. Um destes programas, o HedgeTerminal, é o foco deste capítulo.

O HedgeTerminal é um terminal de negociação com todos os recursos dentro do terminal MetaTrader 5. Ele usa o ambiente de negociação MetaTrader 5, transforma-o com a linguagem MQL5 e representa-o como uma prática interface gráfica: o painel HedgeTerminalUltimate e a interface especial HedgeTerminalAPI para a interação com algoritmos independentes (Expert Advisors, scripts e indicadores).

O MetaTrader 4 oferece a possibilidade de usar posições bidirecionais ou ordens de bloqueio, no MetaTrader 5 existe tal recurso também, mas não é explícito. Isso pode ser habilitado usando um programa extendido específico, que é essencialmente o HedgeTerminal. O HedgeTerminal é construído no MetaTrader 5 e usa seu ambiente, coletando informações das ofertas e ordens em posições integradas de modo semelhante às ordens no MetaTrader 4 e com todos os recursos do MetaTrader 5.

Tais posições podem ser de bloqueio completo ou parcial (quando existem posições compradas e vendidas ao mesmo tempo). A oportunidade de manter estas posições não é um objetivo em si mesmo para HedgeTerminal. Seu principal objetivo é unir informação de negociação em grupos unificados (posições) para facilitar a análise, gerenciar e obter acesso. Posições bidirecionais podem existir no HedgeTerminal apenas pela praticidade do mesmo. No caso de vários traders estarem negociando numa conta ou mais de uma estratégia sendo usada, devem ser organizadas ações de divisão da negociação.

Além disso, uma série de nuances devem ser consideradas na negociação na bolsa, tais como: execução parcial da ordem, posição de rolagem, cálculo da margem de variação, estatísticas e muitos outras. HedgeTerminal foi desenvolvido para atender a estes desafios. Ele fornece ao usuário um Expert Advisor com uma interface regular de alto nível, assemelhando-se MetaTrader 4 e ao mesmo tempo funcionando corretamente no ambiente de bolsa.


1.2. Ordens de emparelhamento - Base da Cobertura (Hedge) e Estatística

Para gerir técnicas de negociação e algoritmos de forma consistente, é necessário saber, com certeza, qual ação de negociação pertence a qual algoritmo.  Eu destaquei as palavras "com certeza", porque se houver a menor probabilidade de falha de administração das posições, mais cedo ou mais tarde a quebra é inevitável. Por sua vez, isto resultará em danos de estatísticas e minará a idéia da gestão de diferentes algoritmos numa conta.

A separação segura das atividades de negociação baseia-se em duas possibilidades fundamentais:

  1. A possibilidade de unir ou "emparelhar" duas ordens de negociação conjuntas deve levar em conta sempre a definição de qual das duas ordens abrirá a posição individual (virtual) e qual delas estará fechando esta posição;
  2. O algoritmo, analisando as ordens para o emparelhamento deve ser completamente determinista e unificado para todos os módulos do programa.

O segundo requisito para o algoritmo determinista será analisada em detalhes abaixo. Agora vamos nos concentrar na primeira.

Uma ordem é uma instrução para vender ou comprar. Uma ordem é uma entidade definida que inclui muitos "campos" de informação, além de das principais informações como o número mágico, o número de ordem, o preço exigido e as condições de abertura.

Um desses campos no MetaTrader 5 é chamado de "Order Magic". Este é um campo específico usado por um robô de negociação (Expert Advisor) para marcar esta ordem com um único número indivídual, conhecido como "número mágico". Este campo não é utilizado em negociação manual, mas é muito importante para algoritmos de negociação, pois quando um algoritmo de negociação analisa os valores deste campo, sempre poderá verificar se a ordem em questão foi colocada por ele ou qualquer outro algoritmo.

Vamos olhar um exemplo. Vamos assumir que precisamos abrir uma posição clássica de compra e depois de algum tempo, fechá-la. Para isso temos de colocar duas ordens. A primeira ordem vai abrir esta posição e a segunda ordem vai fechá-la:

Fig. 2. As ordens formando uma posição líquida histórica

Fig. 2. As ordens formando uma posição líquida histórica

E se nós escrevemos o número mágico da primeira ordem no campo "Ordem Magic" da segunda ordem no momento de enviá-la ao mercado?

Mais tarde, este campo de ordem pode ser lido e se o valor for igual ao número de primeira ordem, então podemos dizer definitivamente que a segunda ordem está relacionada com a primeira e em sentido contrário, isto é, uma ordem de venda.

Num diagrama este emparelhamento seria algo como:

Fig. 3. Ordens de emparelhamento

Fig. 3. Ordens de emparelhamento

Nominalmente podemos denominar estas ordens como ordens de emparelhamento, visto que a segunda ordem contém um link para o primeiro. A primeira ordem aberta de uma nova posição pode ser denominada como uma ordem de inicialização ou de abertura. A segunda pode ser denominada como ordem de fechamento.

Um par de ordens emparelhadas denominamos de posição. Para evitar confusão com o conceito de "posição" no terminal MetaTrader 5, vamos chamar essas posições emparelhadas de bidirecional, hedging ou HedgeTerminal. Posições no terminal MetaTrader 5 serão chamadas de posições líquidas ou de posições clássicas.

Aparentemente, o número de posições HedgeTerminal e as suas direções, ao contrário das clássicas, podem ser qualquer uma. E se existe uma ordem executada que não é vinculada a qualquer outra ordem? Uma ordem deste tipo pode ser apresentada como uma posição bidirecional ativa. Na verdade, se uma ordem contrária que contém um link para essa ordem é realizada, ela será uma ordem de fechamento da primeira ordem. Estas ordens serão emparelhadas e farão o fechamento da posição bidirecional, bem como o volume de duas ordens será igual e sua direção é oposta.

Então, vamos definir o que se entende sobre o HedgeTerminal por posição:

Se uma ordem executada não é mencionada por qualquer outra ordem, então o HedgeTerminal trata tal ordem como uma posição bi-direcional ativa.

Se uma ordem executada é vinculada a uma outra ordem executada, então estas duas dessas ordens formam um par e são tratadas pelo HedgeTerminal como uma unificação histórica ou o fechamento de uma posição bidirecional.

Na realidade as ordens de emparelhamento no HedgeTerminal são muito complicadas, pois toda ordem gera uma oferta mínima e na bolsa de valores poderão haver muitas ofertas numa ordem. Em geral, o processo de negociação pode ser apresentada da seguinte forma: um operador coloca uma ordem para abrir uma nova posição através do terminal MetaTrader 5. A bolsa executa essa ordem através de uma ou várias ofertas.

As ofertas, semelhante às ordens, contêm campos para informações adicionais. Um desses campos contém a id da ordem, com base no qual a oferta foi executada. Este campo contém informações sobre a ordem que uma determinada oferta pertence. A recíproca é falsa. A ordem em si não sabe quais ofertas pertencem a ela. Isso acontece porque, no momento da colocação da ordem não está claro quais ofertas irão executar a ordem e se a ordem será executada.

Desta forma, a causalidade ou determinismo de ações é observado. Ofertas são vinculadas as ordens e as ordens sao vinculadas umas as outras. Tal estrutura é apresentada como uma única lista correlacionada.

Ofertas executadas na abertura da ordem geram uma posição clássica em MetaTrader 5 e as ofertas que pertencem a uma ordem de fechamento no sentido contrário, encerram esta posição. Estes pares são apresentados na figura abaixo:

Fig. 4. Diagrama de uma relação entre ordens, ofertas e a bolsa de valores

Fig. 4. Diagrama de uma relação entre ordens, ofertas e a bolsa de valores

Nós retornaremos para a análise detalhada deste diagrama, pois o sentido das relações é muito importante na construção de um sistema estritamente determinado de gravação das ações do trader que é o HedgeTerminal.


1.3. Relação das Posições Líquidas do Terminal MetaTrader 5 e as Posições do HedgeTerminal

Do ponto de vista do HedgeTerminal, duas ordens opostas com os mesmos volumes pode ser duas posições diferentes. Neste caso, a sua posição líquida será zero. É por isso que o HedgeTerminal não usa informações sobre as posições líquidas de fato abertas no MetaTrader 5, portanto, posições no HedgeTerminal não estão relacionadas com as posições no MetaTrader 5. O único momento em que as posições líquidas atuais são verificadas é no lançamento HedgeTerminal. Os volumes totais das posições ativas opostas devem ser idênticas aos valores das posições líquidas de fato.

Neste caso, um aviso como ponto de exclamação dentro de um quadro aparece na HedgeTerminal, Posições não são iguaisindicando que as posições no HedgeTerminal e no MetaTrader 5 não são iguais. Esta assimetria não afeta a eficiência do HedgeTerminal, embora para trabalho posteriores será eliminado.

Na maioria dos casos, pode aparecer quando os usuários cometem erros editando os arquivos excluídos das ordens, ExcludeOrders.xml, embora a corrupção da ordem e o histórico das ofertas no servidor também podem causar o surgimento deste sinal. Em qualquer caso, estas discrepâncias podem ser removidas pelo mecanismo de exclusão aplicado através do arquivo ExcludeOrders.xml.


1.4. Requisitos dos Algoritmos que Implementam a Negociação Bidirecional

Exigências bastante rigorosas são impostas sobre os algoritmos de execução de negociação bidirecional. Elas devem ser atendidas no desenvolvimento do HedgeTerminal. Caso contrário, o HedgeTerminal iria rapidamente se transformar num programa de trabalho estocástico. O programa seria "uma solução com a mesma probabilidade de operar ou falhar".

Abaixo estão alguns requisitos específicos para o seu desenvolvimento:

  1. A representação das posições bidirecionais dos traders deve ser confiável. Qualquer idéia implementada no HedgeTerminal não deve levar a ambiguidade ou possíveis erros na lógica dos negócios. Se alguma propriedade ou oportunidade não cumprir estes requisitos, então esta idéia não será utilizada, apesar da sua conveniência e a demanda por ela;
  2. Todos os algoritmos devem basear-se no ambiente de negociação MetaTrader 5, tanto quanto possível. Armazenamento de informações adicionais nos arquivos é permitido nos casos em que seja estritamente necessário. Os algoritmos de virtualização devem receber a maior parte das informações do ambiente de negociação. Esta propriedade aumenta o nível total de confiabilidade, pois a maioria das alterações são transmitidas por meio do servidor e portanto acessíveis a partir de qualquer ponto do mundo;
  3. Todas as ações sobre a transformação do ambiente de negociação devem ser realizadas nos bastidores. A configuração complexa e inicialização da API da biblioteca HedgeTerminal não deve ser exigida. Um usuário deve poder iniciar o aplicativo "fora da caixa" e receber o resultado esperado;
  4. O painel visual do HedgeTerminal deve estar contido na interface geral do MetaTrader 5, com opções de ferramentas visuais simples e compreensíveis para o trabalho com as posições bidirecionais familiares para todos os usuários MetaTrader 4 e 5. Em outras palavras, o painel visual deve ser intuitivamente claro e simples para todos os usuários;
  5. O painel visual de HedgeTerminal deve ser concebido levando em consideração os elevados requisitos dos traders. Por exemplo, o painel deve ser configurável pelo usuário, podendo mudar sua aparência e até mesmo adicionar módulos personalizados;
  6. Ele deve fornecer uma interface intuitiva e simples (API) do programa para interações com Experts externos. A parte do programa de interações entre Experts externos e os algoritmos HedgeTerminal deve caber perfeitamente no padrão existente da interação de programa dos Experts personalizados com as funções do sistema MetaTrader 4/5. Na verdade, a API HedgeTerminal parece ser um híbrido das APIs do MetaTrader 4 e MetaTrader 5;
  7. HedgeTerminal deve assegurar um trabalho de confiança no ambiente de bolsa de valores, tendo em conta todas as nuances da execução das ordens da bolsa. HedgeTerminal é escrito com base no artigo "Princípios da Precificação da Bolsa Tomando Como Exemplo o Mercado de Derivativos da Bolsa de Moscou". Inicialmente, este artigo foi parte de um longo artigo sobre HedgeTerminal, onde mais tarde foi dividido em vários artigos independentes por causa do volume. O HedgeTerminal é a implementação do programa das idéias discutidas neste artigo.

Muitas destas ideias não estão completamente ligadas umas as outras. Por exemplo, existem tantas informações na bolsa a serem refletidas na negociação que são difíceis de conectar com a simplicidade da informação neste artigo.

Outra dificuldade foi criar um painel de fácil uso aos traders inexperientes e, ao mesmo tempo, proporcionar amplas oportunidades para os traders de algorítmos profissionais. No entanto, na avaliação do resultado final, achamos que essas propriedades exclusivas foram mutuamente implementadas com sucesso no HedgeTerminal.


Capítulo 2. Instalação de HedgeTerminal, primeiro lançamento

2.1. Instalação do HedgeTerminal

Sabemos que todas as ordens executadas no HedgeTerminal são consideradas como posições. Posições consistem em duas ordens emparelhados, que fazem uma posição histórica fechada, ou uma ordem não vinculada, o que torna uma posição aberta ou ativa

Se antes do HedgeTerminal ser instalado, houver algumas ações sobre a conta de negociação e o histórico de negociação contém uma grande quantidade de ordens executadas, então no ponto de vista do HedgeTerminal todas estas ordens serão posições abertas, pois não foram criados links entres elas. Não importa se o histórico conta contém 2-3 ordens executadas. Se existirem milhares delas, o HedgeTerminal vai gerar milhares de posições abertas. O que se pode fazer com elas? Estas ordens podem ser "fechadas" por meio de ordens opostas contendo links para as ordens iniciais através do HedgeTerminal. Existe um lado negativo também. Se no momento da instalação do HedgeTerminal existem muitos delas, pode quebrar o trader, pois a taxa de corretagem e despesas de deslizamento devem ser pagos.

Para evitar esta situação, o HedgeTerminal inicia um assistente de instalação dedicado no início da instalação, onde são sugeridas várias soluções para este problema. Para lançar o HedgeTerminal, solicite este assistente e descreva o trabalho em detalhe. Por que baixar e instalar o HedgeTerminalDemo no Mercado MetaTrader 5?

Semelhante ao HedgeTerminalUltimate, tem a forma de um Expert Advisor e tudo o que tem de fazer é anexar no gráfico, arrastando o ícone disponível na pasta "Navegador".

Arrastando este ícone abrirá uma janela padrão sugerindo anexar o Expert Advisor no gráfico:


Fig. 5. A janela HedgeTerminal antes de anexar

Nesta fase, é suficiente definir a caixa "Allow AutoTrading", permitindo que a EA execute ações de negociação. O HedgeTerminal vai seguir suas ordens, uma vez que não tem uma lógica própria de negociação, para executar negociações vai necessitar da sua permissão.

Para qualquer Expert Advisor iniciar uma negociação, a autorização geral para a negociação através do Expert Advisors deve estar habilitada no painel, além da permissão pessoal para negociação no MetaTrader 5.

Fig. 6. Ativação de negociação automática

Fig. 6. Ativação de negociação automática

HedgeTerminal foi projetado para que o usuário pudesse evitar uma configuração longa e complexa.

É por isso que todas as configurações disponíveis são incluídos em um arquivo de texto XML especial. O único parâmetro explícito para HedgeTerminal é o nome real destes arquivo de configurações:

Fig. 7. Configurando janela do painel do HedgeTerminal

Fig. 7. Configurando janela do painel do HedgeTerminal

A natureza destas configurações e a maneira de alterá-las serão discutidas mais tarde.

Depois de pressionar "OK", o assistente de instalação HedgeTerminal é anexado sugerindo iniciar o processo de instalação. O processo de instalação vai criar alguns arquivos no diretório compartilhado para os terminais MetaTrader 4 e MetaTrader 5.

O HedgeTerminal solicita permissão para instalar esses arquivos:


Fig. 8. Diálogo de início da instalação

Se você não quer que os arquivos sejam instalados no seu computador, clique em "Cancelar". Neste caso, o HedgeTerminal vai finalizar o trabalho. Para continuar a instalação, clique em "OK".

A aparência da caixa de diálogo seguinte dependerá da conta que você anexar o HedgeTerminal. Se não existem operações sendo executadas na conta de negociação, então o HedgeTerminal vai completar o processo.

Se algumas negociações já foram executadas, o HedgeTerminal irá exibir o seguinte diálogo:


Fig. 9. Caixa de diálogo do primeiro lançamento do HedgeTerminal

Na figura acima,o HedgeTerminal identificou cinco ordens ativas. Essas ordens não fazem um par com uma ordem fechadada, então do ponto de vista ddo HedgeTerminal, são posições ativas.

O HedgeTerminal vai sugerir várias opções:

  1. Excluir essas ordens do HedgeTerminal: "You can hide them in HedgeTerminal... To hide these orders, click 'YES' and go into the next step" ("Você pode ocultá-las no HedgeTerminal...Para ocultar essas ordens, clique em 'SIM' e vá para o próximo passo") . Se você escolher esta opção e pressionar "YES", o HedgeTerminal vai colocar as ordens numa lista específica e a partir de então não vai contabilizar para agregar na posição líquida bem como no resultado financeiro. Estas ordens podem ser colocadas na lista somente se não houverem posições líquidas abertas no momento. Se você tem uma posição aberta ou vários ativos, o HedgeTerminal vai chamar uma caixa de diálogo adicional sugerindo o fechamento das posições existentes.
  2. Ou deixar as ordens como estão e fechá-las mais tarde, se necessário: "You can… close manually later... Click 'No' if you want close these orders manually later. In this case, you have to perform 5 trades of opposite direction" ("Você pode ... fechar manualmente mais tarde ... Clique em 'Não' se você quiser fechar essas ordens manualmente mais tarde.Neste caso, você tem que executar cinco ordens na direção oposta"). Pressionando "No" ("Não"), o HedgeTerminal lançará todas estas ordens na guia "Active" (ou seja, posições ativas). Mais tarde estas ordens podem ser fechadas com outras ordens através do painel HedgeTerminal. Depois das posições serem fechadas, elas serão transferidas para a guia "History" (posições históricas). Se essas ordens são em grande número, então é melhor ocultá-las do que fechar todas as ordens executadas novamente e pagar taxas de corretagem.
  3. Você pode parar a instalação: "If you are not ready continue press Cancel. In this case HedgeTerminal complete its work" ("Se você não está pronto para continuar, pressione Cancelar. Neste caso, o HedgeTerminal finaliza o trabalho"). Se você escolher esta opção e pressionar "Cancelar", o HedgeTerminal vai finalizar trabalho.

Se não há posições ativas no tempo em que o HedgeTerminal é instalado, a instalação será interrompida nesta fase.

Se você tiver selecionado a segunda opção e existem uma ou várias posições abertas, o HedgeTerminal vai chamar uma caixa de diálogo adicional que sugere o fechamento das posições:


Fig. 10. Diálogo sugerindo para fechar posições líquidas automaticamente

O HedgeTerminal solicita o fechamento de todas as posições existentes, todas as ordens executadas devem ser colocadas na lista de ordens excluídas. Se não existirem posições líquidas, então qualquer ordem inicializa uma nova posição líquida. Neste caso a direção e o volume são os mesmos no HedgeTerminal e que assegura a sincronização das posições líquidas com as posições totais no HedgeTerminal.

O HedgeTerminal pode fechar automaticamente todas as posições líquidas para você: "The HedgeTerminal can automatically close all active positions". Se isso é aceitável para você, pressione "OK". Neste caso, ele vai tentar fechar posições e se for bem sucedido irá finalizar o trabalho. Se as posições não podem ser fechadas por algum motivo, ele irá abrir a caixa de diálogo para fechamento manual da posição. Se você selecionar o fechamento manual da posição , "Click 'Cancel' if you want to close a position manually", pressione "Cancel".

A caixa de diálogo é chamada quando o fechamento manual foi escolhido na caixa de diálogo anterior ou quando é impossível o fechamento automático da posição.


Fig. 11. Diálogo sugerindo o fechamento manual das posições líquidas

Neste ponto todas as posições ativas serão fechadas manualmente através do MetaTrader 5 ou instalação deve ser cancelada pressionando "Cancel". Depois de todas as posições estarem fechadas, pressione "Retry" ("Repetir").


2.2. Três Etapas da Instalação. Diagrama de Instalação e Solução de Possíveis Problemas

Simplificando o processo de instalação para três passos:

  1. Antes de instalar HedgeTerminal, feche todas as posições líquidas ativas no terminal MetaTrader 5;
  2. Abra o HedgeTerminal no gráfico e pressione "Yes" na janela que aparecerá para iniciar a instalação. O HedgeTerminal irá instalar todos os arquivos necessários para o seu funcionamento;
  3. Se for exibida uma próxima janela, selecione a segunda opção e pressione "Yes". Neste caso posições ativas não aparecem quando o HedgeTerminal for lançado e as informações sobre as ordens executadas anteriores serão transferidas automaticamente para o arquivo ExcludeOrders.xml, assim não existirão posições ativas que exigirão o fechamento.

A maneira mais simples para descrever: feche todas as posições antes de lançar Hedge Terminal e entao pressione "Yes" duas vezes no assistente de instalação do HedgeTerminal.

O padrão completo do assistente de instalação é representado no diagrama abaixo. Ele vai ajudar a responder suas perguntas e executar a instalação corretamente:


Fig. 12. Assistente de Instalação

Qual ação se a instalação não foi realizada corretamente ou é necessário excluir o HedgeTerminal do computador? Na instalação incorreta, simplesmente apague todos os arquivos instalados. Para isso, vá até a pasta onde as informações do programa MetaTrader são compartilhadas (como regra este está localizado em: c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\). Para excluir informações sobre a instalação do HedgeTerminal de todas as contas, encontre a pasta "HedgeTerminal" neste diretório e a exclua. Se você quiser excluir informações sobre a instalação do HedgeTerminal apenas de uma determinada conta, vá para o diretório \HedgeTerminal\Brokers e selecione a pasta que contém o nome da corretora e o número de conta. Exclua esta pasta. Quando o assistente de instalação for reiniciado novamente, o HedgeTerminal é iniciado nesta conta.

Instalação no terminal conectado em conta que já trabalha com HedgeTerminal. Pode acontecer que seja necessário instalar o HedgeTerminal no terminal onde já existe uma conta do HedgeTerminal trabalhando. Como você já sabe, o processo de instalação consiste em criar e configurar os arquivos do sistema. Se todos esses arquivos já são criados em outro computador e configurado corretamente, então não há necessidade de instalar o HedgeTerminal. Como regra geral, esses arquivos são armazenados em c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Basta levar essa pasta para o mesmo local em seu computador, depois de copiar o diretório, inicie HedgeTerminal novamente, o assistente de instalação não será chamado, pois todos os arquivos estão presentes e configurados. As posições ativas serão semelhantes à exibição em outros computadores e terminais.

Instalação de HedgeTerminalAPI e usando a biblioteca no modo de teste. O HedgeTerminal é implementado como um painel visual e como uma biblioteca com funções de programa - HedgeTerminalAPI. A biblioteca contém um assistente de instalação similar chamado no primeiro lançamento de HedgeTerminalAPI em tempo real. Na primeira chamada de qualquer função, o Expert irá mostrar uma Caixa de Mensagens sugerindo iniciar a instalação. O usuário fechará todas as posições antes de chamar o HedgeTerminalAPI e executará a instalação em três etapas.

Não é necessário instalar o HedgeTerminal ao lançar a biblioteca no modo de teste. No modo teste, o Expert inicia cada vez que executar uma nova conta virtual, não há nenhuma necessidade de ocultar ordem previamente executada e instalar arquivos. As configurações armazenadas no arquivo Settings.xml podem ser definidas gramaticalmente na biblioteca através da chamada das funções relevantes.


2.3. Começando com o HedgeTerminal, Primeiro Lançamento

Depois que o HedgeTerminal instalou todos os arquivos necessários para o seu trabalho, ao ser anexado no gráfico vai exibir seu painel:

Fig. 13. Primeiro lançamento de HedgeTerminal, aparência

Fig. 13. Primeiro lançamento de HedgeTerminal, aparência

Como todos as ordens existentes estão ocultas, não são exibidas posições ativas. O painel superior contém um botão de menu, no lado da mão esquerda e ícones dedicados que indicam o estado do painel. Os botões têm as seguintes funções:

  • — indicar que o painel da versão demo está anexado. Não negocia em contas reais e mostra as posições apenas nos ativos AUDCAD e VTBR*. Neste modo, o histórico de posições é limitado as últimas 10 posições fechadas.
  • — Indicar que as posições no HedgeTerminal não são iguais a posição líquida total no MetaTrader 5. Este não é um erro crítico, mas é obrigado a ser eliminado.
  • — O ícone significa que a negociação é impossível. Passe o mouse sobre este ícone e a janela pop-up mostra o problema. Possíveis razões: nenhuma conexão com o servidor; o Expert Advisor está proibido de negociar; negociação com Expert Advisors não é permitida no MetaTrader 5.
  • — Um ícone indicando que a negociação é permitida; o HedgeTerminal pode executar qualquer ação de negociação.

Agora, quando o HedgeTerminal é anexado e está pronto para funcionar, realize algumas negociações e veja como elas são exibidas. As ações de negociação devem ser executadas no ativo AUDCAD. Não deve haver qualquer posição líquida aberta, pois somente assim a instalação do HedgeTerminal será bem sucedida. Do contrário feche todas as posições ativas.

Se HedgeTerminal é anexado em uma conta ligada à Bolsa de Moscou, a negociação deve ser executado mercado futuro do grupo VTBR*, por exemplo VTBR-13.15 ou o VTBR-06.15. Como uma ilustração, comprando a lote 0.4 do AUDCAD pelo preço corrente através da janela padrão "NewOrder". Em alguns instantes, a ordem e a oferta são executadas, irá aparecerá no histórico da ordem do terminal assim:

Fig. 14. Histórico da ordem e sua oferta no MetaTrader 5

Fig. 14. Histórico da ordem e sua oferta no MetaTrader 5

A guia de posições ativas MT5 conterá uma posição comprada correspondente a lote 0,4:

Fig. 15. Posição de rede líquida ativa no MetaTrader 5

Fig. 15. Posição de rede líquida ativa no MetaTrader 5

Ao mesmo tempo, HedgeTerminal irá apresentar o histórico da ordem como uma posição ativa:

Fig. 16. Posição ativa bidirecional no HedgeTerminal e sua oferta

Fig. 16. Posição ativa bidirecional no HedgeTerminal e sua oferta

Como podemos ver, os resultados são os mesmos, uma posição no HedgeTerminal é correspondente a uma posição líquida no terminal MetaTrader 5.

Por favor, preste atenção que além de a ordem, a posição no HedgeTerminal contém uma oferta (deal) que executou esta posição (para ver isso, maximizar a seqüência de posição pressionando )

Uma parte da posição ativa pode ser oculta, para isto simplesmente digite um novo valor de volume no campo "Vol". O novo volume deve ser menor do que o atual. A diferença entre o atual e os novos volumes serão cobertos pela nova ordem que forma uma posição histórica e será exibida na guia correspondente ao histórico. Digite o valor de 0,2 neste campo e pressione Enter. O volume da posição ativa vai ser 0,2 e a guia do histórico mostrará a primeira operação com o volume de 0,2 lote (0.4 - 0.2 = 0.2):

Fig. 17. Posição histórica bidirecional no HedgeTerminal

Fig. 17. Posição histórica bidirecional no HedgeTerminal


Em outras palavras, nós fechamos metade da nossa posição ativa. O resultado financeiro comum da posição histórica e ativa será idêntico ao resultado no terminal MT5.

Agora vamos fechar o resto da posição ativa. Para isso pressione o botão (fechar) no HedgeTerminal:

Fig. 18. Botão fechar para uma posição bidirecional no HedgeTerminal

Fig. 18. Botão fechar para uma posição bidirecional no HedgeTerminal

Após este botão ser pressionado, a posição remanescente será fechada pela ordem inversa e transferida para a guia do histórico, Desta forma, as posições ativas (tanto no MetaTrader 5 e no HedgeTerminal) serão fechadas.


2.4. Hedging e Cálculo de Operações Financeiras

Nesta seção, vamos descrever os métodos de trabalho com o HedgeTerminal usando várias posições bidirecionais como exemplo.

Neste momento não podemos ter qualquer posição ativa. Agora abra uma nova posição de venda com o volume de lote a 0,2 no AUDCAD. Basta abrir a janela de diálogo "new order" e colocar uma ordem correspondente. Após a posição ter sido aberta, bloqueie-a pela posição oposta - venda a lote 0,2 através do terminal MetaTrader 5.

Desta vez o resultado das negociações no HedgeTerminal e no terminal MetaTrader 5 são diferentes. O HedgeTerminal exibe duas posições:

Fig. 19. Posições bidirecionais opostas no HedgeTerminal (bloqueio)

Fig. 19. Posições bidirecionais opostas no HedgeTerminal (bloqueio)

No MetaTrader 5 elas não estão totalmente presente:

Fig. 20. Ausência de uma posição líquida ativa no terminal MetaTrader 5

Fig. 20. Ausência de uma posição líquida ativa no terminal MetaTrader 5

Vamos avaliar o resultado, 4 ofertas foram executadas. Eles estão na moldura vermelha na imagem abaixo:

Fig. 21. Resultado das ofertas executadas no MetaTrader 5

Fig. 21. Resultado das ofertas executadas no MetaTrader 5

Coloque estas ofertas numa tabela:

TipoDireçãoPreçoVolumeLucro, pips
comprar   dentro0,980880,2
venda   fora0,980890,21
comprar   dentro0,982070,2
venda   fora0,982080,21

Tabela 1. Ofertas exibidas no terminal MetaTrader 5

É óbvio que dois pontos foram obtidos em 4 ofertas. O valor de cada ponto é de aproximadamente 0.887 dólares quando negociado um lote. Assim, o resultado financeiro é de 0,18 dólar por posição (0.887 * 0,2 * 1) ou 34 centavos para ambas as posições. A coluna "Lucro" mostra que este resultado está correto. O lucro líquido é de 34 centavos.

Agora olhe para o resultado no HedgeTerminal:

 Fig. 22. Resultados históricos das posições bidirecionais no HedgeTerminal

Fig. 22. Resultados históricos das posições bidirecionais no HedgeTerminal

No início, eles parecem diferir significativamente. Vamos calcular o resultado para as nossas duas posições bidirecionais:

DireçãoPreço de entradaPreço de saídaLucro, pipsLucro, $
comprar0,980880,982080.0012021,28
venda0,980890,98207-0.00118-20,92

Tabela 2. Exibindo posições no HedgeTerminal

A diferença entre eles é de 0.34$ (21,28$ - 20,92$), exatamente o mesmo o resultado obtido na negociação líquida.


2.5. Negociar a Um Clique

O HedgeTerminal emprega um sistema de gestão peculiar. Baseia-se na inserção direta dos valores necessários para o campo de posição ativa. Não há gestão alternativa.

Por exemplo, para colocar a Perda Máxim (Stop Loss) para uma posição ativa, basta digitar o valor desejado no campo StopLoss e pressionar Enter:

Fig. 23. Entrada do nível de Perda Máxima (StopLoss) diretamente para a tabela

Fig. 23. Entrada do nível de Perda Máxima (StopLoss) diretamente para a tabela

Da mesma forma um trader pode modificar o volume, coloque Lucro Máximo (TakeProfit) ou modificar o seu nível, mudando o comentário inicial.

Em geral, a linha de posição no HedgeTerminal é semelhante a posição apresentada no MetaTrader 4/5. As colunas do quadro com as posições têm nomes e valores idênticos aos usados nos terminais MetaTrader. Há diferenças também, uma posição no HedgeTerminal tem dois comentários enquanto que uma posição MetaTrader tem apenas um comentário. Isto significa que uma posição no HedgeTerminal é formado por duas ordens e cada uma delas tem o seu próprio campo de comentário. Como HedgeTerminal não usar estes comentários para armazenar informação técnica, é possível criar uma posição com um comentário para abertura e fechamento.

O HedgeTerminal apresenta uma oportunidade de adicionar colunas que não são exibidas pelo padrão. Por exemplo, uma coluna exibe o nome do Expert Advisor que abriu a posição. A seção dedicada à configuração do arquivo Settings.xml descreve como fazer isto.


2.6. Colocar Perda Máxima (StopLoss), Lucro Máximo (TakeProfit) e Mover Perda (Trailing Stop)

O HedgeTerminal permite fechar posições pelos níveis de Perda Máxima (StopLoss) ou Lucro Máximo (TakeProfit).

Para ver como isso acontece, coloque níveis Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) na posição ativa, entao aguarde um desses níveis disparar. No nosso caso o Lucro Máximo é acionado. Ele fechou a posição e foi movido para o histórico das transações:

Fig. 24. Posição bidirecional do Histórico e seus níveis de Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit)

Fig. 24. Posição bidirecional do Histórico e seus níveis de Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit)

A marca verde no nível Lucro Máximo (TakeProfit) indica o acionamento da meta e a posição fechada nesse nível. Uma posição também possue a informação sobre o nível de Perda Máxima, da mesma forma se for disparado, então a célula Perda Máxima será destacada na cor rosa e o Lucro Máximo não será colorido.

O HedgeTerminal suporta Mover Perda (TrailingStop) e versões futuras permitirão gravar um módulo personalizado específico que contém a lógica da execução da Perda Máxima (Stop Loss). Atualmente, o trabalho com o Mover Perda (trailing stop) no HedgeTerminal é diferente do similar no terminal MetaTrader. Para ativá-lo é necessário entrar no nível Parar Perda na célula "StopLoss" da posição correspondente. Quando a Perda Máxima é colocada, a opção de mover o preço podem ser realizada através da célula marcada com um sinal :

Fig. 25. Colocar Mover Perda (trailing stop) no HedgeTerminal

Fig. 25. Colocar Mover Perda (trailing stop) no HedgeTerminal

Depois de sinalizar, o HedgeTerminal corrige a distância entre o preço atual e o nível da Perda Máxima. Se ela aumenta, a Perda Máxima seguirá o preço, de forma que a distância permanece a mesma.

No HedgeTerminal, a Perda Máxima (StopLoss) é implementado com as ordens de Compra Limitada (BuyStop) e Venda Limitada (SellStop). Cada vez que uma Perda Máxima é colocada, uma ordem correspondente com um número mágico conectado com a posição ativa é colocada também. Se esta ordem pendente é excluída no terminal MetaTrader, então o nível de Perda Máxima no HedgeTerminal desaparecerá. Alterando o preço da ordem pendente vai provocar a mudança da Perda Máxima no HedgeTerminal.

O Lucro Máximo (TakeProfit) funciona um pouco diferente. Ele é virtual e ele oculta seu nível de disparo da corretora. Isso significa que HedgeTerminal fecha uma posição no Lucro Máximo (TakeProfit) automaticamente. Portanto, se você quiser que o seu Lucro Máximo dispare, mantenha seu HedgeTerminal em funcionamento.


2.7. Geração de Relatórios

O HedgeTerminal permite salvar as informações sobre suas posições bidirecionais para arquivos designados, os quais podem ser carregados para análise através de programas estatísticos de terceiros, por exemplo, o Microsoft Excel.

Atualmente o HedgeTerminal não tem um sistema de análise e estatísticas, esse recurso é especialmente importante. No momento, apenas um formato de relatório é suportado - CSV (Vírgula para Separar Valores). Vamos ver como isso funciona. Para salvar as posições bidirecionais no arquivo CSV, selecione a opção "Save CSV Report" no menu após abertura do HedgeTerminal no gráfico:


Fig. 26. Salvando um relatório através do menu "Save CSV Report"

Depois de selecionar os pontos no menu, o HedgeTerminal vai gerar dois arquivos no formato CSV. Um deles irá incluir a informação sobre as posições ativas e outra sobre o histórico, posições concluídas. A razão pela qual dois arquivos diferentes são gerados é porque cada um deles tem um conjunto diferente de colunas. Além disso, o número de posições ativas pode variar constantemente, então é mais conveniente analisá-los separadamente. Os arquivos gerados estão disponíveis por um caminho relativo .\HedgeTerminal\Brokers\<Broker's name - account number>\ . Deve haver dois arquivos no final: History.csv e Active.csv. O primeiro contém informações sobre as posições históricas e o segundo sobre as posições ativas.

Os arquivos podem ser carregados nos programas estatísticos para análise. Vejamos este procedimento usando o Microsoft Excel como exemplo. Escolha o programa e selecione "Data" --> "From the text". No assistente de exportação de dados apareceu selecionar o modo com os separadores. Na janela seguinte, selecione ponto e vírgula como separador. Pressione "Next". Na janela seguinte, altere o formato geral da representação do número de ponto flutuante. Para fazer isso, pressione "Details". Na próxima janela, selecionar o caráctere de período como um separador do inteiro e partes fracionárias:

Fig. 27. Exportar o relatório CSV para o Microsoft Excel

Fig. 27. Exportar o relatório CSV para o Microsoft Excel

Pressione "ОК" e depois em "Finish". A tabela aparecerá contendo informações sobre as posições ativas:

Fig. 28. Informações sobre as posições ativas exportadas para o Excel

Fig. 28. Informações sobre as posições ativas exportadas para o Excel

Os dados sobre as posições históricas podem ser carregados na próxima folha da mesma maneira. O número de colunas será correspondente ao número de colunas no HedgeTerminal. Se uma das colunas é excluída no painel do HedgeTerminal, ela não será incluída no relatório. Esta é uma forma prática de formar um relatório com base apenas nos dados necessários.

As versões futuras do programa permitirão salvar os relatórios nos formatos XML e HTML. A ideia e um relatório semelhante ao padrão no MetaTrader 5, embora consistirá de posições bidirecionais concluídas.


2.8. Apresentação do Valor Swap de Moeda

Swap de moedas é uma combinação de duas ofertas de conversão bidirecional para o mesmo montante com diferentes datas de avaliação.

Em palavras simples, o swap é uma operação de derivativo provisionando a diferença das taxas de juro pagas para o câmbio de duas moedas formando uma posição líquida.

Não existe histórico de posições líquidas no MetaTrader 5. Existe o histórico das ordens e ofertas que se formaram e o histórico do fechamento das posições líquidas. Como não existe o histórico das posições, o swap é atribuído a ordem que fecha uma posição no histórico:

 Fig. 29. Swap de moeda como uma transação independente

Fig. 29. Swap de moeda como uma transação independente

Seria mais preciso apresentar o swap como uma operação derivativa independente, mostrando o resultado da posição líquida.

A versão atual do HedgeTerminal não suporta esta representação de swap, as versões futuras contarão com tal opção. Um swap será exibido como uma posição na guia do histórico de posição. O identificador de swap será correspondente ao identificador da posição líquida que foi provisionado, irá incluir o nome do par de moedas e seu resultado financeiro.


2.9. Linha Final de Informações

Semelhante ao MetaTrader, o HedgeTerminal exibe a linha final na tabela com informações comuns para toda a conta. Essas informações e seus valores estão listadas abaixo:

    Balance — Saldo total. Similar ao "Lucro" na janela de posições ativas do terminal MetaTrader. Não leva em conta a flutuação do lucro ou perda das posições abertas.
    Floating P/L — Flutuação do lucro/perda. Esta informação é igual à soma do lucro de todas as posições ativas no momento.
    Margin — é a margem comprometida dos fundos do saldo da conta em porcentagem. Pode variar de 0% até 100%. Indica o peso das operações sobre o depósito.
    Total P/L — Contém a soma total de todos os lucros e perdas para as posições fechadas.
    Pos.:# — Exibe o número de posições no histórico.

Para uma exibição correta da Linha Final de Informações, é necessário adicionar a fonte "Arial Rounded MT Bold" no sistema.


2.10. Alterando a Aparência das Tabelas do HedgeTerminal

Como mencionado antes, o HedgeTerminal tem apenas um parâmetro explícito na janela de propriedades do Expert. Isto é assim porque as configurações do HedgeTerminal não pode ser colocadas na janela das configurações do Expert. elas são muito específicas. É por isso que todas as definições são colocadas no arquivo de configuração Settings.xml. Para cada versão anexada do HedgeTerminal, existe o seu próprio arquivo "settings". Isso dá uma oportunidade para configurar individualmente cada versão anexada do HedgeTerminal,

porém atualmente não é permitido editar este arquivo através das janelas visuais de configurações. Portanto, a única maneira de alterar a aparência do HedgeTerminal é editar o arquivo manualmente. O arquivo de configurações está configurado por padrão no modo ideal, portanto normalmente não há necessidade de editar o conteúdo, mas pode haver situações em que tal edição seja necessária para um ajuste fino e personalização da aparência do painel. Por exemplo, quando um arquivo for editado, colunas desnecessárias podem ser apagados ou, pelo contrário, as colunas não exibidas por padrão podem ser adicionadas.

Vamos ver o conteúdo deste arquivo e como personalizá-lo. Para fazer isso, encontre este arquivo no diretório onde o HedgeTerminal instalou seus arquivos. Este diretório, como foi mencionado antes, podem ser localizado no endereço c:\Users\<your user name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. O arquivo Settings.xml deve estar localizado no interior. Abra-o com a ajuda de qualquer editor de texto:

<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.-->
<Hedge-Terminal-Settings>
        <!--This section defines what columns will be showed on the panel.-->
        <Show-Columns>
                <!--You can change the order of columns or comment not using columns.-->
                <!--You can change the value of 'Width' for a better scaling of visual table.-->
                <!--You can change the value of 'Name' to install your column name.-->
                
                <!--This columns for tab 'Active'-->
                <Active-Position>       
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="80"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="EntryPrice" Name="EntryPrice" Width="50"/>
                        <Column ID="TralStopLoss" Name="TralSL" Width="20"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="CurrentPrice" Name="Price" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="60"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="100"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="100"/>
                </Active-Position>
                <!--This columns for tab 'History'-->
                <History-Position>
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="40"/>
                        <Column ID="EntryPrice" Name="Entry Price" Width="50"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="ExitPrice" Name="Exit Price" Width="50"/>
                        <Column ID="ExitDate" Name="Exit Date" Width="110"/>
                        <Column ID="ExitID" Name="Exit ID" Width="80"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="50"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="90"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="90"/>
                </History-Position>
        </Show-Columns>
        <Other-Settings>
                <Deviation Value="30"/>
                <Timeout Seconds="180"/>
                <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. -->
                <RefreshRates Milliseconds="200"/>
        </Other-Settings>
</Hedge-Terminal-Settings>

Este arquivo contém um documento especial escrito em linguagem de programação XML (eXtensible Markup Language), descrevendo o comportamento e a aparência do HedgeTerminal.

A principal coisa a fazer antes do início da edição é um backup, no caso do arquivo ser acidentalmente danificado. O arquivo tem uma estrutura hierárquica e consiste em várias seções fechadas em si. A seção principal é chamada de <Hedge-Terminal-Settings> e contém duas seções principais: <Show-Columns> e <Other-Settings>. A primeira seção ajusta as colunas apresentadas e sua largura condicional e a segunda seção tem as definições para o próprio painel e a biblioteca HedgeTerminalAPI.

Alterando o tamanho e o nome das colunas. Seção<Show-Columns> e sua estrutura. Essencialmente, esta seção contém dois conjuntos de colunas: um para a tabela de posições ativas na guia "Active" e outro para a tabela do históricos das posições na guia "History".

<Column ID="Symbol" Name="Symbol" Width="70"/>

A coluna deve conter um identificador (ID="Symbol"), nome da coluna (Name="Symbol") e largura condicional (Width="70").

O identificador contém um único nome interno da coluna. Ele solicita ao HedgeTerminal como exibir esta coluna e qual o valor para colocar nela. O identificador não pode ser alterado e deve ser suportado pelo HedgeTerminal.

O nome da coluna define qual nome vai ser exibido com a tabela. Se o nome é alterado para outro, por exemplo: Name="Currency Pair", então no próximo lançamento do HedgeTerminal, o nome da coluna que exibe o símbolo vai mudar:


Fig. 30. Alteração dos nomes de coluna no painel HedgeTerminal

Esta propriedade permite a criação de uma versão localizada do painel onde o nome de cada coluna pode ser exibido no idioma de preferência, por exemplo, em russo:

 Fig. 31. Localização do painel HedgeTerminal

Fig. 31. Localização do painel HedgeTerminal

A próxima tag contém a largura condicional da coluna. A coisa é que um motor gráfico alinha automaticamente o tamanho da tabela com a largura da janela onde o painel é anexado. Quanto maior a janela, mais larga é cada coluna. É impossível criar a largura da coluna precisamente, mas as proporções podem ser especificadas pela configuração da largura da base da coluna, a largura da base é em pixels.

Se o seu ecrã é maior, então o tamanho factual da coluna é maior. Para ver como funciona a uma escala uniforme, configure a largura da coluna Symbol como 240 pixels condicionais: width = "240". Em seguida, salve o arquivo e reinicie o painel:

Fig. 32. A largura da coluna Symbol está configurado para 240 pixels.

Fig. 32. A largura da coluna Symbol está configurado para 240 pixels

A largura da coluna com símbolos tem aumentado significativamente. No entanto, deve notar-se que a sua largura foi ganha à custa da largura de outras colunas ("Entry ID"  e "Entry Date").

Outras colunas ficaram visualmente piores, os valores não cabem na largura permitida. O tamanho das colunas deve ser mudado com cuidado para encontrar o melhor tamanho para cada uma delas. As configurações padrão têm valores precisos para a maioria dos monitores e mudar seu tamanho normalmente não é necessário.

Excluindo colunas. Além de alterar os tamanhos das colunas e seus cabeçalhos, também podem ser adicionadas ou excluídas as colunas. Por exemplo, vamos tentar excluir a coluna "Symbol" da lista. Para fazer isso, basta comentar a tag da coluna no arquivo Settings.xml (em amarelo):

<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
<!-- Unset this comment if you want auto trading and want see name of your expert:
<Column ID="Magic" Name="Magic" Width="100"/>-->
<!--<Column ID="Symbol" Name="Symbol" Width="70"/>-->
<Column ID="EntryID" Name="Entry ID" Width="80"/>

Em XML, a marca <!-- content of the comment --> tem um papel de comentário. O comentário de saída da coluna deve ser localizado na tag. Após as alterações no arquivo terem sido salvas e o HedgeTerminal religado, o conjunto de colunas para o histórico das posições vai mudar. A coluna que indica o símbolo foi excluída:

Fig. 33. Excluindo a coluna Símbolo da tabela de posições ativas

Fig. 33. Excluindo a coluna Símbolo da tabela de posições ativas

Várias colunas podem ser excluídos de uma só vez.

Vamos comentar todas as colunas, exceto o nome do símbolo e do tamanho de lucro e religar o HedgeTerminal no gráfico:

Fig. 34. Excluindo colunas principais do painel do HedgeTerminal

Fig. 34. Excluindo colunas principais do painel do HedgeTerminal

Como podemos ver, a tabela HedgeTerminal foi reduzida significativamente. Deve-se ter cuidado com a exclusão de colunas, pois em alguns casos elas contêm elementos de administração das posições. Nesse caso, a coluna que permite reverter posições e visualizar suas ofertas foram deletadas. Mesmo a coluna "Profit" da tabela de posições ativas pode ser excluída, porém esta coluna contém um botão de fechamento de posição. Nesta situação, uma posição não vai será fechada enquanto estiver faltando o botão de fechar.

Adicionando colunas e exibir os nomes dos Experts. As colunas podem ser excluídas e adicionadas se programar o HedgeTerminal para trabalhar dessa forma. No futuro, um usuário poderá criar suas próprias colunas e calcular os seus próprios parâmetros. Essas colunas poderão ser criadas através de uma interface de indicador externo iCustom e do manifesto de interação com módulos de extensão, escrito em xml.

Atualmente não existe tal funcionalidade e somente as colunas suportados pelo HedgeTerminal estão disponíveis. A única coluna suportada pelo painel, mas não exibidas nas definições por padrão é a coluna que contém número mágico do Expert.

A posição pode ser aberta manualmente e também usando um robô. Neste caso, o identificador do robô que abriu uma posição pode ser exibido para todas as posições. A tag da coluna comentada inclui o número do Advisor Expert já presente no arquivo de configurações. Vamos explicar:

<Column ID="Magic" Name="Magic" Width="100"/>

Salve as alterações e religar o painel:

Fig. 35. A inclusão da coluna Mágic à tabela do HedgeTerminal

Fig. 35. A inclusão da coluna Mágic à tabela do HedgeTerminal

Como podemos ver na imagem acima, apareceu uma coluna chamada "Magic". Este é o identificador do Expert Advisor que abriu uma posição. A posição foi aberta manualmente, então o identificador é igual a zero. Uma posição aberta por um robô, como regra contém um identificador diferente de zero. Nesse caso, um número mágico correspondente ao Expert será exibido na coluna.

Embora seja mais conveniente ver os nomes dos Expert Advisors, em vez de seus números. HedgeTerminal tem esta opção, ele retira os nomes (aliases) dos EAs do arquivo ExpertAliases.xml e exibe-os em vez dos números mágicos correspondente.

Por exemplo, se você tem um Expert chamado "ExPro 1.1" e o número mágico 123847, basta colocar a seguinte tag no arquivo ExpertsAliases.xml na seção <Expert-Aliases>:

<Expert Magic="123847" Name="ExPro 1.1"></Expert>

Então quando o robô abrir uma nova posição, aparecerá o nome:

Fig. 36. Exibindo o nome do Expert na coluna Magic

Fig. 36. Exibindo o nome do Expert na coluna Magic

O número de robôs e seus nomes são ilimitados. A única condição aqui é que os seus números sejam diferentes.

Outras configurações do HedgeTerminal. Descrevemos todas as configurações disponíveis do painel visual atualmente. A próxima seção <Other-Settings> contém as configurações que definem o trabalho interno do terminal. Por favor, note que o programa chama a biblioteca HedgeTerminalAPI para usar essas configurações como valores padrão. O Expert Advisor pode alterar os valores atuais desses parâmetros usando a função especial Set.... Para obter os valores dessas configurações, o Expert somente precisa usar a funçao especial Get.... Vamos descrever as tags com configurações mais detalhadas.

<Deviation Value="30"/>

Contém o valor de desvio extremo do preço exigido em unidades de mudanças mínima de preços. Assim, para o par EURUSD cotado com cinco casas decimal, será 0,0003 pontos. Para o índice futuro RTS esse valor será de 300 pontos como o passo mínimo de mudança de preço a 10 pontos. Se o desvio de preços é maior, então a ordem de fechar ou alterar o preço não será executada, proteção contra um desvio (slippage) desfavorável.

<Timeout Seconds="180"/>

Esta tag contém o valor da resposta máxima admissível do servidor. O HedgeTerminal funciona no modo assíncrono. Isso significa que HedgeTerminal envia um sinal de negociação para o servidor sem precisar esperar para receber uma resposta posterior dele. Em vez disso, o HedgeTerminal controla a seqüência de eventos que apontam para o fato da ordem ter realizada com sucesso. O evento não pode estar em todo lugar. Esta é a razão por que é tão importante definir o período de tempo limite de espera, durante a qual HedgeTerminal estará esperando pela resposta do servidor. Se não houver nenhuma resposta durante esse tempo, a tarefa será cancelada, HedgeTerminal vai desbloquear a posição e continuar seu trabalho.

O período de tempo limite de espera pode ser encurtado ou estendido. Por padrão é de 180 segundos.

É importante compreender que na negociaçao real este limite nunca chega. Respostas aos sinais de negociação voltam rapidamente, a maioria delas são executadas dentro de 150-200 milissegundos.

Mais detalhes sobre o trabalho do HedgeTerminal e sobre as peculiaridades do trabalho no modo assíncrono podem ser encontradas na terceira parte deste artigo: "Desvendando o HedgeTerminal".

<RefreshRates Milliseconds="200"/>

Este tag configura a freqüência das atualizações do painel. Ele contém o tempo em milissegundos entre duas consequentes atualizações do painel. Quanto menor este valor, maior é a freqüência de atualização do painel e mais recursos da CP são usados. Se o seu processador não é muito poderoso e não pode lidar com a freqüência de atualização a 200 milissegundos (valor padrão), você pode aumentá-lo para 500 ou mesmo a 1000 milissegundos, editando a tag.

Neste caso, a carga da CP irá cair significativamente. Valores menores que 100 milissegundos não são recomendados. Aumentando a freqüência de atualização, a carga da CP vai aumentar de forma não linear. É importante compreender que a freqüência de atualização define as singuralidades do terminal. Algumas de suas ações são definidas por este temporizador e acontecem com uma certa velocidade.


2.11. Planejamento de Recursos Ainda Não Implementados

HedgeTerminal tem uma arquitetura flexível e não trivial aberta a novos recursos. Esses recursos ainda não foram implementadas, poderão aparecer no futuro se houver demanda. Abaixo estão os principais:

Usando esquemas de cores e peles. HedgeTerminal usa seu próprio motor gráfico que baseia-se nos gráficos primitivos como uma etiqueta rectangular ou um texto normal. Gráficos baseados em imagens não são usados em tudo. Isto dá a oportunidade para mudar a cor, o tamanho e a fonte de todos os elementos apresentados no HedgeTerminal. Desta forma, é fácil criar uma descrição de tipos de letra e o esquema de cores no lançamento do HedgeTerminal, mudando sua aparência.

Módulo personalizados para Mover Perda (trailing stop). O HedgeTerminal é na sua essência um Expert, então pode iniciar um cálculo a partir de um indicador arbitrário através de uma interface de programa específico (função iCustom()). Ele permite a chamada para o cálculo do indicador, o que depende do conjunto de parâmetros arbitrários. Mover Perdas (Trailing Stop) é um algoritmo que coloca um novo ou mantém o nível de preços, dependendo do preço atual. Este algoritmo e os seus níveis de preços podem ser implementados como um indicador. Se os parâmetros anteriores estiverem de acordo, o HedgeTerminal pode chamar o tal indicador e calcular o nível de preço exigido. HedgeTerminal pode cuidar da mecânica para Mover Perdas (trailing stop). Desta forma, qualquer usuário HedgeTerminal podem escrever seu próprio (mesmo o mais incomum) módulo de gerenciamento Mover Perdas (trailing stop).

Adicionando novas colunas para a tabela de posições. Isto inclui as colunas personalizadas. As tabelas do HedgeTerminal são projetadas de maneira a permitir a adição de novas colunas. Suporte de novas colunas podem ser programados dentro HedgeTerminal e implementado de uma forma familiar através da interface iCustom(). Cada célula na linha de uma posição representa um parâmetro (por exemplo, preço de abertura ou Lucro Máximo-Take Profit). Este parâmetro pode ser calculado por um indicador, o que significa que um número ilimitado de indicadores podem ser escritos e cada um deles calcula um parâmetro para uma posição. Se parâmetros passados são coordenadas para tais indicadores, torna-se possível adicionar um número ilimitado de colunas personalizadas para um gráfico no HedgeTerminal.

Ligação de módulos de extensão. Outros algoritmos de cálculo pode ter um mecanismo da chamada de indicador personalizado. Por exemplo, o sistema de relatório inclui uma série de parâmetros de cálculo, como a compensação esperada (payoff) e o Sharpe Ratio. Muitos destes parâmetros podem ser recebidos, movendo o seu bloco de cálculo para um indicador personalizado.

Copiando ofertas, recebimento e transmissão de ofertas de outras contas. HedgeTerminal é, essencialmente, um gerente de posição. Isso pode facilmente ser uma base para uma copiadora de ofertas, pois a principal funcionalidade já foi implementada. Tal copiadora terá capacidades não triviais para copiar posições bidirecionais MetaTrader 4 para o terminal MetaTrader 5. A copiadora irá exibir essas posições bidirecionais, como no terminal MetaTrader 4 com uma possibilidade de gerenciar todas as posições individualmente.

Relatórios e estatísticas. O gráfico Capital Líquido e a guia “Resumo". A contagem de posições bidirecionais permite analisar a contribuição para o resultado de cada estratégia. Juntamente com as estatísticas, pode ser realizada a análise de portfólio. Este relatório pode ser diferente do MetaTrader 5 e adicionado a ele. No relatório guia Resumo, além dos itens existentes: compensação esperada (payoff), rebaixamento máximo, fator de lucro, etc... outros parâmetros serão incluídos. Capital Líquido poderá ser demonstrado mediante gráficos tipo candlestick personalizados.

Classificando colunas. Normalmente, clicando o cabeçalho da tabela, as linhas são classificadas em ordem crescente ou decrescente (segunda clicada). A versão atual do HedgeTerminal não tem essa opção, bem como filtros de ofertas e configuração personalizada de colunas. Versões posteriores contarão com estas opções.

Enviando um relatório de negociação via email, FTP, notificações push. O HedgeTerminal poderá usar as funções do sistema para enviar e-mails, arquivos FTP e até mesmo enviar notificações push. Por exemplo, poderá enviar um relatório de html uma vez por dia a lista de usuários. O HedgeTerminal como um gerenciador de Expert Advisors, poderá notificar os usuários sobre as ações de outros Expert Advisors. Por exemplo, se um dos EAs abre uma nova posição, o HedgeTerminal poderá enviar uma notificação informando ao usuário que um determinado Expert executou uma nova posição. O HedgeTerminal também irá especificar a direção da entrada, a data, o tempo e volume. O próprio EA não vai precisar ser configurado, bastará adicionar o seu nome para o arquivo alias.

Filtragem de posição com um console de expressões regulares. Este é o mais poderoso dos desenvolvimentos planejados. Ela irá mostrar o trabalho de HedgeTerminal a um nível completamente novo. As expressões regulares podem ser usadas para filtrar posições históricas e ativas tão somente que satisfaçam os requisitos dos filtro exibidos. As expressões regulares podem ser combinadas e entram num console dedicado acima da tabela de posições ativas e históricas. Esta é a forma como será parecido este console nas futuras versões do HedgeTerminal:

Fig. 37. Console na versão futura do HedgeTerminal

Fig. 37. Console na versão futura do HedgeTerminal

As expressões regulares podem formar condições muito flexíveis para posições de filtragem, seguido de cálculos estatísticos sobre elas. Por exemplo, para exibir posições históricas apenas para o símbolo AUDCAD, basta inserir "AUDCAD" na célula "Symbol". As condições podem ser combinadas. Por exemplo, as posições executadas por um robô em particular poderão ser exibidas período de tempo selecionado. Tudo que você precisa fazer para isso é entrar com as condições necessárias nas células correspondentes. Após o filtro exiber os resultados, o relatório a partir da guia "Sumary" (Resumo) vai mudar de acordo com as novas condições do filtro.

As expressões regulares serão compostas por um pequeno número de operadores simples. No entanto quando usados em conjunto, permitirão criar filtros muito flexíveis.

A presença dos operadores abaixo são necessários e suficientes no console:

    Operator = - Igualdade estrita. Se a palavra AUDСAD fica inserido no campo "Symbol", então todos os símbolos que contêm este sequência, por exemplo: AUDCAD_m1 ou AUDCAD_1, serão encontrados. Isto significa que um operador de inserção implícito será usado. Igualdade Estrita "=", requer um conjunto completo da expressão, portanto todos os símbolos, exceto AUDCAD, serão excluídos. AUDCAD_m1 ou EURUSD serão excluídos.

    Operator > - Exibe apenas os valores maiores que o especificado.

    Operator < - Exibe apenas os valores menores do que o especificado.

    Operator ! – Negação lógica. Reflete apenas os valores que não são iguais ao especificado.

    Operator | - Lógica "OR". Permite a especificação de duas ou mais condições ao mesmo tempo numa fila. Para satisfazer o critério, é suficiente cumprir ao menos uma condição. Por exemplo, a expressão "> 10106825|=10106833"  inserido na célula "Entry Order" do console mostrará todas as posições com o identificador de ordem da entrada maior do que 10106825 ou igual a 10.106.833. 

    Operator & - Lógica "AND". Permite especificar duas ou mais condições numa linha ao mesmo tempo e cada uma delas tem de ser cumprida. A expressão ">10106825&<10105939" inserida na célula "Entry Order" mostra todas as posições com o identificador de entrada maior do que 10106825 ou 10105939. Posições com identificadores entre estes dois números, por exemplo 10106320, serão filtrados.

Corrigir e gerir posições usando comandos especiais. Símbolos adicionais podem ser introduzidos nas células refletindo os níveis de volume da Perda Máxima (StopLoss) e do Lucro Máximo (TakeProfit). Isso faz com que uma gestão de posição seja a mais complexa possível. Por exemplo, para fechar a metade do volume da posição atual, insira o valor "50%" correspondente a posição ativa no campo "Volume".

Em vez de colocar um valor nos níveis de Perda Máxima (StopLoss) e do Lucro Máximo (TakeProfit), coloque em percentual (1% por exemplo). O HedgeTerminal calculará automaticamente o nível de Perda Máxima (StopLoss) e do Lucro Máximo (TakeProfit), então eles serão colocados a uma distância de 1% do preço de entrada. Números com o postfix "p" poderão ser inseridos nestas células. Por exemplo, "200p" vai significar uma ordem: "colocar os níveis Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) a 200 pontos de distância do preço de entrada em posição "". No futuro, se um sinal de menos é colocado antes do volume na coluna "Volume", o volume será fechado pelo valor especificado na célula. Por exemplo, se você tem uma posição com o volume de 1,0 e queremos fechar uma parte do volume (por exemplo 0,3), então basta entrar com o valor "-0.3" na célula de volume.


Capítulo 3. Desvendando o HedgeTerminal. Especificação e Princípio de Operações

3.1. Contorno Global e Local. Contexto, Transferência e Armazenamento de Informação

A aparêcia do HedgeTerminal e o processo de negociação parece familiar ao MetaTrader 4. Isso é possível devido a virtualização e a transformação da exibição de dados, quando uma informação de negociação está disponível através do MetaTrader 5, é exibida no painel de uma forma mais prática. Este capítulo descreve os mecanismos que permitem criar esta virtualização e os mecanismos de processamento de dados do grupo.

Como você sabe, HedgeTerminal é representado por vários produtos diferentes, entre ele temos o painel visual e a biblioteca com interface do programa, o que permite implementar a gestão de posições bidirecionais em qualquer Expert Advisor externo e também integrá-lo no painel visual HedgeTerminal. Por exemplo, uma posição ativa de um EA pode ser fechada diretamente a partir do painel. O Expert Advisor irá obter as informações e processá-las em conformidade.

Aparentemente, uma estrutura deste tipo requer uma interação entre o grupo dos Expert Advisors. O painel, que é essencialmente um Expert Advisor, deve saber sobre todas as ações de negociação que se realizam. Por outro lado, cada Expert Advisor usando a biblioteca HedgeTerminal deve saber sobre ações de negociação executadas manualmente (por programas de terceiros ou utilizando o painel de HedgeTerminal).

Em geral, as informações sobre as ações de negociação podem ser recebidas a partir do ambiente de negociação. Por exemplo, quando o trader abre uma nova posição, o número de ordens é modificado. A última ordem dirá em qual ativo a posição foi aberta e para qual volume. A informação sobre ordens e ofertas é armazenada no servidor. É por isso que esta informação fica disponível para qualquer terminal conectado à conta de negociação. Ela pode ser chamada de global, pois está disponível para todos e fica distribuída através do canal global de comunicação. A comunicação com o servidor de negociação tem o formato "Pedido - resposta".

Por conseguinte, esta comunicação pode ser apresentado como um contorno global. "Contour" é um conceito da teoria dos gráficos Em termos simples, um contorno é uma linha fechada com poucos nós que interagem uns com os outros. Esta definição pode não ser suficiente, mas vamos deixar a precisão para os matemáticos. O importante para nós é apresentar o processo de negociação como uma seqüência fechada de ações.

Nem toda a informação necessária pode ser passada através do contorno global. Uma parte da informação pode não ser passada para o terminal MetaTrader 5, pois não suporta tal passagem quando esta informação não existe explicitamente. A seqüência de ações da negociação é:

  1. Um trader coloca uma ordem de compra.
  2. A ordem é executada em certo tempo.
  3. Mudanças no ambiente de negociação. A ordem executada entra na lista do histórico de ordens. A posição agrega ativos modificados.
  4. O Trader ou um Expert Advisor detecta a alteração no ambiente de negociação e toma a próxima decisão.

Algum tempo passa entre a primeira e a quarta ação. Pode ser significativo, se apenas um trader negocia na conta, ele sabe quais ações são tomadas e aguarda a resposta apropriada do servidor, porém se há mais traders ou negociações de Expert Advisors atuando na conta ao mesmo tempo, não pode haver erros de gestão.

Por exemplo, o segundo operador pode colocar uma ordem para fechar uma posição existente no tempo entre o primeiro e o quarto passo. Você pode ver um problema em potencial? A segunda ordem é realizada quando a primeira está sendo executada. Em outras palavras, uma ordem para fechar uma posição será enviada duas vezes.

Este exemplo parece ser improvável se o trader está negociando manualmente na conta sozinho e usa métodos síncronizados de colocar ordens. Quando existem vários robôs de negociaçao na conta e execução de operações de negociação independentes, há uma alta probabilidade de tais erros.

Como HedgeTerminal é um gerenciador de posição, trabalhando no modo assíncrono e garantindo trabalho paralelo simultâneo de uma série de Experts, pode estar muito próximo destes erros. Para evitar isso, HedgeTerminal sincroniza ações entre todas as suas cópias lançadas (não importa se é pela biblioteca HedgeTerminalAPI ou pelo painel visual) através do mecanismo de contorno local implementado como uma leitura multithread e mudança do arquivo ActivePositions.xml. Interação com o arquivo ActivePositions.xml é o núcleo do contorno local, a parte mais importante de HedgeTerminal. Este mecanismo é descrito abaixo

De uma forma simplista, o trabalho de HedgeTerminal focaliza a cooperação com um contorno local e global como na figura abaixo:

Fig. 38. Um regime simplificado de informações da bolsa entre o contorno global e local

Fig. 38. Um regime simplificado de informações da bolsa entre o contorno global e local

Qualquer ação de negociação (o rótulo start no diagrama) no HedgeTerminal começa com a escrita de um tag especial em ActivePositions.xml que bloqueia mais alterações da posição sendo modificada.

Após o bloco de posição ser definido e o contorno do local ter passado com sucesso, o HedgeTerminal envia uma ordem de negociação para o servidor. Por exemplo, uma contra ordem para fechar a sua posição. Em algum momento, a ordem é executada e o ambiente de negociação alterado. O HedgeTerminal processa esta mudança e detecta que o contorno global passou com sucesso e a ordem é executada. Ele desbloqueia a posição e retorna ao estado inicial (etiqueta finish no diagrama).

Não deve haver uma situação onde a ordem não pode ser executada. Neste caso o HedgeTerminal também desbloqueia a posição e faz um registro sobre o motivo da falha no registo do terminal MetaTrader 5.

Na realidade, o padrão de comunicação de informações é mais complexo. No terminal MetaTrader 5, várias cópias do HedgeTerminal podem ser executadas. Elas podem ser a biblioteca ou o painel visual. Cada cópia pode atuar como um leitor e um escritor. Quando o HedgeTerminal executa uma ação de negociação, este é um escritor porque bloqueia a posição de mudanças usando os registros do tag xml designado. Todas as outras cópias de HedgeTerminal são leitores, pois elas estão lendo o arquivo ActivePositions.xml com uma certa periodicidade e bloqueando uma posição para modificações ao se deparar com a tag de bloqueio.

Este mecanismo assegura a divulgação de informações entre os segmentos independentes, facilitando o trabalho paralelo entre vários painéis e Experts usando a biblioteca HedgeTerminalAPI.

Um diagrama realista, mostrando o trabalho de HedgeTerminal nas condições de cooperação multithread:

Fig. 39. Pdrão natural de informações da bolsa entre cópias do HedgeTerminal

Fig. 39. Pdrão natural de informações da bolsa entre cópias do HedgeTerminal

A eficiência de tal organização de dados é muito alta. As operações na leitura e escrita do arquivo ActivePositions.xml normalmente levam menos de um milésimo de segundo, enquanto que passando pelo contorno global com o envio e execução da ordem pode levar até 150-200 milissegundos. Para ver a diferença entre a escala desses valores, dê uma olhada no diagrama.

A largura do retângulo verde mostra o tempo de passagem do contorno local e a largura na cor azul é o momento da execução das ordens de negociação:

Fig. 40. Escala de tempo para fazer uma gravação do arquivo e o tempo necessário para a execução das ordens

Fig. 40. Escala de tempo para fazer uma gravação do arquivo e o tempo necessário para a execução das ordens

Como você pode ver, o retângulo verde parece mais com uma linha vertical. Na realidade, a diferença entre as escalas é ainda maior.

Operações rápidas de leitura e gravação pode facilitar um intercâmbio de dados complexos entre Experts e distribuição de sistemas de negociação de alta frequência.


3.2. Guardar as Informações Globais e Locais

Convencionalmente, todas as informações de negociação no HedgeTerminal podem ser divididas em duas partes:

  • Informação local. É armazenada nos arquivos de computador e transmitida exclusivamente através do contorno local;
  • Informação global. Essas informações são armazenadas no servidor de negociação. São passadas através do contorno global e disponibilizadas a partir de qualquer terminal ligado à conta.

Ordens, ofertas e as informações sobre a conta pertencem a informação global. Estas informações estão disponíveis através de funções específicas no terminal MetaTrader 5, como a HistoryOrderGetInteger() ou AccountInfoInteger(). O HedgeTerminal utiliza principalmente a informação destas funções. Por isto, o HedgeTerminal exibe os seguintes dados:

  • Posições ativas e históricas do HedgeTerminal;
  • Perda Máxima (StopLoss) de ordens ativas e históricos;
  • Níveis de Lucro Máximo (TakeProfit) desencadeados de posições históricas;
  • Comentário vindo de de uma posição ativa, comentários de entrada e saída de posições históricas;
  • Todas as outras propriedades de posições ativas e históricas não incluídas na lista de informações locais.

Como todas estas propriedades são globais, sua exibição é única para todas as cópias do HedgeTerminal, rodando em computadores diferentes. Por exemplo, se uma posição bidirecional é fechada num dos terminais, esta posição vai ficar fechada no outro HedgeTerminal, não importando de qual computador foi disparado o comando.

Além dos dados globais,o HedgeTerminal utiliza informação local no seu trabalho. Informações locais estão disponíveis somente dentro de um computador. Esta informação é a base das seguintes propriedades:

  • Níveis de Lucro Máximo (TakeProfit) das posições ativas;
  • Níveis de Lucro Máximo (TakeProfit) das posições históricas que não foram acionadas;
  • Comentário de saída de uma posição ativa;
  • Serviço de bandeira, bloqueando uma mudança de posição bidirecional.

Níveis de Lucro Máximo (TakeProfit) não desencadeados são armazenados no arquivo HistoryPositions.xml. O restante da informação local é armazenado no arquivo ActivePositions.xml.

Armazenamento local de dados significa que se você colocar uma posição de Lucro Máximo (TakeProfit), será visível apenas nas cópias do HedgeTerminal em execução no computador. Ninguém, exceto você vai saber deste nível.


3.3. Níveis de Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit). Questões do Sistema de Ordens e Ordens OCO (Uma cancela a outra)

No terminal MetaTrader 5, bem como no MetaTrader 4, existe um conceito de níveis Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit). São níveis de proteção do capital. Semelhante ao MetaTrader 4, uma posição é fechada quando um certo nível de perda (StopLoss) ou lucro (TakeProfit) é atingido. Em MetaTrader 4, essas perdas são ativadas para cada ordem aberta individualmente. Em MetaTrader 5, essas perdas são ativadas para toda a posição líquida agregada.

A questão é que uma posição líquida não está conectado com posições bidirecionais de Experts e particularmente no HedgeTerminal. Isso significa que os níveis regulares de Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit) não podem ser utilizados para posições bidireccionais, porém estes níveis podem ser apresentados como ordens pendentes separadas. Se você tem uma posição de venda aberta, então duas ordens pendentes irão emular o trabalho da Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit) respectivamente. Uma delas é a Venda Limitada (SellLimit) colocada acima do preço de abertura desta posição, a outra é a Stop de Venda (SellStop), colocada abaixo deste preço.

Se após a abertura, o preço atinge o nível da Venda Limitada (SellLimit), esta ordem irá fechar a posição com lucro e se o preço atinge a ordem Stop de Venda (SellStop), será fechada a posição com perda. O único inconveniente é que, depois da ordem Venda Limitada ser alcançada, a ordem Stop de Venda não vai deixar de existir e se o preço mudar de direção, esta segunda ordem pode ser atingida após a primeira.

Como não há nenhuma posição nesse ponto, desencadeando a segunda ordem, abrirá uma nova posição líquida em vez de fechar a anterior.

A figura abaixo ilustra esse problema ao protetores de perdas em posição comprada:

Fig. 41.  Emulando Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit) usando as ordens Stop de Venda (SellStop) e Venda Limitda (SellLimit)

Fig. 41. Emulando Perda Máxima (Stop Loss) e Lucro Máximo (Take Profit) usando as ordens Stop de Venda (SellStop) e Venda Limitda (SellLimit)

Para evitar essa incompatibilidade, as ordens OCO ("Uma cancela a outra") são usadas na negociação em bolsa de valores,.

Estas são duas ordens pendentes conectadas uma com a outra, quando uma é acionada, a outra é cancelada. No nosso exemplo, depois de uma ordem acionada, a segunda ordem é cancelada pelo servidor de negociação e assim novas posições não serão abertas, exatamente o que estamos procurando. O trabalho deste tipo de ordens é apresentada no diagrama abaixo:

Fig. 42. Ordens OCO com Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit)

Fig. 42. Ordens OCO com Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit)

O MetaTrader 5 não suporta ordens OCO. Como um pacote de três ordens não pode ser usado, as ordens que atuam simultaneamente com Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) não são adequadas. Um par de duas ordens pode ser usado! Assim, podemos ter níveis de Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit). 

Na verdade, se uma ordem pendente vinculada com uma ordem executada for colocada como nova posição bidirecional (por exemplo Perda Máxima), então tal construção é segura. Não haverá uma segunda ordem pendente e não será possível abrir uma nova posição bidirecional. Efetivamente, haverá apenas três cenários:

  • A ordem pendente será cancelada por algum motivo, seja pela corretora ou o trader;
  • A ordem pendente será ativada;
  • A ordem pendente não será ativada.

Não há outros cenários. Se uma ordem pendente é cancelada, será igual ao cancelamento da Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit). Se uma ordem pendente é ativada, ela irá fechar a posição. Se uma ordem pendente não é ativada, uma posição bidirecional irá permanecer ativa com a colocação da Perda Máxima (StopLoss).

Se o HedgeTerminal está desativado quando a ordem pendente for alcançada, quando mais tarde for reiniciado, ele processará o seu desencadeamento e entenderá que a posição foi fechada por esta ordem. É possível descobrir se a posição foi fechada pela Perda Máxima (StopLoss) ou Lucro Máximo (TakeProfit) se o campo com o número mágico contém estas informações especiais sobre as ordens. A forma como o link e as informações de serviço são armazenadas no campo com o número mágico será explicado em detalhes na próxima seção.

Uma vez que dois níveis de perdas máximas não podem ser usados ao mesmo tempo, um compromisso foi feito quando foi concebido o HedgeTerminal:

Posições bidirecionais no HedgeTerminal são protegidos pelas ordens reais de Stop de Compra (BuyStop) e Stop de Venda (SellStop) desempenhando um papel de Perda Máxima (StopLoss). Níveis de Lucro Máximo (TakeProfit) são virtuais, onde o HedgeTerminal executa no computador do trader e indisponibiliza a nível global.

Os níveis de Perda Máxima (StopLoss) são escolhidos, uma vez que estes níveis são aqueles necessários para ter um nível elevado de confiabilidade nas estratégias de negócios. Se o Lucro Máximo (TakeProfit) não funcionar, não vai ser catastrófico e a conta não será fechada por chamada de margem, enquanto se a Perda Máxima (StopLoss) não foi ativada, pode levar a conta à falência.

No entanto, há uma variedade de algoritmos para escolher o caminho de fuga de uma posição. Você pode escolher entre uma Perda Máxima real e Lucro Máximo virtual ou uma Perda Máxima virtual e Lucro Máximo real. Estes níveis pode ser virtuais, mas no momento este recurso não foi implementado, havendo demanda, ele poderá aparecer.

A virtualização do nível de Lucro Máximo (TakeProfit) reduz sua confiabilidade em geral, embora não de forma significativa, estes níveis são distribuídos localmente e estão disponíveis para cada cópia do HedgeTerminal. É necessário ter pelo menos uma cópia em funcionamento do HedgeTerminal como um Expert Advisor que usa a biblioteca ou o painel de HedgeTerminal, para que o Lucro Máximo (TakeProfit) seja executado. Quando existem várias cópias do HedgeTerminal em execução, apenas um deles irá executá-lo. Será o primeiro colocando numa tag de bloqueio na posição bidirecional. Neste sentido, as instâncias do HedgeTerminal estão competindo umas contra os outras no modo multithread de escrita e leitura dos dados.

Para um usuário, operando manualmente através do painel HedgeTerminal ou usando a biblioteca de virtualização nos EAs, trabalhar com Lucro Máximo (TakeProfit) não difere do trabalho com Perda Máxima (StopLoss). Todas as diferenças factuais entre estes níveis estão ocultos por de trás da cena no HedgeTerminal. É suficiente para o trader a entrar com níveis de Lucro Máximo (TakeProfit) e Perda Máxima (StopLoss), eles estarão presentes simultaneamente e terão indicação de cor alertando sobre o desencadeamento de um dos níveis.


3.4. Ordens OCO Podem Resolver Problemas com Proteção de Posições Bidirecionais?

Ordens OCO tornam possível usar a Perda Máxima (StopLoss) real e níveis do Lucro Máximo (TakeProfit) simultaneamente. Elas são realmente versáteis na organização de uma negociação bidirecional? Abaixo estão as suas características. Nós já sabemos que ordens OCO permitem cancelar uma ordem através de outros gatilhos.

Parece que elas vão proteger a nossa posição bidirecional de ambos os lados, nesse caso a Perda Máxima (Stop-Loss) e o Lucro Máximo (Take-Profit) podem ser ordens reais, não exigindo que o HedgeTerminal as execute no computador. Mas tem um detalhe, na execução de ordens na bolsa de valores provavelmente haverá na conta a execução de ordens parciais. Esta propriedade pode destruir a lógica de negócios do aplicativo. Vamos considerar um exemplo simples:

  1. Uma posição de venda com o volume de 10 contratos é aberta. Duas ordens OCO com níveis de Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) são colocadas;
  2. A ordem de Venda Limitada (SellLimit) fica parcialmente executada quando o nível de Lucro Máximo (TakeProfit) é atingido. 7 de 10 contratos foram fechados e 3 restantes permaneceram abertos como uma posição comprada;
  3. aA ordem Stop de Venda (SellStop) implementando o nível de Perda Máxima (StopLoss) será cancelada como a ordem de Venda Limitada (SellLimit) vinculada a ela, embora executada apenas parcialmente.
  4. Posição em três contratos não tem mais qualquer proteção de perda.

Este cenário é apresentado na figura abaixo:

Fig. 43. Execução parcial de proteção de perdas

Fig. 43. Execução parcial de proteção de perdas

Existe uma forma das ordens OCO serem projetadas para compesarem a execução parcial nas Perdas Máximas. Os Volumes das duas ordens OCO podem ser interligadas. Neste caso, a execução parcial será definitivamente prevista. No entanto, isso vai levar a lógicas complexas no sistema de ordens usado nas operações financeiras.

A questão principal aqui é que ordens OCO não pode fornecer as mesmas oportunidades que no terminal MetaTrader 4, mesmo tendo em conta a execução parcial. Por exemplo, colocar uma ordem pendente com níveis Lucro Máximo (TakeProfit) e Perda Máxima (StopLoss) será difícil. A razão é que duas ordens interligadas não pode levar em conta o desencadeamento inicial da ordem.

Para escrever um algoritmo verdadeiramente versátil permitindo gerir posições semelhantes ao MetaTrader 4, ordens OCO deve ter as seguintes características:

  1. Cada ordem deve ajustar o seu volume de acordo com o grau de execução das ordem de proteção vinculadas. Por exemplo, se o Lucro Máximo (TakeProfit) executar 7 dos 10 de contatos, a Perda Máxima (StopLoss) vinculada deve modificar o seu volume de 10 para 3 (10 - 7 = 3);
  2. Cada uma das ordens linkadas deve levar em conta o volume da execução inicial da ordem. No caso de um trader colocar uma ordem pendente do tipo Compra Limitada (BuyLimit) e protegê-la com Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) na forma de ordens, não significa necessariamente que a Compra Limitada (BuyLimit) é garantia para executar todo o volume. Estes casos também devem ser atendidos pelas ordens emparelhadas.
  3. Além da condição de cancelamento, uma ordem emparelhada deve ter uma condição adicional para ser atingida. Somente será atingida quando uma ordem adicional conectada a ela for acionada. Isso significa que uma ordem OCO deve ter links para duas ordens. O primeiro link é a ordem que acionada irá ativar o modo atual. O segundo link é a ordem que acionada irá cancelar o ordem atual. Isto permitiria criar uma posição com uma ordem pendente inicial;

Tal mecanismo será muito complexo para um usuário com experiência limitada, a sua adequação é duvidosa. A virtualização do lado do cliente, como é atualmente utilizada no HedgeTerminal, é mais fácil de usar.

Uma alternativa para ordens OCO, MetaQuotes poderia considerar a possibilidade de introduzir um algorítmo específico dos níveis Perda Máxima (StopLoss) e Lucro Máximo (TakeProfit) que garantam a proteção de uma determinada ordem de negociação. Certamente, esta é apenas uma teoria com um núcleo racional, tais níveis de algoritmos pode esconder a maior parte da implementação e configuração do lado servidor de negociação, oferecendo aos usuários finais um mecanismo simples proteção pronto para o uso.

Resumindo, o nosso pequeno discurso sobre as perspectivas de integração da ordens OCO na plataforma MetaTrader 5:

Ordens OCO não são eficazes quando as ordens são executadas parcialmente, eles não são confiáveis o suficiente, sendo demasiadamente complexas para um usuário normal da plataforma.  


3.5. Links Armazenados para Inicializar Ordens

Esta seção considera uma descrição detalhada do armazenamento interno dos links para outras ordens e mecanismo de ligação entre elas. Como foi mencionado antes, o campo de "Order Magic" contém o identificador do Expert Advisor que coloca uma ordem. Isto significa que qualquer trader pode inserir qualquer valor inteiro neste campo usando a linguagem de programação MQL5. Nesses casos, uma colisão é possível, quando a inicialização da posição de uma nova ordem irá conter o identificador de um Expert Advisor combinando com o identificador de uma ordem existente. Neste caso, um link errado com a ordem irá aparecer.

Se um trader utiliza identificador para EAs próximo de zero, tal como "1", "7" ou "100", porém os números das ordens são significativamente maiores, como "10002384732", estas colisões podem ser evitadas. Seria muito ingênuo acreditar que os traders vão manter isso em mente. É por isso que o HedgeTerminal armazena links para ordens de uma forma especial, assim a probabilidade de colisões é muito pequena, seus algoritmos não permitem ambiguidade e eliminam as colisões automaticamente se elas aparecem.

O campo "Order Magic" armazena o link e usa 64 bits. Devido à sua largura, este campo pode receber um número bem grande. Na realidade, a faixa de trabalho dos identificadores de uma ordem é muito menor. Isso permite o HedgeTerminal usar dígitos bem maiores neste campo para suas necessidades de segurança, formando um link de maneira especial para as ordens. Vamos nos referir ao esquema mostrando como o HedgeTerminal armazena um link para a ordem inicial:

Fig. 44. Padrão para armazenar um link de inicialização de ordem no HedgeTerminal

Fig. 44. Padrão para armazenar um link de inicialização de ordem no HedgeTerminal

O dígito superior do campo (63) é sempre marcado como 1, isso permite uma interação muito rápida sobre todas as ordens. Claramente, se o dígito seguinte não é igual a 1, então a ordem não conterá um link para outra ordem e pode ser omitido. Além disso, atribuindo o valor de 1 para o dígito mais alto faz o número mágico ser muito grande e aumenta a distância entre a faixa de trabalho dos identificadores das ordens e a faixa de trabalho dos links no HedgeTerminal, o que minimiza a probabilidade de uma colisão.

O HedgeTerminal pode preencher os três bits seguintes com informações de serviço. Ao contrário do identificador de ordem, o HedgeTerminal armazena identificadores neste campos de dentro para fora. Primeiramente, preenche os dígitos mais elevados e depois os menores, apontado para por uma seta azul - direction SI (informação de serviço)- na Fig. 44. Esta forma de armazenamento faz com que os intervalos de informações de serviço e identificadores das ordens tenham um meio termo. Se a necessidade surge, a sua composição pode ser alterada. O tamanho da informação de serviço pode ser aumentado através dos dígitos para armazenar o identificador da ordem. Esta informação permite a identificação do tipo de fechamento de uma ordem.

O ponto é que as ordens ativas no terminal MetaTrader 4 podem ser fechadas pelo Lucro Máximo (TakeProfit) ou Perda Máxima (StopLoss). Em MetaTrader 5, o Lucro Máximo (TakeProfit) e Perda Máxima (StopLoss) podem ser aplicados apenas para posições líquidas e não são adequados para ordens emparelhadas. Apenas as ordens comuns podem desempenhar um papel de Lucro Máximo (TakeProfit) e Perda Máxima (StopLoss).

No HedgeTerminal tais ordens são atribuídas a identificadores especiais que especificam se é Lucro Máximo (TakeProfit) ou Perda Máxima (StopLoss). Como o número mágico é armazenado no servidor de negociação, o serviço de informação torna-se disponível para todos os traders que têm acesso à conta de negociação, desta forma, mesmo com várias cópias do HedgeTerminal executados em diferentes computadores, os traders terão a informação sobre o tipo das ordens acionadas e o HedgeTerminal exibirá corretamente as informações sobre as posições fechadas.

A informação referenciada sobre o identificador da ordem é armazenado no intervalo de 0 a 59 dígitos. Este é armazenado na direção padrão, usando dígitos da direita para a esquerda, o que é indicado por uma seta azul (direction order id). Para avaliar o tamanho de armazenamento alocado, vamos calcular a quantidade necessária para armazenar um intervalo de todas as ordens enviadas a Bolsa de Moscou durante um ano.

O relatório da minha corretora datado de 13/06/2013 contém uma ordem com os identificadores 10 789 965 471. Este número usa 33.3297 bits  (log2(10 789 965 471)) ou 34  de 64 dígitos. O identificador de uma das ordens executada em 25/09/2014 é 13 400 775 716. Este número utiliza 33.6416 bits. Apesar de 2.6 bilhões de ordens terem sido colocadas no período de um ano e quatro meses, o tamanho do identificador foi aumentado apenas 0.31263 bits, menor do que o tamanho de uma ordem. Não estou afirmando que o Sol vai morrer antes que o tamanho do identificador de ordem chegue no dígito 59, mas estou bastante confiante de que isso não vai acontecer mais cedo do que alguns milhões de anos.

O HedgeTerminal não armazena um link abertamente. Para criptografar o campo OrderMagic, deixe o dígito sênior intocado. O código do HedgeTerminal baseia-se no rearranjo reversível de dígitos implementados pela função especial de encriptação trabalhando sobre a chave de comprimento variável. Depois da encriptação, o serviço de informação e o identificador da ordem se misturam um com o outro e ficam ocultos sob uma máscara especial, de modo que na saída representam uma distribuição uniforme de uns e zeros. A criptografia ocorre por duas razões. Em primeiro lugar, o rearranjo dos dígitos diminui a probabilidade de sobreposição dos links e identificadores de ordens, assim protege os algoritmos internos do HedgeTerminal do impacto aleatório ou deliberamento externo.

Este procedimento é absolutamente seguro, reversível e não é propenso a colisões. Isso garante que, independentemente das ações de um trader usando o Expert Advisors, não afetará a confiabilidade dos algoritmos internos do HedgeTerminal. Isto é muito importante numa situação real, o gerenciamento desses links é impossível sem algoritmos dedicados e complexos.

Ao mesmo tempo, se nos atermos apenas em controlar os links, o fracasso da lógica de negócios é inevitável. As próximas seções irão explicar porque eles são dedicados na descrição detalhada destes algoritmos. A criptografia também é utilizada para evitar essa falha. O reverso da moeda nessa restrição é que não existe nenhuma outra forma de gerenciar as posições HedgeTerminal.


3.6. Limitações do Trabalho com o HedgeTerminal

A peculiaridade da estrutura de armazenamento do link solicita que os armazenamentos de links do HedgeTerminal para as ordens uniforme usem números de 9223372036854775808 até 18446744073709551615. Se um campo de 64 dígitos é representado como um número com um sinal do tipo grande, então estes serão valores negativos. Aqui surgem três limitações para o trabalho com HedgeTerminal.

A primeira limitação diz respeito à negociação com robô, trabalhando no HedgeTerminal. Não é rigorosa e pode ser tratada como uma recomendação:

Um robô de negociação ou um Expert Advisor que trabalha com HedgeTerminal deve ter um identificador (número mágico de Expert) que não exceda o valor de 9223372036854775808.

Na realidade, os Expert Advisors habituais nunca vão se deparar com esta restrição, pois os identificadores que excedem a 5-6 dígitos são usados muito raramente. O identificador mais comum para um Expert é "12345" ou algo do tipo). Esta restrição pode ser aplicável para os robôs armazenando informações de serviço como links para outras ordens em seus números mágicos. O HedgeTerminal não é compatível com esses Experts e não pode trabalhar em conjunto com eles.

Se por algum motivo mencionado, o limite for ultrapassado, então aparece uma probabilidade zero de colisão. É um valor muito pequeno, onde uma coincidência em tal dimensão é muito improvável. Mesmo neste caso o HedgeTerminal vai resolver esse colisão usando seus algoritmos. Isto irá retardar o seu trabalho para decifrar um link, comparando este link com as ordens existentes e analisando esta ordem a respeito da aptidão para o emparelhamento com outra ordem terá tempo extra. Então, para evitar isso, é melhor não usar números longos com sinal negativo.

A segunda limitação é difícil, mas se trata apenas da corretora, da bolsa e do HedgeTerminal se conectarem:

Identificadores da ordem têm que usar os números de 0 a 2^59 ou 576 460 752 303 423 488.

Isso é óbvio, uma vez que apenas 59 dígitos são usados para armazenar identificadores da ordem e não 64. Se a sua corretora usa identificadores de ordem superior a este valor, você não pode usar o HedgeTerminal em seu trabalho.

A terceira limitação decorre da forma de representação das posições:

HedgeTerminal não é compatível com qualquer outro sistema de gerenciamento de posição. Não é compatível com os painéis externos de negociação caracterizando a função de fechamento de posições e não pode ser utilizado em conjunto com eles.


3.7. Mecanismo de Ordens de Emparelhamento e Determinismo das Ações

Temos considerado a representação de posição em detalhes no HedgeTerminal e a estrutura de seus links. Não vamos discutir a descrição do algoritmo que gerencia ordens encadernadas. Por exemplo, temos duas ordens escolhidas a partir de uma série de outras ordens e temos de linkar uma a outra. Um link para uma ordem deve ser único e só pode ser possuído por uma ordem, todas as situações possíveis podem ser divididos em três grupos:

  1. A ordem não é referenciada por qualquer outra ordem;
  2. A ordem é referenciado por uma ordem;
  3. A ordem é referenciado por duas ou mais ordens.

O primeiro grupo não causa dificuldades e tal ordem é considerada uma posição aberta. As coisas são muito para a frente com o terceiro grupo. O que podemos fazer com os casos do terceiro grupo? E se uma ordem é referenciada por outras duas ordens? Qual delas suporta ser linkado com a primeira e o que vai acontecer com a segunda ordem? É fácil responder a estas perguntas, se nós apresentamos o processo de emparelhamento como uma sequência:

  1. Deparamo-nos com uma ordem que não contém um link para outra ordem. Ela é transferida para a seção de ordens ativas (posições) e depois continua a iteração sobre as ordens;
  2. Logo nos deparamos com uma outra ordem que tem uma referência à primeira ordem. Então a ordem referenciada está sendo pesquisada na seção das ordens ativas. Se a ordem é referenciado nesta seção, logo ela fica emparelhada com a ordem atual e ambas são transferidas para a seção de transações completas na forma de posições históricas;
  3. Durante mais iteração, nos deparamos com mais uma ordem contendo um link para a ordem descrita no ponto 1. Então a ordem referenciada está sendo pesquisada na seção das ordens ativas. Desta vez a pesquisa será mal sucedida, pois as ordens procuradas foram transitadas a partir desta seção para a seção de transações concluídas. Como a ordem referenciada pela ordem atual não foi encontrada, então a ordem atual, apesar de seu link ser uma ordem ativa, é levada para a seção com as posições ativas.

Desde que os identificadores de ordens são preenchidos de forma consistente e sua lista é classificada por tempo, então a sua iteração sequencial pode ser realizada. Assim, a ordem de inicialização será emparelhada com a primeira ordem que contenha um link para ela, independentemente do número de outras ordens que contenham os mesmos links. Todas as outras ordens que contenham links para a ordem de inicialização serão incluídos na lista ativa de posições iniciadas.

Como já mencionamos, o algoritmo de execução de uma iteração deve ser completamente determinista e consistente. O HedgeTerminal usa esse algoritmo de iteração no seu trabalho. Verdadeiramente isto não é simplesmente uma iteração, mas uma repetição de todas as ações de negociação que têm sido realizadass desde o momento da primeira oferta. Efetivamente, a cada lançamento, o HedgeTerminal consistentemente constrói uma cadeia de ações de negociação desde o início até o momento atual. Graças a isso, a sua posição atual de representação é o resultado da sua negociação retrospectiva no momento do lançamento.

Uma vez que a iteração sobre todos o histórico de ordens é realizado sequencialmente, é necessário executar também ações de negociação sequencialmente, determinando o caminho da execução das ordens no HedgeTerminal. Por exemplo, uma posição ativa bidirecional do HedgeTerminal protegido por Perda Máxima (StopLoss) necessita ser fechada. Sabemos que uma posição bidirecional consiste essencialmente de duas ordens: ordem executada iniciando uma posição ativa e uma ordem pendente Stop de Compra (buy-stop) ou Stop de Venda (sell-stop), atuando como uma ordem de Perda Máxima (StopLoss). Para fechar uma posição, é necessário excluir a ordem pendente e fechar a posição bidirecional ativa por uma contra ordem com o mesmo volume. Assim, duas ações de negociação têm de ser realizadas. O HedgeTerminal executa todas as ordens de negociação de forma assíncrona.

Desta forma, as ordens podem ser executadas simultaneamente, ou seja, a primeira ordem pode ser colocada para cancelar a ordem pendente e a segunda para executar a contra ordem, fechando assim sua posição. Porém se esta operação for prejudicar o determinismo das ações, o HedgeTerminal não poderá realizar isto. Se por algum motivo, a ordem pendente não é cancelada e as posições não são fechadas pela contra ordem, haverá ambiguidade, pois a posição será fechada e o nível de Perda Máxima (StopLoss) continuará a existir. No final, a ordem que implementa o nível de Perda Máxima (StopLoss) pode ser alcançada e gerar uma nova posição bidireccional, isso não deveria acontecer. É por isso que o HedgeTerminal irá cancelar o nível de Perda Máxima (StopLoss) e após o cancelamento bem-sucedido, colocará uma contra ordem. Existe uma possibilidade da contra ordem não ser executada ou parcialmente executada na segunda etapa. Nesse caso a ambigüidade será eliminada, pois até mesmo uma contra ordem parcialmente executada vai fechar uma parte da posição ativa. Esta é uma situação comum.

Existe uma seqüência mais complexa de ações implementadas pelo HedgeTerminal. Vamos usar o exemplo semelhante ao anterior, mas desta vez vamos fechar uma parte da posição. Isso significa que o HedgeTerminal terá que realizar três ações:

  1. Excluir a ordem pendente que agiu como o nível de Perda Máxima (StopLoss);
  2. Executar contra ordem fechando uma parte do volume da posição bidireccional;
  3. Colocar um novo nível de Perda Máxima (StopLoss) com novo volume de proteção a parte restante da posição ativa.

Todas estas ações serão executadas de forma consistente para evitar prejudicar o determinismo das ações. A coisa natural a esperar é o aumento da velocidade de execução das ordens devido à colocação de ordem simultânea, embora uma execução sequencial das operações de negociação não podem ser garantidas e ambigüidades são possíveis. Um processamento de ordem seqüencial não implica qualquer ambiguidade.


3.8. Divisão e Ofertas Conectadas - a Base da Ordem Aritimética

A manipulação de ordem sequencial não é suficiente. Aqui estão duas coisas que devem ser observadas:

  • Uma ordem pode incluir várias ofertas. O número dessas ofertas pode ser aleatória;
  • É também importante ter em conta que numa ordem de execução parcial, o volume de fechamento de uma ordem não pode ser igual ao volume inicial da ordem.

A ordem pode ser executada por várias ofertas ao mesmo tempo e pode ser parcialmente executada. Consulte o artigo dedicado à descrição dos preços da bolsa para maiores detalhes: ""Princípios da Precificação da Bolsa Tomando Como Exemplo o Mercado de Derivativos da Bolsa de Moscou". A pergunta que requer uma resposta: Porque o volume de fechamento de uma ordem não pode ser igual ao volume de abertura da ordem? O que podemos fazer neste caso?

Na verdade, seus volumes não podem ser igual se nós presumimos uma oportunidade de um fechamento parcial de uma posição ativa. Se abrir uma posição ativa com o volume de 50 contratos e fechar uma parte das posições através de contra ordem com o volume de 20 contratos, então a posição ativa vai ser dividido em duas partes. A primeira parte vai ser uma nova posição histórica com o volume de 20 contratos pela contra ordem e a segunda parte ainda vai abrir com um volume no valor de 30 contratos.

Este algoritmo de encerramento da posição parcial é implementado no HedgeTerminal. Se um novo valor é inserido no campo "Volume" do painel HedgeTerminal, então um encerramento parcial acontecerá. Na pasta "History" uma nova posição irá aparecer e o volume da posição atual será igual ao novo valor. O HedgeTerminal pode processar a situação, mesmo quando o volume do fechamento da ordem é maior do que o volume inicial! Tal situação pode ocorrer se o HedgeTerminal por algum motivo coloca um volume incorreto do fechamento da ordem ou uma corretora mal intencionada cancela várias ofertas incluídas na ordem inicial, alterando o volume executado por um menor.

Para ter na conta uma diferença potencial de volumes é necessário usar um algoritmo universal com base no cálculo do volume total de todas as ofertas relacionadas com a ordem. Assim são as ofertas e não ordens que determinam tudo. O volume de uma ordem é o volume de suas ofertas. O preço de uma ordem executada é o preço médio de suas ofertas.

O HedgeTerminal utiliza um algoritmo que linka as ordens entre elas ou as divide. Baseia-se na adição e subtração das ofertas. O trabalho é baseado na união das ofertas entre a abertura e o fechamento da ordem com a formação de uma posição no histórico.

Para entender como esse algoritmo funciona, vamos supor que existam duas ordens necessárias para serem emparelhados e formarem uma posição histórica. Ambas as ordens têm o mesmo número de ofertas e o mesmo volume é executado. Números de ofertas será de três dígitos para a simplificar:

Ordem #1 (abertura)Volume (10/10)
oferta #2833
oferta #2882
oferta #2945

Tabela 3. Ordem №1 e é ofertado


Ordem #2 (fechamento)Volume (10/10)
oferta #8711
oferta #8823
oferta #9216

Tabela 4. Ordem №2 e suas ofertas

Vamos colocar as ofertas juntas com os volumes:

Tabela 5. Colocando as ordens juntas

Tabela 5. Colocando as ordens juntas

Selecione as duas últimas ofertas de cada coluna: №294 e №921 Em geral, elas não podem ser ao mesmo nível umas das outras (como neste exemplo).

Selecione uma oferta com o volume menor. A oferta №294 com o volume igual 5. Divida a oferta oposta №921 em duas. A primeira oferta é igual ao volume da oferta №294 (5 contratos) e a segunda oferta contém o volume restante de 1 contrato (6 contratos - 5 contratos = 1 contrato). Unir a oferta nº 294 de volume igual a 5 com a primeira parte da oferta №921 com mesmo volume:

Tabela 6. Subtração de volumes

Tabela 6. Subtração de volumes

Transferir a parte unida para uma nova coluna contendo as ofertas da posição histórica.

Destaque em verde. Deixar a parte restante da oferta #921 com um volume de 1 na coluna inicial de posição ativa, destaque em cinza:

Tabela 7. Dividindo e transportando mais ofertas

Tabela 7. Dividindo e transportando mais ofertas

Fizemos o primeiro passo para unir as ofertas de duas ordens e trasnportando-as para a posição histórica. Vamos refletir a sequência de ações num breve formulário:

Tabela 8. Dividindo e transportando mais ofertas. Passo 1

Tabela 8. Dividindo e transportando mais ofertas. Passo 1

O volume da oferta №294 foi transportada na íntegra para a seção de posições históricas. A oferta foi aniquilada completamente. A oferta foi dividida e transportada até a seção de ordens históricas. No próximo passo podemos avançar para a seguinte oferta №288 com o volume igual a 2. Oferta №921 ainda está presente e seu volume é igual a 1, ou seja, segunda parte restante da oferta. No passo seguinte esse volume irá interagir com o volume da oferta №288.

Na segunda etapa vai repetir o procedimento com as ofertas №288 e №921. Desta vez, o volume restante da oferta №921 (1 contrato) será unida com o volume da oferta №288. O restante volume da oferta №288 é igual a 1 contrato e permanecerá na coluna da posição ativa:

 Tabela 9. Dividindo e transportando mais ofertas. Passos 1-2

Tabela 9. Dividindo e transportando mais ofertas. Passos 1-2

Repita as mesmas ações com as ofertas №288 e №882:

Tabela 10. Dividindo e transportando mais ofertas. Passos 1-3

Tabela 10. Dividindo e transportando mais ofertas. Passos 1-3

Executar passos IV e V da mesma forma:

Tabela 11. Dividindo e transportando mais ofertas. Passos 1-5

Tabela 11. Dividindo e transportando mais ofertas. Passos 1-5

Depois do passo V, o volume de fechamento da ordem será absolutamente o mesmo que o volume das ofertas da abertura da ordem. Ofertas transportadas para a coluna de posições históricas completa a transação histórica. As restantes ofertas da posição ativa fazem uma posição ativa. Neste caso, não existem ofertas deixadas na coluna da posição ativa. Isto significa que depois dessa unidade, a posição ativa deixará de existir. Uma nova posição histórica aparecerá e incluirá todos as ofertas da posição ativa.

Depois das ofertas serem transportados, muitas delas serão divididas em partes e ocuparão várias linhas. Para evitar isso, uma opção sobre coleta de ofertas pode ser adicionada ao algoritmo de união/divisão das ofertas. Basta unir o volume das ofertas com os mesmos identificadores:

Tabela 12. Unindo ofertas em 1 nível

Tabela 12. Unindo ofertas em 1 nível

Depois de unir, o número de ofertas e os volumes correspondem completamente as ofertas e volumes iniciais. Isso acontece porque os volumes foram combinados de acordo com abertura da ordem. Se os volumes fossem diferentes, então após o procedimento da união, as ofertas teriam diferentes volumes.

Este algoritmo é universal, uma vez que não requer o mesmo número de ofertas para iniciar e fechar a ordem. Há um outro exemplo baseado nesta propriedade, vamos olhar para:

Tabela 13. Unindo ordens com número diferente de ofertas

Tabela 13. Unindo ordens com número diferente de ofertas

Como podemos ver, a união das ordens dentro da posição histórica foi bem sucedida. Apesar de um número diferente de ofertas, o volume foi combinado novamente.

Agora, imagine que o volume agregado da ordem de fechamento (12 contratos) é menor do que o volume de ofertas da ordem inicial (22 contratos). Como unir neste caso?

Tabela 14. Unindo ordens com diferentes volumes

Tabela 14. Unindo ordens com diferentes volumes

Na segunda etapa, o volume das ofertas no fechamento da ordem é igual a zero enquanto que a ordem inicial contém mais duas ofertas, №321 com um volume igual 4 e a №344 com o volume igual a 6. Existe um excesso de ofertas na ordem ativa. Este excesso irá existir como uma posição bidirecional ativa. No entanto, existe uma nova posição histórica com as ofertas transportadas para a coluna verde. Temos os volumes de 12 contratos iniciais e de saída combinados novamente.

No caso em que o volume de fechamento da ordem é maior do que no início, há também um excesso apesar de estar no lado do fechamento da ordem:

Tabela 15. Unindo ordens com diferentes volumes

Tabela 15. Unindo ordens com diferentes volumes

Como podemos ver, a ordem inicial com volume igual 4 e o fechamento da ordem com volume igual a 6 fazem duas posições. A primeira é uma posição histórica com volume inicial da oferta №625 igual a 4, as ofertas №719 e №720 são do fechamento da ordem. A segunda posição é um excesso de ofertas no emparelhamento dessas ordens. Ele contém a oferta №719 com o volume igual a 2. Esta oferta e a ordem fazer uma posição ativa na guia "Active" do painel HedgeTerminal.

Ofertas e ordens podem ser divididas pelo algoritmo em posições históricas e ativas. Os volumes podem ser diferentes. A principal coisa é que o algoritmo permite é reunir os volumes iniciais e de fechamento das ordens pela formação de uma posição histórica com volumes iguais de entrada e saída. O algoritmo garante a impossibilidade da situação quando estes volumes não são iguais e portanto os erros de representação da posição causam uma assimetria da posição.

Vamos supor no exemplo abaixo que a corretora cancelou uma oferta incluído no fechamento da ordem:

Tabela 16. Simulando a exclusão de oferta a partir do histórico

Tabela 16. Simulando a exclusão de oferta a partir do histórico

Uma oferta №921 com 6 contratos foi cancelada. Vamos ver como o algoritmo de HedgeTerminal vai funcionar neste caso:

Tabela 17. Restaurando a integridade da representação

Tabela 17. Restaurando a integridade da representação

Na etapa dois ficou um excesso de seis contratos (3+2+1). Este excesso irá transformar-se em posição ativa, portanto o volume e a direção da posição bidireccional será igual ao da posição líquida.

Resumindo, podemos dizer que o algoritmo de unir ofertas garante a igualdade dos volumes iniciis e de fechamento das ordens nas posições históricas devido ao excesso das ofertas não linkadas. Esse excesso de ofertas torna uma posição bidirecional ativa, igualando à posição líquida de todas as posições ativas de HedgeTerminal com a posição líquida do terminal MetaTrader 5.

Este mecanismo funciona tanto com efeitos retroativos como em tempo real e isso significa que serão igualadas as posições líquidas do Hedge Terminal com as posições líquidas no terminal MetaTrader 5, independentemente da ação do corretor sobre o cancelamento de ações de negociação. As combinações sobre a modificação de uma posição líquida e cancelamento de ofertas pode ser que não cause uma assimetria entre a posição líquida do terminal e a posição líquida do HedgeTerminal.

O mecanismo de encerramento parcial da posição baseia-se na capacidade deste algoritmo em reunir diferentes volumes. Este algoritmo é uma das partes mais importantes do HedgeTerminal garantindo o seu trabalho estável como um sistema autoadaptável sem nenhuma configuração necessária.


3.9. Virtualização da Ordem e Oferta

Cada ordem e oferta no HedgeTerminal tem um protótipo real com um identificador correspondente. No entanto do ponto de vista do HedgeTerminal, uma ordem pode fazer uma posição ativa e ao mesmo tempo fazer uma parte do histórico. Ofertas e ordens no MetaTrader 5 são entidades indivisíveis. Uma ordem na plataforma pode ser pendente ou executada. Uma oferta também tem um volume constante e sempre será uma operação executada.

No HedgeTerminal as mesmas ordens e ofertas podem estar presentes em diferentes posições bidirecionais. A mesma oferta ou ordem pode fazer uma posição ativa e uma histórica. Em outras palavras, ordens e ofertas no HedgeTerminal são divididas em várias virtuais. Esta representação de dados difere muito de representação de dados no MetaTrader 5. No entanto, esta representação permite flexibilidade e se adapta às mudanças retrospectivas das informações de negociação e trabalhando as ordens e ofertas conjuntamente.


3.10. Mecanismo para Ocultar Ordens

Mencionamos o mecanismo para ocultar ordens na seção que descreve a instalação de HedgeTerminal. O HedgeTerminal pode ignorar algumas ordens. Para uma ordem ou oferta deixar de existir no HedgeTerminal, basta entrar com o arquivo ExcludeOrders.xml no seu identificador.

Vamos supor que temos várias execuções de ordens de venda e compra de um símbolo. O volume total das ordens de venda é igual ao volume total de ordens de compra. Desta forma, não importa quantas ordens temos, a posição total é igual a zero. Se os identificadores dessas ordens não estão no arquivo ExcludeOrders.xml, o HedgeTerminal irá exibir cada uma deles com uma posição bidirecional. Sua posição total será zero. Portanto, se uma posição líquida em MetaTrader 5 é zero, então a contribuição dessa ordem para a posição líquida pode ser simplesmente ignorada.

Agora, vamos supor que no momento t temos uma posição líquida zero no símbolo S e um conjunto de ordens N executadas neste símbolo por determinado tempo. Como não há nenhuma posição deste símbolo, o volume total do conjunto de ordens N é insignificante. Na verdade, o número de ordens e seu volume são irrelevantes, pois não existe posição, estas ordens não contribuem para a posição líquida total . Isso significa que tais ordens podem ser simplesmente ignoradas e não há necessidade de representá-las como posições bidirecionais.

Este é o mesmo mecanismo que o HedgeTerminal utiliza no momento da sua instalação. No momento da instalação t se não há uma posição líquida, o HedgeTerminal inclui o conjunto de ordens N na lista de exceção. O seu volume total e número são irrelevantes porque não há nenhuma posição líquida. Se houver uma posição líquida no momento da instalação do HedgeTerminal, então simplesmente não será instalado até que a posição líquida seja fechada. Após a instalação, as novas ordens irão alterar o estado da posição líquida. Este estado que será sincronizado com o volume líquido das posições bidirecionais no HedgeTerminal.

Aparentemente, poderíamos ficar sem colocar ordens executadas pelo tempo do HedgeTerminal na lista de exceções. Ao mesmo tempo, pode acontecer que exista um grande número de ordens pelo tempo de instalação e do ponto de vista do HedgeTerminal, todas elas se tornarão posições bidireccionais e com volume total diferente do volume de líquido no terminal MetaTrader 5.

O mecanismo para ocultar ordens pode ser eficaz contra a corrupção do histórico na conta. Funciona assim: vamos supor que exista algum histórico de ordens, quando HedgeTerminal é lançado nesta conta, ele irá iterar todas as ordens e vai construir a posição bidirecional com base nelas. Se todas as ordens estão disponíveis a partir do momento da abertura e os dados sobre essas ordens não estão corrompidos, a posição líquida dessas ordens será correspondente à posição líquida no terminal MetaTrader 5, então aparentemente a posição líquida no HedgeTerminal será igual a soma dessas ordens. Isto é ilustrado no diagrama abaixo:

Fig. 45. Diagrama do histórico integral

Fig. 45. Diagrama do histórico integral

Uma parte do histórico pode estar faltando ou as informações sobre as ordens estarem incorretas.

Não é importante se apenas uma ordem está faltando ou várias ordens e será irrelevante se a informação está faltando no início ou no meio do histórico da conta. A posição líquida executada na conta pelo HedgeTerminal é igual à posição líquida de todas as ordens disponíveis. A posição líquida de ordens não será igual à posição líquida factual do terminal por causa da parte faltante no histórico. Esta situação é apresentada no diagrama B:

Fig. 46. Histórico parcialmente corrompido

Fig. 46. Histórico parcialmente corrompido

Para sincronizar uma posição líquida no HedgeTerminal com a posição líquida factual do terminal MetaTrader 5, não precisamos saber quais as ordens desapareceram ou foram corrompidas. Tudo o que precisamos é calcular a diferença entre estas posições líquidas. No exemplo acima, uma posição de compra com o volume de 5 contratos foi aberta no terminal MetaTrader 5. No HedgeTerminal será correspondente a uma posição maior, totalizando 8 contratos. A diferença entre estas duas posições será de 3 contratos de compra porque 8 - 5 = 3 COMPRA.

Depois de calcular a diferença de contrato, é obrigatório a colocação de uma ordem de compra ou venda correspondente com o volume igual à diferença. No nosso exemplo, é necessário colocar uma ordem de compra referente a três contratos. Quando a ordem é executada, o HedgeTerminal vai exibi-lo na guia de posições ativas e sua posição líquida total vai aumentar em 3 contratos e se tornará igual a 11 contratos para comprar.

A posição no MetaTrader 5 também vai aumentar e vai fazer oito contratos. O identificador dessa ordem deve ser inscrito na lista do arquivo ExcludeOrders.xml, então o terminal tem de ser reiniciado. Assim, se o identificador da nossa ordem é igual a 101162513, então a seguinte tag supostamente será escrita no arquivo:

<Orders-Exclude>
        ...
        <Order AccountID="10052699" ID="101162513"></Order>
</Orders-Exclude>

Depois de reiniciar o HedgeTerminal, esta posição bidirecional irá desaparecer. Desta forma, a posição líquida no terminal MetaTrader 5 irá corresponder a uma posição líquida no HedgeTerminal e fará cinco contratos de compra. A sequência descrita de ações é apresentada no diagrama abaixo:

Fig. 47. Diagrama de restauração da integridade dos dados

Fig. 47. Diagrama de restauração da integridade dos dados

O resultado financeiro da posição desaparecida não será gravado nas estatísticas do HedgeTerminal. Infelizmente, as posições bidirecionais escondidas não participam nas estatísticas de negociação.

Na realidade, uma situação onde uma parte do histórico não está disponível ou está corrompido é altamente improvável. Este mecanismo deve estar a disposição, provavelmente a maioria dos usuários MetaTrader 5 nunca irão se deparar com uma situação em que precisem usá-lo. Depois não estão excluídas todas as possibilidade de erros de programa HedgeTerminal e deve haver um instrumento confiável para solucioná-los.


3.11. Mecanismos de Adaptação

Nós consideramos mecanismos permitindo que o HedgeTerminal represente posições bidirecionais no ambiente líquido do terminal MetaTrader 5. Há três desses mecanismos:

  1. Iteração sequencial de ofertas;
  2. Mecanismo de divisão e de correspondência das ofertas
  3. Mecanismo para ocultar ordens

Cada um desses mecanismos trata de seus problemas e permite evitar ambiguidades e erros em cada nível correspondente. Vamos colocar esses problemas e soluções numa tabela. A primeira coluna contém os problemas e os possíveis erros de vinculação, na segunda coluna, os mecanismos que resolvem:

Problemas, erros, ambiguidades decorrentes da organização de negociação bidirecionalMecanismos de correção do erro
Erros nos links para abertura das ordens; Colisão de link; Números mágicos no Expert; Exclusão de ordens do histórico; Erros de execução da operação de negociação.Iteração sequencial em ordens. Determinismo de ações.
Desconto por erros; Ordens correspondentes com diferentes volumes ; Execução de ordens parcial; Exclusão de ofertas do histórico; Cobrindo um volume menor com um maior.Mecanismo de divisão e de correspondência das ofertas.
Instalando HedgeTerminal na conta com um grande número de ordens executadas; Histórico corrompido; Erros do HedgeTerminal no trabalho com as ordens.Mecanismo para ocultar ordens

Tabela 18. Possíveis erros e mecanismos de correção

Todos os três mecanismos, juntamente com o sistema de armazenamento de links, asseguram uma representação estável dos dados. Essencialmente, esses mecanismos abrangem todos os casos possíveis de falhas imprevistas e a garantia da posição líquida no HedgeTerminal correspondendo com a posição líquida do terminal MetaTrader 5.


3.12. Performance e Uso da Memória

HedgeTerminal é essencialmente uma aplicação orientada de objeto. Devido aos princípios OOP subjacentes à sua arquitetura, o terminal tem alta eficiência e baixos requisitos para o armazenamento. O único recurso que consome do computador é extrair o histórico das ordens e ofertas na memória no momento de lançar o terminal no gráfico.

Depois que todas as operações necessárias foram extraídos na memória, o terminal irá imprimir uma mensagem informando sobre o tempo gasto nesta operação e também de uso da memória. Por exemplo, o lançamento do painel HedgeTerminal numa conta que continha mais de 20.000 ofertas no computador com o processador Intel i7 levou menos de 30 segundos e exigiu 118 Mb de RAM:

2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1)       We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080 sec. 118MB RAM used.

A biblioteca HedgeTerminalAPI trabalha ainda mais rápida e leva muito menos memória, pois não tem a necessidade de representação gráfica de transações. Abaixo está o resultado do lançamento na mesma conta:

2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1)        We begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.

Um cálculo simples mostra que a extração de uma posição leva entre 1 a 1,26 milissegundos, dependendo do tipo de programa. Armazenar uma transação leva: (22 156 ofertas + 22.237 ordens) / 44 MB = 1 Kb de RAM. Armazenar representação gráfica adicional de uma transação leva aproximadamente: (118 Mb - 44 Mb) * 1024 / (22 156 ofertas + 22.237 ordens) = 1,71 Kb de memória.

O perfil do código mostra que a maior parte do tempo é tomado por um único bloco de análise da ordem. A maior parte deste último, é a chamada de função do sistema. Nas versões futuras este bloco será otimizado e permitirá aumentar a eficiência no lançamento de 10 a 15%.


Conclusão

Neste artigo consideramos os pontos-chave no trabalho com o painel visual HedgeTerminal. Citamos como exemplo, a criação de uma nova classe de painéis com uma possibilidade de configuração flexível.

Esquemas e especificações deram uma idéia em profundidade dos princípios de organização da negociação bidirecional. Se você estiver criando suas próprias bibliotecas de virtualização, o segundo capítulo deste artigo irá ajudá-lo a projetar uma biblioteca.

O caráter da execução da bolsa exige que se leve em conta os pontos-chave no processo de representação das ofertas e das ordesn como posições bidirecionais. Este artigo mostrou que essa representação é impossível sem a virtualização das ofertas e ordens. A virtualização é um mecanismo de "ruptura" do volume de ofertas executadas e clonagem de ordens reais, pois uma ordem pode ser parte de várias operações.

Essas manipulações com o ambiente de negociação são bastante corajosas, mas a maior parte das informações exigidas na virtualização são armazenadas no servidor de negociação, tal representação pode ser tratada como confiável.


Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1297

Guia Prático MQL5: Implementando um Array Associativo ou um Dicionário para Acesso Rápido ao Dados Guia Prático MQL5: Implementando um Array Associativo ou um Dicionário para Acesso Rápido ao Dados
Este artigo descreve um algoritmo especial que permite ter acesso aos elementos através de suas chaves únicas. Qualquer tipo de dados de base pode ser usado como uma chave. Por exemplo, ele pode ser representado como uma variável do tipo string ou inteiro. Tais contentores de dados são comumente referenciados a um dicionário ou um array associativo. Ele fornece uma maneira mais fácil e eficiente na resolução de problemas.
Guia Prático MQL5: Ordens ОСО Guia Prático MQL5: Ordens ОСО
Qualquer atividade de negociação do trader envolve diversos mecanismos e inter-relações, incluindo as relações entre ordens. Este artigo sugere uma solução de processamento de ordens OCO. As classes da biblioteca padrão são amplamente envolvidas, bem como os novos tipos de dados que são criados aqui.
Negociação Bidirecional e de Cobertura de Posições no MetaTrader 5 Através da API HedgeTerminal, Parte 2 Negociação Bidirecional e de Cobertura de Posições no MetaTrader 5 Através da API HedgeTerminal, Parte 2
Este artigo descreve uma nova abordagem para cobertura de posições e desenhar uma linha na discussão entre os usuários do MetaTrader 4 e MetaTrader 5 sobre esta questão. Ele é uma continuação da primeira parte: "Negociação Bidirecional e de Cobertura de Posições no MetaTrader 5 Através do Painel de HedgeTerminal, Parte 1". Na segunda parte, nós discutimos a integração do Expert Advisors personalizado com o HedgeTerminalAPI, que é uma biblioteca de visualização especial projetada para a negociação bidirecional em um ambiente de software confortável, fornecendo ferramentas para o gerenciamento de posições de forma conveniente.
Traçando linhas de tendência baseadas em fractais usando MQL4 e MQL5 Traçando linhas de tendência baseadas em fractais usando MQL4 e MQL5
O artigo descreve a automação da plotagem de linhas de tendência com base no indicador Fractals usando MQL4 e MQL5. A estrutura do artigo fornece uma visão comparativa da solução para as duas linguagens. As linhas de tendência são plotados usando os dois últimos fractais conhecidos.