English Русский 中文 Español Deutsch 日本語
Trading automatizado não padrão

Trading automatizado não padrão

MetaTrader 4Sistemas de negociação | 22 fevereiro 2016, 11:51
833 0
Leonid Borsky
Leonid Borsky

Introdução

Trading bem sucedido e confortável utilizando a plataforma MT4 sem análise detalhada do mercado - é possível? Esse tipo de trading pode ser implementado na prática?

Acredito que sim.

Especialmente em termos de trading automatizado! MQL4 permite fazer isso. O sistema de trading automatizado descrito adicionalmente é caracterizado por boa repetição. E ele pode ser facilmente implementado até mesmo por iniciantes que estão apenas começando a se familiarizar com as noções básicas de escrever Expert Advisors.

O sistema em si é, na verdade, um reflexo do mundo exterior. O desenvolvimento harmonioso da vida dita as suas leis. Quando crianças, observamos a seguinte cena: formigas segurando uma palha de diferentes lados e levando-a para um formigueiro. Cada formiga puxa a palha de sua própria maneira. No entanto, finalmente, a palha é carregada em direção ao formigueiro! Um segredo da natureza? Vamos tentar simular a situação em uma plataforma de trading.

Sistema de trading automatizado não padrão

Suponha que temos algum sistema de trading automatizado de tipo lucrativo. O sistema atende os seguintes requisitos:

  1. Os sinais de entrada são praticamente aleatórios.
  2. O sistema está constantemente no mercado, isto é, opera com posições contra-dirigidas ao invés de paradas - isto é importante.
  3. Usa vários parâmetros estáticos localizados na entrada, nós otimizamos o sistema a fim de obter o máximo de lucro com um levantamento de crédito razoável.

Praticamente, este sistema dará lucro anual +3000 pontos mesmo sem um bloco de gestão financeira. Depois disso, habilitamos este sistema em um modo reverso. Em outras palavras, agora ele operará da seguinte forma:

  1. Se estivéssemos comprando em um modo direto, agora estaríamos vendendo e vice-versa. Depois disso, mais uma vez, otimizamos o sistema usando parâmetros estáticos. E na saída da versão inversa obtemos o máximo de lucro com um levantamento de crédito razoável. Isto não deve causar problemas, porque o nosso sistema de trading automatizado é originalmente construído em entradas aleatórias.
  2. Depois disso, iniciamos simultaneamente ambas versões - direta e reversa. A operação simultânea de ambas as versões é um momento muito importante, é um momento crucial do sistema de trading descrito!

Vamos ver o que conseguimos.

Em uma partida simultânea de ambos os sistemas - direto e reverso, fazemos um lucro duplo. No entanto, os sistemas operam em modos de contagem, ou seja, opostos um ao outro, de forma consciente, não cegamente! Além disso, reduzimos as perdas totais - levantamento de crédito atual. E por que os sistemas operam de forma consciente, não cegamente?

A razão é que, por causa de outros parâmetros estáticos, já em três e quatro trades após o início, o sistema reverso vai realizar o trade com alguma mudança no tempo e no preço, quando comparado com o sistema direto. Ainda assim, o algoritmo de entrada no modo reverso é o mesmo.

Mas o lucro total aumentará progressivamente! Eu acho que é óbvio, enquanto ambos os sistemas - direto e reverso, são otimizados para uma operação de lucro. Além disso, as perdas atuais de uma versão serão quase sempre cobertas pelo lucro atual de uma outra versão! Consequentemente, obtemos o máximo de lucro e o mínimo levantamento de crédito.

O aumento das exigências de margem é uma desvantagem. Mas esse fato pode ser chamado de desvantagem? Na verdade, existem dois sistemas independentes de trading em funcionamento - direto e reverso. E, naturalmente, o requisito de margem será o dobro. E, contando que os riscos sejam calculados, eles serão suficientemente reduzidos! Esta é a ideia principal - não para aumentar o lucro, mas para reduzir ao máximo o levantamento de crédito. Mas uma coisa leva a outra. E, mais uma vez, o lucro total de tal trading aumentará progressivamente. Consequentemente, agora podemos habilitar o bloco de gestão financeira.

O site MQL4.community contém uma grande variedade de diferentes Expert Advisors, incluindo os que satisfazem os requisitos acima listados. O próprio mercado nos faz colocar novas tarefas e encontrar diferentes soluções! Podemos também encontrar possibilidades para pesquisas futuras.

