English Русский 中文 Español Deutsch 日本語
preview
Experiências com redes neurais (Parte 3): Uso pratico

Experiências com redes neurais (Parte 3): Uso pratico

MetaTrader 5Experts | 27 abril 2023, 09:26
463 0
Roman Poshtar
Roman Poshtar

Introdução

Boa tarde, queridos usuários da comunidade MQL5. Nos anteriores artigos Experiências com redes neurais (Parte 1): Lembrando a Geometria  e Experiências com redes neurais (Parte 2): Otimização inteligente de redes neurais, compartilhei com vocês minhas observações e experimentos com redes neurais. A otimização dos Expert Advisors resultantes e as explicações de seu funcionamento foram realizadas principalmente. No entanto, abordamos pouco a temática da aplicação prática dos resultados obtidos. O objetivo principal deste artigo é corrigir esse infeliz mal-entendido.

Vamos aplicar os resultados obtidos na prática e também conhecer um novo algoritmo que nos permite expandir as capacidades de nossos Expert Advisors. Dessa forma, vamos unir, por assim dizer, toda a cadeia e, finalmente, analisar o teste forward do que foi desenvolvido. Como sempre, usamos apenas as ferramentas do MetaTrader 5, sem recorrer a softwares de terceiros. Este artigo provavelmente se assemelhará a um tutorial passo a passo. Da minha parte, tentarei explicar tudo da forma mais clara e simples possível.


1. Ideia a ser aplicada

Ao otimizar os dois sistemas anteriores, obtivemos alguns resultados com os melhores indicadores do fator de lucro ou critério complexo, bem como um conjunto de pesos para nossos perceptrons e redes neurais. Depois de testar os resultados alcançados, obtivemos indicadores bastante aceitáveis. A ideia principal dessa melhoria é unir todos os resultados da otimização em um único Expert Advisor e fazê-los funcionar simultaneamente. Concordamos que não é muito conveniente manter 10 gráficos abertos com dez Expert Advisors. Além disso, isso permitirá analisar os resultados de forma abrangente, utilizando, por exemplo, 10 a 20 parâmetros ao mesmo tempo.


2. Par de moedas, alcance da otimização e testes avançados, bem como opções

Aqui vou fornecer todos os parâmetros para otimização e teste para que não se repitam no texto:

  • Mercado Forex;
  • Par de moedas EURUSD;
  • Período H1;
  • Indicadores: 2 indicadores TEMA com períodos 1 e 24. O MA teve que ser abandonado, pois o indicador TEMA se mostrou melhor em vários testes.
  • StopLoss e TakeProfit para as correspondentes modificações de 600 e 60;
  • Modo de otimização e teste "Somente preços de abertura" e "Máximo de critério complexo". É muito importante usar o modo "Máximo critério complexo", já que mostrou resultados mais estáveis e lucrativos em comparação com "Máxima lucratividade";
  • Faixa de otimização de 3 anos. De 2018.12.09 a 2021.12.09. 3 anos não é nenhum critério. Você pode tentar mais ou menos sozinho;
  • Intervalo de teste forward de 1 ano. De 2021.12.09 a 2022.12.09;
  • Em todos os testes forward, foram usados 20 resultados de otimização simultaneamente;
  • Otimização de Expert Advisors com perceptron "Rápido ( algoritmo genético)";
  • Otimização de Expert Advisors na biblioteca DeepNeuralNetwork.mqh "Lento (iteração completa de parâmetros)";
  • Depósito inicial de 10 000;
  • Alavancagem 1:500.

3. EAs no Perceptron

 Com base em inúmeras observações, verificou-se que a profundidade dos pesos de 200 nos Expert Advisors com perceptrons não é necessária. Basta ter 20. Por isso, o código do perceptron e os parâmetros de otimização foram alterados. Agora otimizamos os pesos a partir de 0 com incrementos de 1 até 20.

