Sunday 27 August 2017

Estratégias De Negociação Universal


MetaTrader 5 - Exemplos Universal Expert Advisor: Trading Modes of Strategies (Parte 1) Introdução Várias tarefas podem surgir ao implementar algoritmos de negociação automatizados, incluindo análise do ambiente de mercado para interpretar sinais de entrada no mercado e fechamento de uma posição existente. Outra tarefa possível é o controle sobre as operações do Consultor Especializado e o tratamento adequado dos erros comerciais. Finalmente, é uma tarefa de acesso fácil e conveniente aos dados de mercado e às posições de negociação do Consultor Especialista. Todas essas tarefas são implementadas diretamente no código-fonte do Expert Advisor. Por outro lado, devemos separar a parte técnica do processo de negociação e a ideia implementada no Custom Expert Advisors. Com a abordagem orientada a objetos, podemos separar essas duas tarefas de negociação essencialmente diferentes e confiar a implementação do processo de negociação a uma classe especial comum a todas as estratégias, que às vezes também é referido como o mecanismo de negociação. Este é o primeiro artigo da série de artigos que descrevem o funcionamento desse mecanismo, que pode ser chamado de "Universal Expert Advisor". Este nome unifica um conjunto de classes que permitem o desenvolvimento fácil de algoritmos de negociação por uma enumeração usual de condições de entrada e saída de posição. Você não precisará adicionar dados exigidos e lógicas de negociação ao Consultor Especializado, p. Ex. Pesquisa de posição todos os procedimentos necessários são feitos pelo mecanismo comercial. O material para o artigo proposto é extenso, portanto, é dividido em quatro partes. Aqui estão os detalhes dessas peças. Parte 1. Modos de negociação de estratégias. Eles são descritos neste artigo. A primeira parte descreve o conceito de gerenciamento de posição original baseado em modos de negociação. Uma lógica de negociação Expert Advisor pode ser facilmente definida usando os modos de negociação. Um consultor especialista escrito neste estilo é fácil de depurar. A lógica dessas EAs se torna universal e similar, o que também facilita o gerenciamento de tais estratégias. As idéias expressas neste material são universais e não requerem programação adicional orientada a objetos. Isso significa que, independentemente de usar o conjunto de bibliotecas oferecidas ou não, esse material pode ser útil para você. Parte 2. O Modelo de Evento e Protótipo de Estratégia de Negociação. Esta seção descreve um modelo de evento original baseado no gerenciamento de eventos centralizado. Isso significa que todos os eventos são reunidos em um lugar da lógica de negociação da EA que os processa. Além disso, os eventos são multi-moeda. Por exemplo, se um Expert Advisor estiver sendo executado no gráfico EURUSD, é possível receber um evento de um novo tick de GBPUSD. Este modelo de evento pode ser extremamente útil ao desenvolver Expert Advisors que comercializam vários instrumentos financeiros. Nesta parte, também descreveremos a classe base do motor de negociação CStrategy e a classe CPositionMT5 que representa uma posição no MetaTrader 5. Parte 3. Estratégias personalizadas e classes de comércio auxiliar. O material abrange o processo de desenvolvimento personalizado Advisor Advisor. A partir deste artigo, você descobrirá como criar um consultor especialista com uma enumeração simples de condições de entrada e saída de posição. Esta parte também descreve vários algoritmos auxiliares que podem simplificar muito o acesso a informações comerciais. Parte 4. Negociação em um Grupo e Gerenciamento de uma Carteira de Estratégias. Esta parte contém uma descrição de algoritmos especiais para integrar várias lógicas de negociação em um único módulo executável ex5. Ele também descreve mecanismos, que podem ser usados ​​para gerar um conjunto de estratégias personalizadas usando um arquivo XML. Métodos para abrir novas posições e gerenciar os existentes Para entender a abordagem oferecida neste artigo, primeiro tentaremos descrever um sistema comercial clássico baseado em duas médias móveis, uma das quais tem um curto período de média e a segunda tem uma longa período. Assim, a média móvel com um grande período de média é mais lenta do que a média móvel com um menor período de média. As regras de negociação são simples: se a média rápida está acima do lento, a EA deve comprar. Por outro lado, se a média em movimento rápido for inferior à lenta, a EA deverá vender. O quadro a seguir mostra nossa estratégia esquematicamente: Fig. 1. O gráfico de um sistema de negociação baseado em duas médias móveis. A linha vermelha mostra a média móvel simples e rápida com um período de 50. A linha azul mostra a média lenta com um período de 120. Quando se cruzam (as interseções são marcadas com Linhas pontilhadas azuis), a direção da posição Expert Advisor inverte-se. Do ponto de vista da abordagem não algorítmica, a descrição é suficiente para qualquer comerciante entender como negociar usando esta estratégia. No entanto, esta descrição não é suficiente para criar um consultor especializado com base nessa estratégia. Vamos considerar as ações de negociação que a EA precisaria executar na hora em que o MA rápido cruza o lento de baixo para cima: se a EA tiver uma posição curta aberta quando as MAs se cruzarem, esta posição deve ser fechada. A existência de uma posição longa aberta deve ser verificada. Se não houver uma posição longa, um deve ser aberto. Se uma posição longa já existe, nada deve ser feito. Para um cruzamento oposto quando o MA rápido atravessa o lento de cima para baixo, ações opostas devem ser realizadas: Se a EA tiver uma posição longa aberta quando as MAs se cruzarem, esta posição deve ser fechada. A existência de uma posição curta aberta deve ser verificada. Se não houver uma posição curta, um deve ser aberto. Se uma posição curta já existe, nada deve ser feito. Temos quatro ações comerciais para descrever o processo de negociação da estratégia. Duas ações comerciais descrevem a abertura da posição longa e a manutenção das regras. Duas outras ações descrevem a abertura da posição curta e a manutenção das regras. Pode parecer que uma sequência de quatro ações é demais para a descrição de um processo comercial tão simples. De fato, as entradas de posição longas coincidem com as saídas da posição curta em nossa estratégia, então não seria mais fácil combiná-las em uma ação comercial ou pelo menos lógica, não, não. Para provar isso, vamos mudar as condições de nossa estratégia inicial. Agora, nossa estratégia usará diferentes conjuntos de médias móveis para comprar e vender. Por exemplo, uma posição longa será aberta quando a média móvel rápida com um período de 50 atravessar a lenta com um período de 120. E uma posição curta será aberta quando a média móvel rápida com um período de 20 cruza a velocidade lenta Com um período de 70. Agora, os sinais de compra diferirem dos sinais de venda que ocorrerão em diferentes momentos, em diferentes situações de mercado. As regras propostas não são pensadas. Estratégias geralmente usam condições de espelho para entrada e saída: entrar em uma posição longa significa sair de uma curta e vice-versa. No entanto, outros casos também são possíveis, e se quisermos criar um protótipo universal de um Consultor Especialista, precisamos ter isso em conta, então teremos quatro regras. Além disso, consideramos nossas ações de um ângulo diferente. A tabela abaixo mostra o tipo de operação de negociação (Comprar ou Vender) e o tipo de ação comercial (abrir ou fechar). As células da tabela contém um conjunto específico de ações: BuyInit SellInit BuySupport SellSupport Tabela 2. Modos de negociação do Expert Advisor Todos os modos de negociação são fornecidos através da implementação prática no MQL usando uma estrutura especial ENUMTRADESTATE. Aqui está a descrição: estes modos permitem que qualquer consultor especialista desenvolvido sob a abordagem proposta para flexibilidade se conecte e desconecte os módulos de negociação, de modo a transformá-lo em um ou outro modo de negociação sobre a marcha. Comutação do modo de negociação CTradeState Usando os modos de negociação, o Consultor Especial sempre será capaz de entender em que ponto de tempo executar certas ações. No entanto, este ponto de tempo deve ser determinado para cada Consultor Especialista individualmente. O controle do modo de negociação é particularmente necessário ao negociar a seção FORTS do MICEX. O comércio de FORTS tem várias características específicas, cujo principal é o desbloqueio realizado duas vezes por dia, das 14:00 às 14:03 (compensação intermediária) e das 18:45 às 19:00 (limpeza principal). É aconselhável não permitir que os Expert Advisors realizem operações de negociação durante a limpeza. Claro, se uma EA só executa operações com a chegada de novos carrapatos ou a formação de novos bares, não funcionará enquanto o mercado estiver fechado, porque não serão recebidas novas cotações. Mas muitos consultores especializados operam em intervalos específicos (usando um temporizador). Para tais EAs, o controle das ações de negociação é essencial. Além disso, às vezes os negócios podem ser realizados nos fins de semana e feriados, e alguns corretores de Forex permitem a negociação, mesmo nos fins de semana. No entanto, devido à baixa volatilidade desses dias, bem como a baixa significância estatística, estes dias devem ser melhorados. De qualquer forma, o controle sobre os modos de negociação é um procedimento necessário para qualquer comerciante algorítmico profissional. Esta tarefa pode ser confiada ao módulo CTradeState especial. Este módulo é implementado como uma classe MQL5, e sua tarefa é retornar o modo de negociação correspondente à hora atual. Por exemplo, se o tempo atual corresponde ao tempo de compensação, o módulo retornará o estado TRADEWAIT. Se é hora de fechar todas as posições, o módulo retornará o TRADESTOP. Permite descrever mais detalhadamente seus métodos de operação e configuração. Aqui está o cabeçalho desta classe: A tarefa principal desta classe é retornar ao modo atual da estratégia, para o qual é necessário chamar seu método GetTradeState. Antes que o módulo seja capaz de retornar o estado, esse estado deve ser adicionado usando o método SetTradeState. O algoritmo de operação do módulo é semelhante à guia Agendamento do agente de teste MetaTrader 5: Fig. 3. A guia Agendamento no agente de teste do MetaTrader 5 Esta janela permite que você defina os dias da semana durante os quais o agente pode executar tarefas da rede MQL5 Cloud. A classe CTradeState funciona de forma semelhante, mas permite que você defina um dos cinco valores de ENUMTRADESTATE para cada intervalo. Para entender melhor como usar CTradeState, configuremos o módulo de estados de negociação. Para as operações diárias no mercado FORTS, o autor do artigo usa a seguinte configuração apresentada como uma tabela: MetaTrader 5 - Exemplos Universal Expert Advisor: Negociação em um Grupo e Gerenciando uma Carteira de Estratégias (Parte 4) Índice Introdução Frequentemente Precisam criar algoritmos que devem se dar um com o outro, ou seja, a operação de um algoritmo não deve ser influenciada pelas ações de outros algoritmos realizados ao mesmo tempo. Essa situação ocorre quando você precisa combinar vários algoritmos em um módulo executável ex5. Apesar da sua simplicidade aparente, essas tarefas têm algumas características algorítmicas de armadilhas significativas que devem ser consideradas ao construir o mecanismo das estratégias de negociação. O motor de negociação CStrategy inclui um conjunto de algoritmos que implementam a cooperação de duas e mais estratégias de negociação. Vamos discuti-los em detalhes na quarta parte desta série. Além disso, criaremos um perfil comercial de um grupo de consultores de especialistas em simultâneo, a fim de diversificar os riscos de negociação. A classe CStrategyList um contêiner de estratégias de tipo CStrategy pertence aos algoritmos que fornecem operação simultânea de estratégias. A classe permite carregar a apresentação baseada em XML das estratégias, bem como criá-las dinamicamente usando o método correspondente de uma fábrica de estratégias. O vídeo em anexo demonstra o processo de teste de múltiplas estratégias no MetaTrader 5 Strategy Tester. Todas as estratégias baseadas no motor de negociação descrito têm um painel personalizado padrão, que o ajuda a controlar facilmente as estratégias separadas diretamente do gráfico. CStrategyList Strategy Manager O segundo artigo da série Universal Expert Advisor descreveu a classe CStrategy e seus principais módulos. Através do uso desta classe e da sua funcionalidade implementada nos módulos, cada estratégia herdada mantém uma lógica de negociação unificada. No entanto, organizar um processo comercial usando robôs é mais do que apenas uma mera execução de pedidos comerciais. É importante garantir a sua cooperação, incluindo a operação de vários algoritmos em um módulo executável ex5. A classe CStrategyList especial é usada para este propósito específico. Como você pode adivinhar a partir do seu nome, esta classe fornece uma lista de estratégias de tipo CStrategy, mas sua operação é um pouco mais complicada que a operação de um contêiner de dados usual. O módulo resolve as seguintes tarefas: assegurando a operação simultânea de várias estratégias comerciais que oferecem eventos comerciais para cada instância de estratégia, criando objetos de estratégia a partir da interação unificada de estratégias XML (desserialização de dados) com o painel personalizado usado para configuração de EA. Aqui está o cabeçalho da classe CStrategyList: como você pode ver, a maioria dos métodos apresentados são manipuladores de eventos comerciais. Eles têm conteúdo do mesmo tipo. Vamos analisar um deles, OnBookEvent: Como visto nos conteúdos da aula, ele busca estratégias CStrategy na lista e convoca um evento apropriado em cada uma das estratégias. A operação de outros métodos de eventos é semelhante. Além da passagem de eventos, o CStrategyList executa procedimentos especiais que carregam estratégias do arquivo XML. Para obter mais informações sobre como funciona, leia a próxima seção. Carregando Estratégias de uma lista XML. Um portfólio de estratégias Se um módulo executável ex5 contém múltiplos algoritmos de negociação, precisamos de ferramentas para gerar um portfólio de estratégias. Suponha que dois algoritmos com diferentes parâmetros trocam em um módulo executável. Como configurar esses parâmetros A coisa mais simples é produzir os parâmetros de cada estratégia na janela de propriedades de EA. Mas o que fazer quando são utilizadas muitas estratégias, cada uma das quais tem muitos parâmetros. Neste caso, a lista de parâmetros com diferentes modificadores, sinalizadores, strings e comentários seria enorme. Essa é a aparência da janela de parâmetros de um Consultor Especial que comercializa três estratégias: Fig. 1. A lista de parâmetros da EA que negocia três estratégias. Um Consultor Especialista pode usar ainda mais estratégias. Nesse caso, a lista de parâmetros pode ter tamanho inimaginável. O segundo aspecto importante da negociação do portfólio está criando estratégias sobre o fluxo. Suponhamos que queremos executar a mesma estratégia com dois conjuntos diferentes de parâmetros. O que devemos fazer Obviamente, apesar dos diferentes conjuntos de parâmetros, essas duas estratégias são uma e a mesma estratégia, embora com diferentes configurações. Em vez de criar cada uma das estratégias manualmente, podemos confiar esta tarefa a uma classe separada. A classe pode criar automaticamente um objeto de estratégia e configurá-lo corretamente. Antes de criar uma estratégia sobre o fluxo, é necessário fornecer sua descrição completa. A descrição deve conter os seguintes detalhes: o nome da estratégia um ID de estratégia único ou seu número mágico, o símbolo a estratégia está executando no período de trabalho da estratégia uma lista de parâmetros únicos de estratégias (uma lista individual para cada estratégia). A descrição da estratégia pode conter outras propriedades, além da lista acima. A melhor maneira de fornecer essa descrição é usar XML. O idioma foi criado como uma ferramenta de descrição especial. Ele permite descrever convenientemente objetos complexos, de modo que um objeto como uma estratégia de negociação possa ser convertido em um documento XML de texto e um documento de texto pode ser convertido em uma estratégia. Por exemplo, com base em um documento XML, o mecanismo de negociação pode criar uma estratégia e configurar adequadamente seus parâmetros. Para trabalhar com este tipo de documentos diretamente do MQL5, devemos usar uma biblioteca XML-Parser especial disponível na Base de Código. Aqui está um exemplo da descrição XML de um portfólio que carrega três estratégias de MovingAverage com diferentes parâmetros: Cada uma das estratégias forma a unidade ltStrategygt. Os seguintes atributos são especificados: Símbolo, Prazo, Magia e Nome da Estratégia. Do exemplo acima, vemos que cada uma das três estratégias tem seu próprio símbolo, número mágico e prazo. Além desses parâmetros necessários, outras propriedades da estratégia são especificadas na lista XML. Section ltTradeStateStartgt especifica o modo de negociação no momento do lançamento da estratégia. A seção ltParamsgt contém os parâmetros da estratégia. No início, o mecanismo de negociação tentará carregar as estratégias de negociação a partir do arquivo XML acima. Uma estratégia é carregada e cria com base neste documento na classe CStrategyList no seu método LoadStrategiesFromXML. Abaixo estão os conteúdos deste método, bem como de todos os métodos relacionados: A parte mais interessante dos métodos é a criação de uma estratégia usando o método estático especial CStrategy :: GetStrategy. O nome da estratégia deve ser passado para ele como um parâmetro. O método retorna uma instância específica da estratégia associada a esse nome. O método foi feito estático para permitir o acesso antes de criar um objeto de estratégia. O GetStrategy está escrito em um arquivo de cabeçalho separado, pois, ao contrário de outras partes do mecanismo de negociação, você precisará editá-lo de vez em quando, adicionando novas estratégias a ele. Se você deseja que sua estratégia seja carregada a partir de XML, seu procedimento de criação deve ser adicionado diretamente a este método. O código-fonte deste arquivo de cabeçalho é o seguinte: uma vez que a estratégia foi criada, ele deve ser inicializado com os parâmetros necessários da seção ltParamsgt. Uma vez que os parâmetros de cada estratégia são únicos, não é possível inicializar esses parâmetros ao nível do mecanismo de negociação. Em vez disso, a classe base da estratégia pode chamar o método virtual ParseXmlParams. Se a estratégia substituir este método e analisar corretamente a lista de parâmetros como um nó XML, ele poderá especificar os valores necessários de seus próprios parâmetros. Por exemplo, veja o método ParseXmlParams da estratégia CMovingAverage que negocia com base em duas médias móveis (seu algoritmo é descrito no primeiro capítulo deste artigo). Os detalhes desta estratégia são descritos no terceiro artigo da série, que abrange o desenvolvimento de estratégias personalizadas. Usando o mecanismo de criação de estratégia a partir de um arquivo, é possível configurar um conjunto de estratégias uma vez, e depois carregá-lo a partir de um arquivo a cada vez. Você pode ir ainda mais longe e escrever um algoritmo de auto-otimização que economiza os conjuntos de parâmetros de suas melhores execuções para um arquivo XML. O mecanismo de negociação lê este arquivo na inicialização e formará um conjunto de estratégias por sua base. Gerenciando estratégias usando um painel personalizado Do ponto de vista do usuário, as estratégias podem ser convenientemente controladas usando um painel personalizado especial. Este painel seria exibido em um gráfico após o lançamento da EA e permitiria realizar operações simples com cada um dos algoritmos de negociação: alterar o modo de negociação da estratégia de comprar ou vender o volume desejado em vez da estratégia. A última opção é útil se a EA não tiver executado a ação apropriada por algum motivo, e você precisa sincronizar seu estado com a situação atual do mercado. A descrição das classes que criam painéis personalizados e caixas de diálogo está além do escopo do assunto discutido e requer um artigo separado. Nós apenas descreveremos os aspectos básicos relacionados à conexão do painel. O painel de controle Expert Advisor é implementado em uma classe CPanel separada que inclui vários controles, como listas, botões e rótulos de texto. Todas as classes para a criação do gui estão disponíveis em ltdatafoldergtMQL5IncludePanel. Para garantir a operação do painel, é necessário lidar com o evento OnChartEvent diretamente no arquivo EAq mq5. O manipulador de eventos de gráfico está localizado na classe CStrategyList, por isso basta chamar este manipulador no OnChartEvent: O manipulador desses eventos em CStrategyList os envia diretamente para o painel. Com um clique em qualquer botão no painel, ele define a ação a ser executada e executá-la. Por exemplo, se selecionarmos uma estratégia da lista de estratégias, o índice da estratégia atual será igual ao selecionado, então você poderá realizar mais ações de negociação. Por exemplo, você pode alterar o modo de negociação da estratégia eleita, selecionando a opção apropriada na lista suspensa dos modos de estratégia: Fig. 2. A lista de modos de uma estratégia selecionada A compra e venda em nome da estratégia selecionada é realizada da mesma maneira. Um ponteiro para a estratégia chama os métodos de compra e venda da classe base CStrategy. Esses métodos compram e vendem o volume passado neles. Nesse caso, o número mágico nas operações realizadas corresponde ao número mágico da estratégia, por isso é impossível distinguir a negociação manual das ações EAs. Deve-se notar que a lógica de negociação da EAs é implementada para que todas as posições abertas por um usuário sejam mantidas por esse Consultor Especial no modo normal. Ele gerencia tais posições como suas próprias posições abertas automaticamente. Expert Advisors Trading in a Group Nós podemos montar um portfólio de estratégias de negociação. As estratégias devem conter métodos responsáveis ​​pela análise de parâmetros XML, ou seja, precisamos substituir o método ParseXmlParams. Também é necessário adicionar a criação do tipo de estratégia apropriado ao método CStrategy :: GetStrategy. Finalmente, precisamos criar um arquivo XML com uma lista de estratégias e seus parâmetros. Depois disso, a classe CStrategyList criará instâncias de estratégias e as adicionará à sua lista de estratégias. O painel personalizado exibirá essas estratégias depois disso. Deixe-nos criar um portfólio de estratégias que consistem no Expert Advisors descrito acima. Exemplos de análise de configurações XML para as estratégias CMovingAverage e CChannel estão disponíveis nas seções 3.5 e 4.3. O conteúdo da CStrategy :: GetStrategy para a criação das duas estratégias será o seguinte: o toque final é substituir o método responsável pelo nome completo do EAs. Execute a substituição pela estratégia CMovingAverage: agora tudo está pronto para criar um portfólio de estratégias. Nosso portfólio incluirá quatro sistemas de negociação. Cada um deles trocará seu próprio símbolo. Duas estratégias serão baseadas em MovingAverage, e outras duas usarão BollingerBands. Uma descrição mais detalhada dessas estratégias está disponível no artigo anterior: Universal Expert Advisor: Estratégias Personalizadas e Classes de Comércio Auxiliar (parte 3). Nosso portfólio XML será o seguinte: Este arquivo deve ser salvo uma pasta de dados comum da plataforma MetaTrader como Strategies. xml. Aqui está o código-fonte do módulo mq5 que cria um Expert Advisor: Variáveis ​​personalizadas StrategiesXMLFile e LoadOnlyCurrentSymbol são definidos na classe CStrategyList. Eles são usados ​​dentro desta classe para especificar a lista de estratégias a serem carregadas eo modo que permite apenas carregar as estratégias com o símbolo igual ao nome do instrumento em que o Consultor Especial está em execução. Observe também que alguns eventos, como OnBookEvent e OnTimer, não são usados. Isso significa que eles não serão usados ​​em estratégias personalizadas. A compilação deve ser bem sucedida. Depois disso, o Expert Advisor (chamado Agent. ex5 no projeto) está pronto para uso. Vamos tentar executá-lo no gráfico. Antes disso, devemos garantir que todos os símbolos usados ​​estejam disponíveis no MetaTrader Market Watch. Após o início bem sucedido, o ícone Expert Advisor aparecerá no canto superior direito do gráfico. Outro botão é adicionado ao canto superior esquerdo do gráfico, maximizando o painel personalizado. Se selecionarmos a lista de EAs (chamado Agente) no painel, uma lista de quatro Consultores Especialistas será aberta: Fig. 3. Lista de consultores especializados experientes A captura de tela possui a lista de Expert Advisors formada pelo nosso arquivo XML Strategies. xml. Depois de um tempo, as estratégias começarão a negociar cada estratégia em seu símbolo individual. Analisando Operação de Consultor Especialista no Strategy Tester Tendo gerado um portfólio de estratégias, podemos testá-lo no Strategy Tester para garantir que ele funcione corretamente. Nenhuma ação específica adicional é necessária, porque a lista XML de estratégias está localizada na pasta de dados global, acessível através do Strategy Tester. Após o lançamento do módulo Agent. ex5 EA, todos os símbolos necessários serão carregados automaticamente. Cada Consultor Especial realizará operações de negociação seguindo suas regras de negociação individuais e, adicionalmente, desenhará seu próprio conjunto de indicadores. O video abaixo mostra o teste de um portfólio de estratégias em quatro instrumentos diferentes: a simulação de estratégias baseadas no CStrategy no Strategy Tester é semelhante à negociação em tempo real usando essas estratégias. A opção de teste visual permite que você verifique facilmente a precisão das entradas e saídas das estratégias. Conclusão Consideramos algoritmos que permitem criar conjuntos aleatórios de estratégias de negociação. Com esses conjuntos ou carteiras de estratégias, você pode escalar de forma flexível e eficiente o processo de negociação, enquanto gerencia vários algoritmos de negociação localizados no mesmo módulo executável. Os algoritmos são particularmente úteis para as estratégias que utilizam múltiplos instrumentos comerciais simultaneamente. Usando a abordagem proposta, criar algoritmos de negociação semelhantes é tão fácil quanto desenvolver estratégias de negociação convencionais.

No comments:

Post a Comment