Para a realização da ideia e novas experiências, utilizamos um Expert Advisor de Yury Reshetov que tem como base "inteligência artificial", descrito anteriormente na mesma parte (veja o artigo de Y. Reshetov "Como encontrar um sistema de trading lucrativo". Isto foi utilizado com algumas alterações e adições, em particular, inclui uma opção de chamar um outro indicador básico para o funcionamento do Perceptron. Também possui algumas condições adicionais para uma maior abertura e acompanhamento das posições.

Aqui estão alguns resultados da experiência, adquiridos durante o teste do par GBPUSD no calendário H1. O depósito inicial é 10.000 unidades. Histórico de 2 anos e meio - de janeiro de 2005 até maio de 2007.

A versão direta continha 250 trades neste período. A reversa continha 360 trades. O número de trades é diferente pois o nível de paragem de perdas durante a otimização foi diferente para cada versão. O lucro líquido em ambos os casos é de aproximadamente +10.000. Durante a operação com montante-0,1, não habilitando o bloco de gestão financeira, trades rentáveis e com perdas estão na proporção 3:2 em ambas as versões.

Aqui estão os exemplos dos gráficos de balanço/equidade das versões direta e reversa sobre o histórico:

Você pode ver que na maioria dos casos trades com perdas na versão direta são cobertos por trades rentáveis da versão reversa. E vice-versa - as perdas da versão inversa são cobertas pelos lucros da versão direta.

Além disso, quando um gráfico contém estabilidade, outro contém tendência de alta! Finalmente temos o máximo de lucro total com riscos mínimos, ou seja, com levantamento de crédito mínimo. Isto não causará problemas para reunir o histórico de todos os trades no Excel e desenhar um gráfico resultante, visualizando a ideia descrita.

O próximo passo é habilitar o bloco de gestão financeira. Podemos esperar, que ativar esse bloco durante esse trade melhorará significativamente os resultados finais em termos de lucro, levantamento de crédito e a conveniência do trading. Nas versões direta e reversa eu incluí a chamada da biblioteca de cálculos "b-lots". Kim. Ela é facilmente incluída no código-fonte e funciona muito bem: https://www.mql5.com/pt/code/8048

Durante o teste eu usei o método proporcional de calcular montantes (LotsWayChoice = 2), o que dá um levantamento de crédito mínimo razoável com relativamente bons lucros (Ryan Jones, "The Trading Game: Playing by the Numbers to Make Millions"). Os resultados são muito bons, em comparação com outros métodos de cálculos de montantes, que muitas vezes mostram grandes lucros com grande levantamento de crédito.

Vamos ver o mesmo histórico, de janeiro de 2005 até maio de 2007. Os resultados do teste com os mesmos parâmetros, como anteriormente:

Versão reversa:

  • Lucro líquido +79.864
  • Levantamento de crédito máximo 16.969 (24%)
  • Levantamento de crédito relativo 33% (3.511)

Versão direta:

  • Lucro líquido +196520
  • Levantamento de crédito máximo 25801 (12,3%)
  • Levantamento de crédito relativo 18,14% (6972)

Aqui estão os gráficos de balanço:

Estes gráficos também mostram muito bem como as perdas atuais são cobertas pelos lucros da versão reversa. Eu acho que a conveniência de tal trading é evidente.

Uso prático

Como exemplo e para outras experiências primárias, aqui está um código de uma versão reversa que funciona ao contrário da versão direta da variante do autor do Expert Advisor "AI" por Y. Reshetov. Uma versão direta e sua descrição está localizada em: https://www.mql5.com/pt/code/10289

Além disso, o arquivo em anexo contém o indicador Perceptron (o autor - Sem nome da Ucrânia, Kremenchug), que permite controlar visualmente o trabalho atual do Expert Advisors (direto e reverso), e saber de antemão, em que direção uma nova posição será aberta. Aqui, configure os valores dos coeficientes X1-X4 do indicador Perceptron iguais aos valores do EA correspondente. Aqui está um exemplo da versão reversa:

Para aqueles, que só começaram a trabalhar com MQL4, eu tentei dar comentários máximos sobre a operação EA. As saídas do Perceptron desta versão de operação reversa são exibidas no gráfico no canto superior esquerdo:

//+------------------------------------------------------------------+
//|                                 ArtificialIntelligenceRevers.mq4 |
//|                               Copyright й 2006, Yury V. Reshetov |
//|                                Modifed by   Leonid553            |
//|                                  http://www.tradersforum.net.ru/ | 
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499"
#property link      "http://reshetov.xnet.uz/"
//---- input parameters
extern int    x1 = 88;
extern int    x2 = 172;
extern int    x3 = 39;
extern int    x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int    MagicNumber = 808;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
     Comment(perceptron());   
// Wait for the formation of a new candlestick
// If a new candlestick appears, check for the possibility of a trade 
   if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
//----
   if(IsTradeAllowed()) 
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     } 
   else 
     {
       prevtime = Time[1];
       return(0);
     }
   int ticket = -1;
   // check for opened position
   int total = OrdersTotal();   
   for(int i = 0; i < total; i++) 
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY) 
              // if a long position is opened and ...
             {
               // check profit 
               // the current profit is larger than the value of =(stoploss + spread) and ...
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point)) 
                 {               
                   if(perceptron() > 0) 
                     { 
                       // perceptron is more than zero, then turn to Sell
                       // reverse
                       ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, 
                         Ask + sl * Point, 0, "AI", MagicNumber, 
                                          0, Red); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//if perceptron is less than zero, trail the stoploss to the distance =sl 
//from the current price                 
  { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Bid - sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }  
               // short position is opened
             } 
           else 
             {
               // if a short position is opened and ...
               // check profit 
              if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) 
                 {
                  // the current profit is larger than the value of =(stoploss + spread) and ...
                   if(perceptron() < 0) 
                     { 
                       // perceptron is less than zero, then turn to Buy
                       // reverse
                       ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3, 
                           Bid - sl * Point, 0, "AI", MagicNumber,
                                          0, Blue); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//if perceptron is more than zero, trail the stoploss to the distance =sl 
//from the current price
                   { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Ask + sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }  
                     }
                 }  
             }
           // exit
           return(0);
         }
     }