Também foi introduzido um novo parâmetro chamado "Param", responsável pela profundidade de entrada no lado positivo ou negativo do perceptron. Esse parâmetro influenciou a quantidade de negociações e sua precisão. O número de negociações diminuiu, mas a precisão aumentou.

 Cada um dos sistemas utiliza dois Expert Advisors. O primeiro para otimização e o segundo para o trabalho direto. A divisão das ordens foi feita através de comentários nas mesmas, sendo este o método mais simples e conveniente. O número único da ordem corresponde ao seu número sequencial na própria amostra. A amostra é um arquivo com os resultados de otimização obtidos. Para limitar a quantidade de trabalhos simultâneos, utiliza-se o parâmetro MaxSérie.

for(int i=0; i<=(ArraySize(EURUSD)/6)-1; i++){
 comm=IntegerToString(i);
 x1=(int)StringToInteger(EURUSD[i][0]);
 x2=(int)StringToInteger(EURUSD[i][1]);
 x3=(int)StringToInteger(EURUSD[i][2]);
 x4=(int)StringToInteger(EURUSD[i][3]);
 
 Param=(int)StringToInteger(EURUSD[i][4]);

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

}

 Novo código perceptron:

1 perceptron 4 angle SL TP e 1 perceptron 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

1 perceptron 8 angle SL TP e 1 perceptron 8 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

2 perceptronа 4 angle SL TP e 2 perceptronа 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