//********************************************************************
   // check for long or short position possibility
   // initial entrance to the market:
 
   if(perceptron() < 0) 
     { 
       // if the perceptron is less than zero, open a long position :
       // long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, 
                      "AI", MagicNumber, 0, Blue); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     } 
   else 
     // if the perceptron is more than zero, open a short position:
     { 
       // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, 
                      "AI", MagicNumber, 0, Red); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
//--- exit
   return(0);
  }
//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron() 
  {
   double w1 = x1 - 100.0;
   double w2 = x2 - 100.0;
   double w3 = x3 - 100.0;
   double w4 = x4 - 100.0;
   double a1 = iAC(Symbol(), 0, 0);
   double a2 = iAC(Symbol(), 0, 7);
   double a3 = iAC(Symbol(), 0, 14);
   double a4 = iAC(Symbol(), 0, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+}

Deve-se notar, porém, que o principal significado da tática de negociação descrita não está neste Expert Advisor em particular. Mas pelo contrário, é na cooperação das versões direta e reversa de qualquer Expert Advisor apropriado, tal como explicado no início do artigo. E aqui estão diferentes variantes possíveis: você pode ter várias versões reversas - criadas e otimizadas em critérios diferentes, de acordo com o algoritmo inicial da versão direta. A escolha aqui é bastante ampla.

Trabalhando mais adiante nessa ideia, gostaria de oferecer suporte de desenho e linhas de resistência. Ou anexar o indicador MA ou qualquer outro indicador apropriado para o gráfico de balanço. Neste caso, mediante os sinais indicadores que poderiam de alguma forma manipular a proibição de trades em cada versão. Eu acho que é programável.

Mas é em perspectiva.


Conclusão

Posso pressupor as objeções dos céticos - e se ambas as versões começarem a trabalhar com perda?

Bem, isso pode acontecer em casos excepcionais. Mas não mais do que isso - "nada é ideal neste mundo". No entanto, em entradas praticamente acidentais, ambas as versões trabalham em sinais de um indicador e em direções contrárias - uma contra a outra!

Combinando as duas versões em um Expert Advisor, temos uma ferramenta eficiente para gestão adicional de um portfólio de trading. E para novas experiências.




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

Arquivos anexados |
AI_REVERS.mq4 (6.98 KB)
Teste de Visualização: Gráficos do status da conta Teste de Visualização: Gráficos do status da conta
Aproveite o processo de testes com gráficos exibindo o balanço, agora toda a informação necessária está sendo visualizada!
Linguagem MQL4 para Iniciantes. Perguntas difíceis em frases simples Linguagem MQL4 para Iniciantes. Perguntas difíceis em frases simples
Este é o segundo artigo da série "Linguagem MQL4 para Iniciantes". Agora vamos examinar mais construções complexas e avançadas da linguagem, aprender novas opções e ver, como elas podem ser aplicadas na prática diária. Você vai se familiarizar com um novo tipo de ciclo ''enquanto'', um novo tipo de condição ''troca'', operadores ''pausa'' e ''continuação". Além disso, você vai aprender a escrever suas próprias funções e trabalhar com matrizes multidimensionais. E de bônus, preparei uma explicação sobre um pré-processador.
MT4TerminalSync - Sistema para sincronização de terminais MetaTrader 4 MT4TerminalSync - Sistema para sincronização de terminais MetaTrader 4
Este artigo é dedicado ao tema "Ampliando as possibilidades de programas MQL4 utilizando funções de sistemas operacionais e outros meios de desenvolvimento do programa". O artigo descreve um exemplo de um sistema de programa que implementa a tarefa da sincronização de várias cópias de terminais com base num único molde de origem.
Previsão de preços utilizando redes neurais Previsão de preços utilizando redes neurais
Muitos operadores falam sobre redes neurais, mas o que elas são e o que elas realmente podem fazer é conhecido por poucas pessoas. Este artigo lança alguma luz sobre o mundo da inteligência artificial. Ele descreve como devemos preparar corretamente os dados para a rede. Você também encontrará um exemplo de previsão por meio do programa Matlab.