double perceptron2() 
  {
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

 Código de ativação da entrada:

1 perceptron 4 angle SL TP e 1 perceptron 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

1 perceptron 8 angle SL TP e 1 perceptron 8 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

2 perceptronа 4 angle SL TP e 2 perceptronа 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (perceptron2()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (perceptron2()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

 Configurações da otimização:

1 perceptron 4 angle SL TP e 1 perceptron 4 angle

Configurações da otimização 1

1 perceptron 8 angle SL TP e 1 perceptron 8 angle

Configurações da otimização

2 perceptronа 4 angle SL TP e 2 perceptronа 4 angle

Configurações da otimização


3.1 Expert Advisor 1 perceptron 4 angle SL TP

Para sair esta modificação do EA usa Stop Loss e Take Profit. Estratégia 1 perceptron e 4 ângulos de inclinação para os indicadores TEMA. Otimizamos 10 vezes. Esquemas de ângulos de inclinação e princípios de otimização podem ser encontrados no primeiro artigo, não vamos repetir aqui.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

Grande número de resultados de critério complexo - 99,99. Alto nível de fator de lucro - 4-8.

 Assim, exportamos o resultado para excel. Deixamos os primeiros 100 melhores resultados, excluímos todo o resto. Apagamos todas as colunas, exceto x1, x2, x3, x4 e Param.  Salvamos em um arquivo csv (os separadores são vírgulas). Eu nomeei o arquivo EURUSD para maior clareza. Podemos carregar esse formato no código do EA como uma matriz de texto.  Deve ficar como mostrado na figura abaixo.

Resultado da otimização

Inserimos nosso arquivo no código através do menu do MetaEditor.

Resultado da otimização

Obtemos uma matriz de texto com resultados de otimização prontos para uso.

string EURUSD[][6]=
  {
   {"19","1","3","6","1100"},
   {"20","1","4","6","1000"},
   {"20","0","4","4","1200"},
   {"19","0","6","4","1100"},
   {"19","1","5","4","1100"},
   {"17","0","7","4","1100"},
   {"19","1","3","8","1000"},
   {"20","0","4","3","1300"},
   {"17","0","7","0","1400"}
  };

Compilamos e realizamos testes forward. 

teste forward

Temos bons resultados. Vemos uma subida constante durante todo o ano.


3.2 Expert Advisor 1 perceptron 4 angle

Esta modificação do EA não usa Stop Loss e Take Profit. É usado o fechamento por sinal do perceptron.

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, 0, 0, EAComment);
}

if ((perceptron1()>0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, 0, 0, EAComment);
}

if ((perceptron1()<0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY);
}

Resultado da otimização:

Resultado da otimização


Resultado da otimização

O resultado do critério complexo é ligeiramente inferior ao do caso anterior. O fator de lucro é de 2-2,5.

Resultado do teste forward:

Resultado do teste forward

A linha de saldo reproduz o resultado anterior com rebaixamentos mais profundos.


3.3 Expert Advisor 1 perceptron 8 angle SL TP

Para sair, essa modificação do Expert Advisor usa Stop Loss e Take Profit. A estratégia é 1 perceptron e 8 ângulos de inclinação para os indicadores TEMA.

Para esse Expert Advisor, temos de preparar um arquivo  Excel conforme mostrado na figura abaixo. Aqui, otimizamos 9 parâmetros x1, x2, x3, x4, y1, y2, e3, y4 e Param.

Resultado da otimização

Resultado da otimização:

Resultado da otimização


Resultado da otimização

O resultado do critério complexo é alto. Fator de lucro é de 2,5-3.

Resultado do teste forward:

Resultado do teste forward

A linha de saldo não é muito estável. Há grandes rebaixamentos. Mas o resultado é positivo.


3.4 Expert Advisor 1 perceptron 8 angle

Não usamos StopLoss e TakeProfit. Fechamento pelo sinal reverso do perceptron. Estratégia 1 perceptron e 8 ângulos de inclinação para os indicadores TEMA.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

O resultado do critério complexo é alto. Fator de lucro é de 2,5-3.

Resultado do teste forward:

Resultado do teste forward

A linha de saldo é estável. Temos bom aumento no depósito ao longo do ano. Os rebaixamentos não são tão grandes.


3.5 Expert Advisor 2 perceptron 8 angle SL TP

São usados Stop Loss e Take Profit. A estratégia é de 2 perceptrons, 4 ângulos de inclinação no primeiro e 4 ângulos de inclinação no segundo, e são diferentes.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

O resultado do critério composto é 99,99. O fator de lucro dos resultados é quase o mesmo: 4,3.

Resultado do teste forward:

Resultado do teste forward

Vemos uma linha de saldo em forma de dente de serra. Temos lucro anual.


3.6 Expert Advisor 2 perceptron 8 angle

Sem StopLoss e TakeProfit. Estratégia 2 perceptrons, 4 ângulos no primeiro e 4 ângulos no segundo, e são diferentes. Fechamento pelo sinal de retorno do perceptron.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

Resultado do critério composto em 99,8. Fator de lucro dos resultados no intervalo de 2,8 a 3,2.

Resultado do teste forward:

Resultado do teste forward

Temos uma linha de saldo em forma de dente de serra, não estável. Temos lucro anual. Grandes rebaixamentos no final do ano.


4. Expert Advisors na biblioteca DeepNeuralNetwork.mqh

Hoje, nossas experiências incluem 4 Expert Advisors baseados na biblioteca DeepNeuralNetwork.mqh: Angle 4-4-3 SL TP e Angle 8-4-3 SL TP, em que o Stop Loss e o Take Profit serão usados para fechá-los. Assim como o Angle 4-4-3 e o Angle 8-4-3, em que o sinal de fechamento será proveniente da rede neural.  Em todos eles, são usados ângulos de inclinação como estratégia. Os números apresentados na segunda parte de nossos experimentos não são usados hoje.

Código com StopLoss e TakeProfit:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

Código de fechamento da rede neural:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

//CLOSE ALL++++++++++++++++++++++++++++++++++++++++++
if (yValues[2]>LL){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
}

Agora aplicaremos um esquema mais complexo. Em cada conjunto, temos 3 Expert Advisors, o primeiro para otimização, o segundo para converter os resultados obtidos em uma matriz de texto. E o terceiro é usado diretamente para testar e trabalhar com a matriz resultante.

Como lembramos, durante a otimização, nosso Expert Advisor cria um arquivo CSV com o conjunto de pesos otimizados no caminho "C:\Users\Your username\AppData\Roaming\MetaQuotes\Terminal\Common\Files". Você precisa copiar o arquivo do relatório de otimização no formato CSV para essa pasta.

No gráfico do par de moedas, instalamos o Expert Advisor com o nome "Angle EA 4-4-3 convert".

EA

Parâmetros do EA para conversão:

  • Param – valor do critério complexo. Caso seja menor, os resultados não serão copiados para a matriz. Eu usei 80;
  • OptimizationFileName1 – arquivo do relatório de otimização no formato CSV;
  • OptimizationFileName2 – arquivo criado pelo EA durante a otimização no formato CSV. Contém os pesos da rede neural;
  • OptimizationFileName3 – arquivo da matriz a ser inserido no Expert Advisor usado. É criado automaticamente.

Você pode observar o processo no log.

Log

Inserimos o arquivo resultante no código do EA "Angle EA 4-4-3 trade":

string Result[][37]=
  {
   {"17293","0.8","-0.1","-0.2","1.0","0.9","0.6","0.4","1.0","0.6","-0.4","0.9","-0.5","0.1","-0.5","-0.5","0.9","-0.1","-0.8","0.4","0.0","-0.1","0.1","0.2","-0.4","-0.7","-0.6","-0.9","-0.8","-0.9","-0.7","-0.5","0.4","0.4","0.8","-0.6"},
   {"18030","0.6","0.2","-0.4","0.9","-1.0","-0.9","-0.9","0.4","-0.9","-0.8","0.4","0.9","0.2","-0.8","0.9","-0.1","-0.6","0.3","0.5","-0.4","0.7","0.6","-0.4","-0.1","0.4","-0.8","0.4","0.9","-0.2","0.0","0.4","-0.6","-0.4","-0.7","0.7"},
   {"13128","0.7","-0.3","0.5","-0.5","-0.5","-0.1","0.8","0.0","0.6","0.9","-0.2","0.8","1.0","0.7","-0.7","-0.2","0.5","0.5","-0.6","0.5","-0.9","-0.5","-0.5","0.5","-0.3","0.5","0.8","0.2","-0.5","-0.2","0.1","-0.1","-0.4","-0.7","0.1"},
   {"10688","0.3","0.0","0.2","-0.1","0.6","0.1","0.1","-0.2","-1.0","0.3","0.2","0.5","-0.8","0.7","0.4","-0.5","-0.4","-0.3","-0.3","-0.9","-0.2","0.0","0.1","0.9","0.3","-0.9","-0.2","-0.2","0.1","0.9","0.8","0.1","0.4","0.8","0.6"},
   {"8356","0.8","0.8","0.7","0.2","0.0","-0.4","0.5","-0.8","0.0","0.9","0.2","-0.1","1.0","0.6","0.2","-0.8","-0.1","-0.5","-0.3","0.0","0.7","-0.5","-0.3","0.0","0.9","-1.0","-0.2","-0.6","-0.7","-0.5","-0.8","0.5","-0.3","-0.1","0.8"},
   {"18542","-0.8","0.9","-0.1","0.5","-0.5","0.3","0.8","-0.4","0.7","0.9","0.4","0.0","-0.2","0.0","0.2","0.5","0.9","0.4","1.0","0.7","0.1","0.1","-0.4","0.0","0.9","0.2","0.0","-0.8","0.1","-0.5","0.1","-0.1","0.1","-0.1","0.6"},
   {"18381","0.7","-1.0","-0.8","0.8","-0.8","-0.4","0.9","0.7","1.0","0.7","0.8","0.5","0.1","-0.3","-0.7","-0.9","-0.2","-0.4","0.8","-0.8","0.0","0.8","-0.5","-0.3","0.2","-0.3","-0.1","0.5","-0.1","0.3","0.0","-0.7","-0.2","-0.3","0.8"},
   {"13795","0.2","0.9","0.4","0.4","0.1","-0.6","-0.6","-0.3","0.7","0.9","0.7","0.0","-0.2","-0.9","-0.8","-0.6","-0.1","-0.4","-1.0","0.7","-0.7","-0.3","0.0","-0.3","-1.0","0.8","-0.9","-0.9","0.1","-0.5","-0.3","-0.7","-0.2","-0.7","-0.8"},
   {"4376","0.9","0.7","-0.6","-0.9","1.0","0.8","0.1","-0.8","0.7","-0.8","0.2","0.1","-0.9","0.8","0.9","-0.4","0.8","0.3","0.0","-0.3","-0.4","0.7","-0.2","0.4","-0.8","-0.2","0.9","0.9","0.2","0.0","0.1","0.5","-0.8","-0.1","0.6"},
   {"14503","0.1","-0.4","-0.7","0.1","-0.1","0.5","-0.7","-0.2","-0.9","0.0","0.2","-0.7","0.3","0.7","-0.7","0.1","0.4","0.3","0.3","-0.5","-0.8","-0.8","-0.7","0.2","-0.7","-0.1","-0.8","0.0","-0.4","0.0","0.1","0.5","-0.3","0.5","0.8"},
   {"12887","0.6","-0.1","0.4","0.6","-0.9","-0.3","0.7","0.2","-0.6","-1.0","0.0","-0.6","0.5","0.3","0.8","0.0","-0.5","-1.0","-0.6","0.6","-0.6","-0.9","-0.3","0.6","0.2","-0.5","0.6","0.2","-0.5","0.3","0.3","-0.9","-0.7","-0.8","0.8"},
   {"16285","0.3","0.3","-0.9","-0.7","-0.1","0.7","-0.7","-0.7","-0.2","-0.5","-0.8","-1.0","-0.1","-0.4","-0.6","1.0","0.3","-0.8","-0.6","1.0","-0.1","0.7","-0.1","0.5","-0.6","0.9","-0.5","0.6","0.2","0.5","-0.4","0.3","-0.6","-0.7","0.7"},
   {"13692","0.8","-0.9","0.6","0.3","-0.2","-0.8","-0.4","0.3","-0.6","0.7","0.7","-0.8","0.5","0.1","-0.2","0.7","-0.7","-0.2","0.7","-0.5","0.9","0.7","0.6","0.8","-0.1","-1.0","-0.8","-0.5","-0.1","-0.9","-0.5","0.2","-0.4","0.8","0.2"},
   {"1184","-0.1","0.1","0.6","-0.2","-0.3","0.0","-0.7","0.1","-0.5","0.1","-0.6","0.0","-0.9","-0.8","0.1","0.5","0.3","-1.0","0.1","-0.8","-0.6","0.0","-0.4","-0.1","-0.7","-0.8","0.6","0.5","0.0","0.9","-0.5","0.2","0.7","0.3","0.9"},
   {"9946","0.4","-0.5","0.9","-1.0","-0.4","-0.7","0.9","0.0","-0.2","0.7","0.7","0.1","0.7","0.4","-0.9","0.1","-0.6","-0.5","0.9","0.8","0.2","-0.9","0.0","0.1","0.9","0.7","0.3","0.6","-0.4","0.8","-0.1","0.2","-0.2","-0.4","0.7"},
   {"6104","0.5","-0.9","-0.1","0.7","-0.7","0.0","0.4","0.3","0.8","-0.7","-0.1","0.1","-0.1","-0.5","-0.5","1.0","-0.1","-0.5","0.5","0.7","-0.8","-0.7","-0.7","0.8","-0.2","-0.5","0.2","-0.6","-0.2","-0.1","-0.4","-0.9","-0.6","-0.1","0.9"},
   {"995","0.9","0.6","0.7","0.1","-0.8","0.3","-0.2","0.3","0.9","-0.1","0.2","0.5","0.9","-0.7","-0.7","-0.7","0.2","0.2","0.4","-0.7","-0.4","-0.2","0.0","-0.2","0.0","0.6","-0.3","-0.6","-0.9","0.8","-0.6","-0.2","0.2","0.5","0.9"},
   {"6922","0.5","0.9","0.1","-0.8","-1.0","-0.1","0.9","0.9","-0.2","0.8","0.8","0.5","-0.3","0.8","-0.2","0.9","-0.6","0.0","0.7","-0.9","0.4","0.7","0.6","-0.1","-0.4","0.5","-0.6","-0.2","-0.5","-0.9","-0.7","-0.6","0.5","-0.6","0.7"},
   {"3676","-0.9","-0.8","-0.5","0.8","0.4","-0.8","-0.4","0.6","0.9","0.9","-0.7","0.6","0.8","-0.9","0.3","0.7","-0.7","0.5","0.8","0.9","0.1","0.5","0.8","0.1","0.9","0.9","0.4","0.3","-0.1","0.4","-0.4","0.4","-0.3","-0.6","0.9"},
   {"6245","-0.1","-0.4","-0.6","0.7","0.6","-0.6","-0.2","0.2","0.0","-0.4","0.0","0.9","-0.3","0.5","-0.2","0.7","0.4","1.0","0.7","-0.1","-0.3","-0.9","-0.5","0.9","0.8","-0.1","-0.5","-1.0","0.3","0.9","-0.4","-0.2","-0.4","-0.3","0.9"},
   {"1039","-0.4","-0.3","-0.6","-0.7","-0.6","0.5","-0.2","-0.9","0.7","0.9","-0.2","-0.6","-0.2","-0.3","0.6","0.1","-0.9","-0.8","0.9","0.3","0.6","0.8","-0.8","0.8","0.6","0.1","-0.2","-0.7","0.6","-0.2","-0.6","0.4","-0.1","-0.2","0.1"},
   {"6615","-0.4","-0.1","-0.7","0.5","-0.9","0.4","-0.9","0.4","-0.4","-0.1","0.7","-0.4","0.4","0.4","-0.8","-0.2","-0.6","-0.1","-0.5","-0.7","0.6","0.0","1.0","0.9","-0.3","0.8","0.8","-0.1","-0.2","0.9","-0.2","0.9","-0.8","-0.6","0.5"},
   {"410","-0.3","0.2","-0.2","-0.2","0.2","-0.5","0.8","0.3","-0.9","-0.9","-0.4","0.3","-0.8","-0.8","0.0","0.9","-0.2","0.0","-0.2","-0.4","-0.1","0.1","-0.4","0.7","1.0","0.1","0.5","0.3","0.1","0.7","0.4","0.0","-0.2","-1.0","-0.1"},
   {"15027","-0.3","-0.4","-0.6","0.3","-0.5","-0.6","0.9","0.5","-0.2","0.0","-0.7","0.7","0.1","0.5","-0.4","-0.4","0.4","0.7","-0.1","0.9","-0.1","0.6","0.5","-0.3","0.6","0.8","0.4","0.1","0.9","-0.5","0.7","0.6","-0.8","-0.1","0.0"},
   {"14157","0.6","-0.7","0.7","0.5","0.8","-0.1","0.9","0.8","0.8","0.7","0.6","-0.3","-0.7","-0.5","-0.2","0.2","0.0","-0.8","0.6","0.9","-0.4","0.1","0.1","0.9","0.7","-0.8","-0.6","-0.5","-0.7","0.1","-0.3","0.9","0.5","0.8","-0.7"},
   {"11367","0.2","-1.0","-0.4","-0.4","-0.3","-0.2","0.2","-0.1","-0.4","0.7","-1.0","-0.5","-0.9","-0.7","-0.4","-0.8","-0.4","0.0","0.2","0.7","-0.2","0.4","0.1","0.0","-0.1","-0.9","0.2","-0.5","-0.6","-0.6","-0.7","-0.2","-0.3","-0.1","0.9"},
   {"3892","-0.7","-0.3","0.8","0.2","-0.3","0.4","0.0","0.3","-0.2","0.7","0.6","0.6","0.7","-0.4","-0.7","0.4","-0.3","-0.8","-0.2","0.0","0.9","0.9","0.3","0.0","0.7","0.1","-0.1","0.1","-0.8","-0.4","-0.5","0.9","-0.7","-0.6","0.2"}
  };


4.1 Expert Advisor Angle 4-4-3 SL TP

Para sair, o EA usa Stop Loss e Take Profit. Estratégia de 4 ângulos de inclinação dos indicadores TEMA.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

Como você pode ver, há muitos bons resultados. Fator de lucro no intervalo de 1,6 a 5. Os valores do critério complexo são superiores a 80 – 27.

Resultado do teste forward:

Resultado do teste forward

Infelizmente, o EA falhou no teste forward. Os resultados são negativos e instáveis.


4.2 Expert Adivsor Angle 4-4-3

O EA usa uma rede neural para sair. Estratégia de 4 ângulos de inclinação para os indicadores TEMA.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

Como podemos ver, houve menos bons resultados para o critério complexo mais de 80, apenas 6. Fator de lucro no intervalo de 1,6 a 1,9.

Resultado do teste forward:

Resultado do teste forward

Com o fechamento da rede neural, o EA apresentou lucro ao longo do ano. O resultado é mais estável do que quando usamos Stop Loss e Take Profit.


4.3 Expert Advisor Angle 8-4-3 SL TP

Para sair, o EA usa Stop Loss e Take Profit. Estratégia de 8 ângulos de inclinação para os indicadores TEMA.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

O fator de lucro dos resultados é menor em comparação com os da rede neural 4-4-3.  Os resultados do critério complexo são mais de 80 – 13.

Resultado do teste forward:

Resultado do teste forward

O resultado esperado é semelhante ao anterior usando StopLoss e TakeProfit. Falha no teste forward.


4.4 Expert Advisor Angle 8-4-3

O EA usa uma rede neural para sair. Estratégia de 8 ângulos de inclinação para os indicadores TEMA.

Resultado da otimização:

Resultado da otimização


Resultado da otimização

Apenas 3 resultados atingiram um valor superior a 80 no critério complexo. O fator de lucro também apresentou valores mais baixos em comparação com os resultados anteriores.

Resultado do teste forward:

Resultado do teste forward

O resultado antecipado não é satisfatório. Vemos uma perda suave no depósito.


Considerações finais

Como podemos ver pelos resultados dos testes forward, nenhum dos Expert Advisors baseados em perceptron teve resultado negativo durante o ano, embora a lucratividade tenha diminuído após 6 meses de operação. Concluímos que é necessário otimizar pelo menos uma vez a cada 6 meses.

No caso dos Expert Advisors baseados na biblioteca DeepNeuralNetwork.mqh, os resultados não são tão bons quanto o esperado, o que pode indicar que a estratégia utilizada precisa ser aprimorada para ser mais efetiva na rede neural.

Em geral, a lucratividade pode ser rastreada pelo fator de lucro da série otimizada, o que nos dá um campo adicional para reflexão.

Para o futuro, destacamos 2 tarefas: verificar os melhores resultados obtidos em outros pares de moedas e em outros períodos gráficos.

Apesar do custo adicional para otimização, é possível criar um portfólio com base nesses sistemas para aumentar a lucratividade.

Em caso de dúvidas, é possível entrar em contato com o fórum ou enviar mensagens privadas. Estarei sempre disponível para ajudar.



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

Arquivos anexados |
EA.zip (1056.16 KB)
Desenvolvendo um sistema de Replay - Simulação de mercado (Parte 08): Travando o Indicador Desenvolvendo um sistema de Replay - Simulação de mercado (Parte 08): Travando o Indicador
Aqui vou mostrar como travar um indicador, usando pura e simplesmente a linguagem MQL5, de uma forma muito interessante e surpreendente.
Algoritmos de otimização populacionais: Algoritmo do morcego Algoritmos de otimização populacionais: Algoritmo do morcego
Hoje estudaremos o algoritmo do morcego (Bat algorithm, BA), que possui convergência incrível em funções suaves.
Algoritmos de otimização populacionais: algoritmo de otimização de forrageamento bacteriano (BFO) Algoritmos de otimização populacionais: algoritmo de otimização de forrageamento bacteriano (BFO)
A base da estratégia de forrageamento de E. coli (E. coli) inspirou cientistas a desenvolverem o algoritmo de otimização BFO. Esse algoritmo apresenta ideias originais e abordagens promissoras para otimização e merece um estudo mais aprofundado.
Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 05): cadeias de Markov Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 05): cadeias de Markov
As cadeias de Markov são uma poderosa ferramenta matemática que pode ser usada para modelar e prever dados de séries temporais em vários campos, incluindo finanças. Na modelagem e previsão de séries temporais financeiras, as cadeias de Markov são frequentemente usadas para modelar a evolução de ativos financeiros ao longo do tempo, ativo esses como preços de ações ou pares de moedas. Uma das principais vantagens dos modelos das cadeias de Markov é sua simplicidade e facilidade de uso.