Download MetaTrader 5

Otimizando uma estratégia usando o gráfico do saldo e comparando os resultados com o critério "Balance + max Sharpe Ratio"

16 novembro 2017, 07:31
Vladimir Karputov
0
1 141

Conteúdo

1. Introdução

Durante o meu trabalho, eu percebi que o gráfico de saldo crescente no histórico já não é suficiente. Além disso, nós precisamos que ele seja bem suave. Em outras palavras, o desvio médio quadrático de uma linha de tendência deve ser tão pequeno quanto possível. Isso significa que nós também queremos estabilidade além do lucro. Para alcançá-lo, vamos verificar ainda outro parâmetro de otimização: a curva do gráfico de saldo e a variância dos desvios de seus valores da linha de regressão.

Nós vamos usar a biblioteca de análise numérica ALGLIB para obter as taxas da equação de regressão linear e algumas outras características estatísticas.


2. Como calcular uma linha de tendência para um gráfico de saldo?

Nós precisamos construir uma linha de tendência para o gráfico de saldo, de modo que a soma dos quadrados dos desvios da linha seja mínima.

As taxas da equação y = ax + b para o cálculo da linha são encontrados pelo método de mínimos quadrados padrão (LS). Eu não vou fornecer todas as equações matemáticas necessárias. Em vez disso, eu vou usar uma função pronta da biblioteca ALGLIB, adaptando-a às nossas necessidades.

2.1. Algoritmo para calcular o critério de otimização

Vamos dar uma olhada em um exemplo de cinco negociações:

Fig. 1. Balance and Linear regression.png

Fig. 1. Gráfico de saldo e a regressão linear

Essas cinco negociações formam a linha de saldo "Balance" 1-2-3-4-5. A linha de regressão linear é calculada e plotada usando o método dos mínimos quadrados (os cálculos são realizados usando a biblioteca de análise numérica ALGLIB).

2.2. Introdução da primeira variável TrendProfit.

Ela representa o lucro por negociação para a linha de regressão traçada:

Fig. 2. Parâmetro TrendProfit

Fig. 2. Parâmetro TrendProfit

A variável é calculada como a razão entre a altura da linha de regressão e o número de negociações. Por sua vez, a altura é calculada como a diferença entre os valores da linha de regressão nos pontos B e A.

Agora, nós precisamos obter o erro de construção da linha de regressão — o desvio médio da linha de regressão da linha do saldo. Nós vamos chamar isso de desvio de saldo padrão da regressão linear e marcar ela como LR Standard Error:

Fig. 3. LR Standard error

Fig. 3. LR Standard error

Nesta equação, o erro é calculado como a diferença entre o valor do saldo e a regressão linear. Você pode encontrar os detalhes sobre a equação aqui (em russo). 

No caso considerado na foto. 1, os erros são os seguintes:

error #1 error #2 error #3 error #4 error #5
10 000 - 10 600 = - 600 12 000 - 11 200 = 800 11 000 - 11 800 = - 800 14 000 - 12 400 = 1600 12 000 - 13 000 = - 1000

Assim sendo, o LR Standard error é igual a:

Fig. 4. LR Standard error calculado

Fig. 4. LR Standard error calculado

2.3. Variável ProfitStability.

Este parâmetro é responsável pela suavidade do gráfico do saldo. Nossos objetivos:

  • a linha de regressão deve ser colocada tão íngreme em relação ao horizonte quanto possível — isto significa mais lucro;
  • o desvio médio-quadrático da linha de saldo a partir da linha de regressão deve ser o mais baixo possível — isso sugere que a negociação é mais estável.

ProfitStability é calculada como a razão entre TrendProfit e LR Standard error:

Fig. 5. Variável ProfitStability

Fig. 5. Variável ProfitStability 

Para reduzir o impacto das negociações com diferentes volumes, nós podemos dividir a variável ProfitStability pelo volume total de todas as negociações.


3. Trabalhando com a biblioteca ALGLIB

A partir do momento atual (build 1645), a biblioteca ALGLIB já tinha sido integrada na biblioteca padrão: [pasta de dados]\MQL5\Include\Math\Alglib\alglib.mqh

Fig. 6. alglib

Fig. 6. O caminho para a biblioteca ALGLIB na biblioteca padrão

Classes da biblioteca ALGLIB 

Nós precisaremos das seguintes classes para trabalhar com a regressão linear:
  • classe CLinReg — classe básica para calcular a regressão linear
    • método CLinReg::LRBuild — modelo de cálculo de regressão linear
    • método CLinReg::LRUnpack — retorno das taxas do modelo linear
  • classe CLinearModel — classe auxiliar
  • classe CLRReport — estrutura contendo os dados estendidos no modelo linear. Em particular, nós estamos interessados ​​no campo m_rmserror (erro quadrático médio).

BalanceRegression.mqh class

Todo o trabalho relacionado à regressão linear e ao cálculo de parâmetros é realizado na classe Balance regression.mqh.

Métodos de classe

 Definição dos parâmetros
 SetStartBalance   Definição do saldo inicial
 SetFromDate  Definição da data inicial para solicitar o histórico de negociação
 SetVolumeNormalization  Configuração do modo de normalização do volume negociado
 Acesso aos resultados do cálculo
 GetProfitStability  Acesso aos resultados do cálculo 


O trabalho com o CBalanceRegression inclui as seguintes etapas.

  1. Define o saldo inicial — chama o método SetStartBalance.
  2. Define a data inicial para solicitar o histórico de negociação — chama o método SetFromDate.
  3. Define o modo de normalização do volume negociado - chama o método SetVolumeNormalization. Se quisermos usar a normalização do volume negociado, mude para 'true', caso contrário — 'false'. 
  4. Obtém o resultado do cálculo — chama o método GetProfitStability, retorna o resultado obtido para o procedimento da OnTester.

3.1. Cálculo dos passos (método GetProfitStability)

Os resultados das negociações com (comissão + swap + lucro) > 0.0 devem ser salvos no array arr_profits. O volume de todas as negociações devem ser somados na variável total_volume.

//---
   double   arr_profits[];                            // array de resultado das transações 
   double   total_volume=0;                           // volume total

Em seguida, passe por todos os negócios — preencha o array arr_profits e some o volume de negócios para a variável total_volume:

//--- solicita o histórico de negociações 
   HistorySelect(m_from_date,to_date);
   uint total_deals=HistoryDealsTotal();
   ulong ticket_history_deal=0;
//--- para todas as negociações 
   for(uint i=0;i<total_deals;i++)
     {
      //--- tenta obter as transações ticket_history_deal 
      if((ticket_history_deal=HistoryDealGetTicket(i))>0)
        {
         long     deal_type         =HistoryDealGetInteger(ticket_history_deal,DEAL_TYPE);
         double   deal_volume       =HistoryDealGetDouble(ticket_history_deal,DEAL_VOLUME);
         double   deal_commission   =HistoryDealGetDouble(ticket_history_deal,DEAL_COMMISSION);
         double   deal_swap         =HistoryDealGetDouble(ticket_history_deal,DEAL_SWAP);
         double   deal_profit       =HistoryDealGetDouble(ticket_history_deal,DEAL_PROFIT);

         if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
            continue;

         if(deal_commission==0.0 && deal_swap==0.0 && deal_profit==0.0)
            continue;

         total_volume+=deal_volume;

         int arr_size=ArraySize(arr_profits);
         ArrayResize(arr_profits,arr_size+1,50);   // redimensiona o aray

         if(arr_size==0)
            arr_profits[arr_size]=GetSetStartBalance()+deal_commission+deal_swap+deal_profit;
         else
            arr_profits[arr_size]=arr_profits[arr_size-1]+deal_commission+deal_swap+deal_profit;

         int d=0;
        }
     }

Nota: Quando nós fazemos a primeira entrada ao array arr_profits, nós somamos o saldo inicial e o resultado financeiro da negociação. Para todas as entradas subsequentes, somamos a entrada anterior e o resultado financeiro da negociação.

Declare o objeto de classe CMatrixDouble. Na verdade, esta é uma matriz. Vamos preenchê-lo: resultado financeiro (começa em "1") do índice de negociação.

//--- Objeto CMatrixDouble
   CMatrixDouble xy(arr_size,2);
   for(int i=0;i<arr_size;i++)
     {
      xy[i].Set(0,i+1);
      xy[i].Set(1,arr_profits[i]);
      //Print(arr_profits[i]); // para debug
     }

Declare os objetos das classes necessárias (CLinReg, CLinearModel, CLRReport) e calcule a regressão linear:

//--- construção de regressão linear
   CLinReg        linear_regression;
   CLinearModel   linear_model;
   CLRReport      linear_report;
   int retcode;
   linear_regression.LRBuild(xy,arr_size,1,retcode,linear_model,linear_report);
   if(retcode!=1)
     {
      Print("A regressão linear falhou, erro código=",retcode);
      return(0.0);
     }
   int nvars;
   double coefficients[];
   linear_regression.LRUnpack(linear_model,coefficients,nvars);
   double coeff_a=coefficients[0];
   double coeff_b=coefficients[1];
   PrintFormat("y = %.1f x + %.1f",coeff_a,coeff_b);

Finalmente, chame o método LRUnpack para obter as taxas da equação y = a*x + b. As taxas devem estar localizadas no array coefficients.

Agora que calculamos a regressão linear usando a biblioteca ALGLIB, nós podemos proceder diretamente ao cálculo do parâmetro, que é o foco de todo o artigo.

//--- сálculo dos parâmetros
   double TrendProfit=((double)arr_size*coeff_a+coeff_b)-(1.0*coeff_a+coeff_b);  // a projeção da linha de regressão no eixo "Y" 
   TrendProfit/=(double)arr_size;                                                // dividido pela quantidade de negócios
   double TrendMSE=linear_report.m_rmserror;                                     // raíz do erro quadrático médio em um conjunto de treinamento
   double ProfitStability=TrendProfit/TrendMSE;
//--- normaliza o volume de negócios
   if(GetVolumeNormalization())
      ProfitStability/=total_volume;
//--- Nós multiplicamos pelo número de negócios - nós não estamos interessados ​​em passes que têm poucos negócios
   ProfitStability*=arr_size;
//---
   return(ProfitStability*10000.0);

Dependendo do conjunto de parâmetros inicial através do método SetVolumeNormalization, nós dividimos o parâmetro ProfitStability com o volume negociado somado ou não. O resultado é multiplicado por 10000 para melhor representar os resultados.


4. Inclusão da classe CBalanceRegression

Consideremos o algoritmo de incluir a classe CBalanceRegression para vários EAs. 

4.1. Expert Advisor gerado pelo Assistente MQL5

Nós queremos verificar o efeito da normalização dos volumes negociados sobre os resultados. Isso significa que nós precisamos de um EA que calcula dinamicamente os volumes das posições abertas. Isso pode ser feito no Assistente MQL5: selecione Expert Advisor (gerar)e inclua um dos módulos de gerenciamento de dinheiro na página "Gerenciamento de dinheiro":

  • "Negociação com margem fixa" — calcula o lote em % da margem livre
  • "Negociação com risco fixo" — calcula o lote em % do saldo
  • "Negociação com volume de negócio otimizado" — calcula o lote de acordo com o histórico de negociação

Para este artigo, selecione o módulo de gerenciamento de dinheiro "Negociação com risco fixo", enquanto o próprio EA é nomeado de "EA test balance regression.mq5". Usando isso como exemplo, eu vou mostrar como incluir o arquivo da classe CBalanceRegression.

Passo 1. Inclua o arquivo CBalanceRegression e declare o objeto de classe (m_balance_regression).

ATENÇÃO: O arquivo da classe CBalanceRegression deve estar localizado na pasta [pasta de dados]\MQL5\Include\Balance regression.

//--- gerenciamento de dinheiro disponível
#include <Expert\Money\MoneyFixedRisk.mqh>
//--- módulo Regressão de Saldo disponível
#include <Balance regression\BalanceRegression.mqh>
//+------------------------------------------------------------------+
//| Entradas 							     |
//+------------------------------------------------------------------+

and

//+------------------------------------------------------------------+
//| Objeto expert global                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
CBalanceRegression m_balance_regression;
//+------------------------------------------------------------------+
//| Função de inicialização do expert                                |
//+------------------------------------------------------------------+

Passo 2. Adicione o parâmetro para habilitar/desabilitar a normalização do volume negociado para os parâmetros de entrada:

input double             Money_FixRisk_Percent=10.0;                            // risco percentual
//--- entrada para a normalização do saldo
input bool               InpVolumeNormalization=true;                           // Volume normalization
//+------------------------------------------------------------------+
//| Objeto expert global                                             |
//+------------------------------------------------------------------+

Passo 3. Define os parâmetros para o objeto m_balance_regression da classe CBalanceRegression: dados iniciais para solicitar o histórico de negociação e o modo de normalização do volume negociado:

//+------------------------------------------------------------------+
//| Função de inicialização do expert                                |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Define os parâmetros da CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- Expert de inicialização

Passo 4. Adiciona o procedimento da OnTester até o final do arquivo. Aqui, nós recebemos o critério de otimização personalizado (chamando GetProfitStability) e passamos o parâmetro para o testador:

//+------------------------------------------------------------------+
//| Função Tester                                                    |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

4.2. Expert Advisors com base no MACD Sample padrão e a Moving Average

EAs originais estão localizados na [pasta de dados]\MQL5\Experts\Examples\MACD\MACD Sample.mq5 e na [pasta de dados]\MQL5\Experts\Examples\Moving Average\Moving Average.mq5, respectivamente.

Pegue os EA original e salve suas cópias sob diferentes nomes. Selecione os nomes "MACD Sample balance regression.mq5" e "Moving Average balance regression.mq5".

Passo 1. Inclua o arquivo da classe CBalanceRegression e declare o objeto desta classe (m_balance_regression).

ATENÇÃO: O arquivo da classe CBalanceRegression deve estar localizado na pasta [pasta de dados]\MQL5\Include\Balance regression.

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
#include <Trade\AccountInfo.mqh>
//--- módulo Regressão de Saldo disponível
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;
//---
input double InpLots          =0.1; // Lotes
#include <Trade\Trade.mqh>
//--- módulo Regressão de Saldo disponível
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;

input double MaximumRisk        = 0.02;    // Risco máximo em percentagem

Passo 2. Adicione o parâmetro para habilitar/desabilitar a normalização do volume negociado para os parâmetros de entrada:

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
input int    InpMATrendPeriod =26;  // MA trend period
//--- entrada para a normalização do saldo
input bool   InpVolumeNormalization=true; // Normalização do volume
//---
int ExtTimeOut=10; // tempo limite em segundos entre as operações de negociação
input int    MovingShift        = 6;       // Deslocamento da Média Móvel
//--- entrada para a normalização do saldo
input bool   InpVolumeNormalization=true;  // Normalização do Volume
//---
int    ExtHandle=0;

Passo 3. Define os parâmetros para o objeto m_balance_regression da classe CBalanceRegression: dados iniciais para solicitar o histórico de negociação e o modo de normalização do volume negociado:

MACD Sample balance regression.mq5  Moving Average balance regression.mq5
//+------------------------------------------------------------------+
//| Inicialização e verificação dos parâmetros de entrada            |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- Define os parâmetros da CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- inicializa as informações comuns
  
//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Define os parâmetros da CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- prepara a classe de negociação para controlar as posições se o modo hedging estiver ativo

Passo 4. Adiciona o procedimento da OnTester para o final do arquivo dos dois EAs. Aqui, nós recebemos o critério de otimização personalizado (chamando a GetProfitStability) e passando o parâmetro para o testador:

//+------------------------------------------------------------------+
//| Função Tester                                                    |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

5. Otimização no EURUSD H4, sem forward test

Nós temos três EAs, nos quais nós podemos verificar a ideia de otimizar o gráfico de saldo usando o método de regressão. Os dois EAs (EA test balance regression.mq5 e Moving Average balance regression.mq5) calculam o volume da posição dinamicamente durante a negociação, enquanto o MACD Sample balance regression.mq5 usa um lote fixo.

5.1. EA test balance regression.mq5, EURUSD, H4, sem forward test

Para não perder nenhuma opção e acelerar o teste, eu escolhi os dois parâmetros para otimização - os parâmetros de limite para os sinais de abertura de posição e fechamento:

Fig.  Tester, aba entrada

Fig. Tester, aba entrada

  • Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio" 
  • Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "false" 
  • Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "true".

5.1.1 Teste 1: Otimização do parâmetro padrão "Balance + Max Sharp Ratio".

Definições do testador para Teste 1 (nota: o parâmetro "Otimização" é igual a "Balance + max Sharpe Ratio"):

Fig. 8. Tester, aba configuração

Fig. 8. Tester, aba configuração

5.1.2. Comparando a velocidade do teste em uma rede doméstica local com dois PCs e na nuvem

A rede doméstica possui dois computadores:

  1. um laptop alimentado pelo núcleo Intel Core i3-3120M @ 2.50GHz quad-core, 8077 MB. Apenas três dos quatro agentes são usados ​​no teste, já que o terminal também precisa se comunicar com os agentes no segundo computador;
  2. um desktop alimentado pelo processador AMD Phenom II X6 1075T de seis núcleos, 4058 MB. Apenas quatro agentes de seis são usados ​​no teste para não sobreaquecer a CPU.

Fig. 9. Otimização na rede doméstica

Fig. 9. Otimização na rede doméstica

O Teste 1 na rede doméstica durou 21 minutos e 43 segundos.

Agora, eu apaguei os resultados do teste na cache e iniciei o Teste 1 na MQL5 Cloud Europe 1. Na nuvem, o teste leva 1 minuto e 9 segundos. O custo do teste foi de $0.06.

Resultados do Teste 1, coluna de resultados ordenados por ordem decrescente, cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 100
345 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 25 100
344 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 20 100
343 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 15 100
327 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 95

Fig. 10. Teste 1, passo 346 da Otimização

Fig. 10. Teste 1, passo 346 da otimização

5.1.3. Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização de volume negociado for "false".

Definições do testador para o teste 2 (nota: o parâmetro "Otimização" é igual a "Custom max"):

Fig. 11. Tester, aba configuração

Fig. 11. Tester, aba configuração

Definições do testador para o Teste 2 (nota: a "Normalização do volume" na coluna Valor é 'false'):

Fig. 12. Tester, aba entrada

Fig. 12. Tester, aba entrada

Resultados do Teste 2, coluna de resultados ordenados por ordem decrescente, os cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
270 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 80
269 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 25 80
268 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 20 80
267 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 15 80
251 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 75


Fig. 13. EURUSDH4, passo 270 da Otimização do Teste 2

Fig. 13. EURUSDH4, Teste 2, passo 270 da Otimização

A otimização pelo parâmetro personalizado "Custom max" permitiu-nos selecionar os resultados com uma rentabilidade mais baixa, mas com menor rebaixamento de capital (Equity DD %). Além disso, o Teste 2 tem um rebaixamento menor por saldo. Isso pode ser visto mesmo visualmente se compararmos com a imagem 12 e 13.

5.1.4. Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é 'true':

Configurações do testador para o Teste 3 (as configurações são semelhantes às dos Testes 2):

Fig. 14. Tester, aba configuração

Fig. 14. Tester, aba configuração

Configurações do testador para Teste 3 (nota: "Normalização do volume" na coluna Valor é 'true'):

Fig. 15. Tester, aba entrada

Fig. 15. Tester, aba entrada

Na nuvem, o teste leva 2 minutos e 27 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.08.

Resultados do Teste 3, coluna Result ordenada em ordem decrescente, cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 100
345 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 25 100
344 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 20 100
343 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 15 100
327 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 95

O parâmetro de volume negociado igual a 'true' no Teste 3 definiu as mesmas melhores opções do Teste 1. Este é um bom marcador para otimizar o gráfico de saldo usando o método de regressão linear.

Conclusão: a otimização do gráfico de saldo usando o método de regressão linear permite escolher os resultados que não são pior ou mesmo comparáveis ​​com o método de otimização "Balance + max Sharp Ratio".

5.2. Moving Average balance regression.mq5, EURUSD, H4, sem forward test

Os seguintes parâmetros são selecionados para otimização:

Fig. 16. Tester, aba entrada

Fig. 16. Tester, aba entrada

Vou realizar três testes para o EA Moving Average balance regression:

  • Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio" 
  • Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "false" 
  • Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "true".

Definições do testador (moeda, método de geração de ticks e intervalo de tempo são iguais às da imagem 5).

5.2.1. O Teste 1 (otimização do parâmetro padrão "Balance + Max Sharp Ratio") realizado na nuvem. Na nuvem, o teste leva 1 minuto e 22 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.03.

Resultados do Teste 1, coluna Resultado ordenada em ordem decrescente, cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
19 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 9 13
18 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 8 13
17 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 7 13
21 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 11 13
20 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 10 13

Vamos verificar a melhor passo de nº 19:

Fig. 17. EURUSDH4, passo 19 da Otimização do Teste 1

Fig. 17. EURUSDH4, Teste 1, passo 19 da Otimização

5.2.2. O Teste 2 (otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é 'false') é executado na nuvem. Na nuvem, o teste leva 0 minutos e 00 segundos porque os resultados foram retirados do cache, embora sejam reversos. Todo o teste é realizado na MQL5 Cloud Europe 2. O custo do teste foi de $0.00.

Resultados do Teste 2, coluna Resultado ordenada em ordem decrescente, cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 14 22
140 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 13 22
139 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 12 22
142 101254.84 1037.87 25.95 2.15 2.31 0.22 101254.8 3.93 40 15 22
138 90936.41 960.67 24.02 2.09 2.08 0.21 90936.41 4.31 40 11 22

O passo 141 está no topo da tabela (ele tem o valor máximo na coluna Resultado):

Fig. 18. EURUSDH4, passo 141 da Otimização do Teste 2

Fig. 18. EURUSDH4, Teste 2, passo 141 da Otimização

No Teste 2, a otimização do gráfico do saldo mostrou um melhor resultado do que a otimização pelo parâmetro "Balance + max Sharp Ratio".

5.2.3. O Teste 3 (otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é 'verdadeiro') é executado na nuvem. Na nuvem, o teste leva 1 minuto e 13 segundos. Todo o teste é realizado na MQL5 Cloud Europe 2. O custo do teste é de $0.05.

Resultados do Teste 3, coluna Resultado ordenada em ordem decrescente, cinco melhores resultados:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 14 22
140 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 13 22
139 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 12 22
142 13235.93 1037.87 25.95 2.15 2.31 0.22 13235.93 3.93 40 15 22
138 12542.95 960.67 24.02 2.09 2.08 0.21 12542.95 4.31 40 11 22

O teste 3 escolheu as mesmas melhores opções do Teste 2. O parâmetro otimização do volume negociado igual a 'true' não fez ajustes.

Conclusão: A Otimização pelo parâmetro "Custom max" em ambos os testes (Teste 2 e 3) conseguiu selecionar melhores resultados do que no Teste 1. O parâmetro de otimização do volume negociado igual a 'true' não fez ajustes no Teste 3.

5.3. MACD Sample balance regression.mq5, EURUSD, H4, sem forward test

Os seguintes parâmetros são selecionados para otimização:

Fig. 19. Tester, aba entrada

Fig. 19. Tester, aba entrada

Vou realizar os mesmos três testes para o EA MACD Sample balance regression:

  • Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio"
  • Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "false"
  • Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "true"

As configurações do testador (moeda, método de geração dos ticks e o intervalo de tempo são as mesmos que na figura 5).

5.3.1. O Teste 1 (otimização do parâmetro padrão "Balance + Max Sharp Ratio") realizado na nuvem. Na nuvem, o teste leva 3 minutos e 55 segundos (o tempo é comparativamente grande porque a tarefa não foi executada em alguns agentes lentos, portanto, 10 tarefas foram distribuídas entre outros agentes). Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.04.

Resultados do Teste 1:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

Há pouquíssimos negócios (de 13 a 16) neste horário. Espero que haja mais negociações em tempos gráficos menores (M15). Esses testes são exibidos em outra seção abaixo. Por enquanto, o melhor resultado é o 163:

Fig. 20. EURUSDH4, passo 163 da Otimização do Teste 1

Fig. 20. EURUSDH4, Teste 1, passo 163 da Otimização

5.3.2. O Teste 2 (otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é 'false') é executado na nuvem. Na nuvem, o teste leva 0 minutos e 00 segundos porque os resultados foram retirados do cache, embora sejam reversos. Todo o teste é realizado na MQL5 Cloud Europe 2. O custo do teste foi de $0.00.

Resultados do Teste 2:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

O teste 2 escolheu os melhores resultados (compare todas as colunas, exceto o resultado) como no Teste 1. 

5.3.3. O Teste 3 (otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é 'verdadeiro') é executado na nuvem. Na nuvem, o teste leva 1 minuto e 5 segundos. Todo o teste é realizado na MQL5 Cloud Europe 2. O custo do teste é de $0.05.

Resultados do Teste 3:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 50
136 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 45
109 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 40
82 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 35
55 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 30
O teste 3 escolheu os mesmos melhores resultados (compare todas as colunas, exceto o resultado), como nos testes 1 e 2.

A otimização do gráfico de saldo usando o método de regressão linear funcionou como quando utilizado o método "Balance + max Sharp Ratio".

6. Otimização no EURUSD M15 com forward test

Nós temos os mesmos três EAs: EA test balance regression.mq5, Moving Average balance regression.mq5 e MACD Sample balance regression.mq5. Ao contrário dos testes anteriores, nós agora testamos o M15 com forward test ativado.

6.1. EA test balance regression.mq5, com forward test. Vou conduzir os três testes:

  • Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio"
  • Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "false"
  • Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "true".

6.1.1. Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio" Definições do testador:

Fig. 21. Tester, aba configuração

Fig. 21. Tester, aba configuração

Os parâmetros do testador são idênticos aos exibidos na imagem 7.

Na nuvem, o teste leva 2 minutos e 14 segundos. Todo o teste é realizado na MQL5 Cloud Europe 2. O custo do teste é de $0.08.

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
352 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 100
351 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 100
333 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 95
332 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 95
314 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 90

Fig. 22. EURUSDM15, passo 352 da Otimização do Teste 1

Fig. 22. EURUSDM15, Teste 1, passo 352 da Otimização

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 80
283 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 95 80
282 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 90 80
281 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 85 80
265 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 75

Aqui, as melhores opções foram as que têm apenas 10 negociações no forward test. Claro, isso não é suficiente, mas nós ainda precisamos realizar um teste:

Fig. 23. EURUSDM15, passo 284 da Otimização do Teste 1

Fig. 23. EURUSDM15, Teste 1, passo 284 da Otimização

6.1.2. Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização de volume negociado for "false".

Melhores resultados da otimização (sem o forward):

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 80
283 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 95 80
282 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 90 80
281 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 85 80
265 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 75

Fig. 24. EURUSDM15, passo 284 da Otimização do Teste 2

Fig. 24. EURUSDM15, Teste 2, passo 284 da Otimização

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 80
283 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 95 80
282 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 90 80
281 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 85 80
265 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 75

No Teste 2, o forward test mostra os mesmos resultados que no Teste 1.

A otimização do gráfico de saldo usando o método de regressão linear no Teste 2 permitiu detectar os resultados que não são piores do que os do Teste 1 (método "Balance + max Sharp Ratio").

6.1.3. O Teste 3: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado é "true". Na nuvem, o teste leva 3 minutos e 29 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.07.

Melhores resultados da otimização (sem o forward):

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
208 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 60
207 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 95 60
206 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 90 60
205 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 85 60
189 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 55


Fig. 25. EURUSDM15, passo 208 da Otimização do Teste 3

Fig. 25. EURUSDM15, Teste31, passo 208 da Otimização

Habilitando a "Normalização do volume negociado" não causou impacto significativo nos resultados. Além disso, um dos melhores resultados foi encontrado dentro do intervalo otimizado.

Os melhores resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
266 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 80
247 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 75
228 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 70
209 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 65
156 -120.35 -29.28 -8013.01 -22.76 0.63 -1.00 -0.13 -120.35 80.44 352 30 50

Forward test no Teste 3 (o parâmetro de otimização do volume negociado é 'true') mostra resultados SOMENTE NEGATIVOS (veja a coluna "Forward Result"). Este é um bom resultado para otimizar o gráfico de saldo usando o método de regressão linear, uma vez que os resultados mais precisos e realistas foram selecionados para o forward test.

A otimização do gráfico de saldo usando o método de regressão linear (o parâmetro de otimização do volume negociado é 'false') permite obter os resultados comparáveis ​​ao método "Balance max + Sharp Ratio"). Quando o parâmetro de otimização de volume negociado é "true", os resultados do forward test mostram a imagem de teste real neste período de tempo.

6.2. MACD Sample balance regression.mq5, com forward test

6.2.1. Teste 1: Otimizando o parâmetro padrão "Balance + max Sharp Ratio" executado na nuvem. Na nuvem, o teste leva 1 minuto e 3 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.06.

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
171 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 50
144 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 45
182 2078.33 489.23 8.74 1.82 2.07 0.20 -9.9625 2.29 56 120 50
155 2077.49 489.03 8.73 1.82 2.07 0.20 -9.90369 2.29 56 120 45
181 2066.17 484.13 8.65 1.81 2.05 0.20 -8.1109 2.29 56 115 50


Fig. 26. EURUSDM15, passo 171 da Otimização do Teste 1

Fig. 26. EURUSDM15, Teste 1, passo 171 da Otimização

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 -44.8452 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 -53.5369 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 -26.6428 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 -62.5775 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -347.982 1.70 16 65 50


Fig. 27. EURUSDM15, passo 78 da Otimização do Teste 1

Fig. 27. EURUSDM15, Teste 1, passo 78 da Otimização

6.2.2. Teste 2: Otimização do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização de volume negociado for "false".

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 50
141 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 45
114 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 40
167 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 50
140 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 45


Fig. 28. EURUSDM15, passo 168 da Otimização do Teste 2

Fig. 28. EURUSDM15, Teste 2, passo 168 da Otimização

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 6462.158 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 5018.77 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 5617.275 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 3525.665 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -5131.93 1.70 16 65 50

Fig. 29. EURUSDM15, passo 78 da Otimização do Teste 2

Fig. 29. EURUSDM15, Teste 2, passo 78 da Otimização

A otimização do gráfico de saldo usando o método de regressão no Teste 2 mostrou resultados comparáveis ​​ao método "Balance + max Sharp Ratio".

6.2.3. Teste 3: Otimizando o parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado definido para 'true' é executado na nuvem. Na nuvem, o teste leva 1 minuto e 44 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.08.

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 50
141 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 45
114 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 40
167 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 50
140 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 45

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 4038.85 13138.16 83.87 5.24 1.43 0.42 0.12 4038.849 1.95 16 140 30
105 3510.80 13026.26 78.17 4.89 1.40 0.39 0.11 3510,797 1.96 16 140 35
77 3136.73 13138.16 78.87 4.93 1.41 0.40 0.11 3136.731 1.95 16 135 30
132 3074.09 13598.05 73.17 4.57 1.38 0.37 0.10 3074.089 1.96 16 140 40
159 2658.84 13777.31 68.47 4.28 1.35 0.35 0.10 2658.844 1.96 16 140 45
No teste 3, os resultados de otimização e forward correspondem totalmente ao teste 2 — o parâmetro de otimização do volume negociado é igual a 'true' e não tem impacto significativo no Teste 3. Isso ocorre porque o EA MACD Sample balance regression.mq5 negocia em um lote fixo.

A otimização do gráfico do saldo usando o método de regressão linear acabou por ser comparável ao método padrão "Balance max + Sharp Ratio".

6.3. Moving Average balance regression.mq5 EA, com forward test

6.3.1. Teste 1: Otimização do parâmetro padrão "Balance + max Sharp Ratio" O testador e a guia Parâmetros são semelhantes à da imagem. 15. O testador e a guia Configurações são semelhantes à imagem. 23.

Na nuvem, o teste leva 1 minuto e 28 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.05.

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
165 -6.17 -24.02 -0.05 0.99 -0.03 0.00 -37045.4 6.66 465 12 24
166 -26.36 -49.14 -0.11 0.99 -0.07 0.00 -38052.8 6.86 465 13 24
163 -39.47 -61.88 -0.13 0.98 -0.09 0.00 -39156.1 6.62 465 10 24


Fig. 30. EURUSDM15, passo 53 da Otimização do Teste 1

Fig. 30. EURUSDM15, Teste 1, passo 53 da Otimização

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 409.74 -460.18 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 364.79 -461.14 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 362.45 -460.40 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 353.14 -467.05 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 350.60 -629.53 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15


Fig. 31. EURUSDM15, passo 48 do Forward do Teste 1

Fig. 31. EURUSDM15, Teste 1, passo 78 do Forward

6.3.2. Teste 2:A otimizando do parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume de negócios é "false"

Resultados da otimização: 

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
54 2465.75 -103.27 -0.20 0.96 -0.14 -0.01 2465.748 7.19 525 5 16
57 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 8 16
56 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 7 16

Resultados do forward:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 42602.76 -73708.28 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 38508.36 -74600.92 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 38292.53 -74386.41 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 37460.15 -75315.40 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 32767.39 -107616.36 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15
A otimização do gráfico de saldo usando o método de regressão linear no Teste 2 detectou os mesmos resultados que no Teste 1.

6.3.3. Teste 3: Otimizando o parâmetro personalizado "Custom max", enquanto o parâmetro de otimização do volume negociado definido para 'true' é executado na nuvem. Na nuvem, o teste leva 0 minutos e 42 segundos. Todo o teste é realizado na MQL5 Cloud Europe 1. O custo do teste é de $0.04. 

Resultados da otimização:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 4 16
52 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 3 16
54 45.69 -103.27 -0.20 0.96 -0.14 -0.01 45.68738 7.19 525 5 16
57 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 8 16
56 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 7 16

Resultados do forward: 

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 1772.90 -997.81 185.78 1.06 1.16 0.80 0.04 1772.899 2.26 175 12 15
49 1591.91 -994.94 165.23 0.94 1.14 0.67 0.04 1591.912 2.41 175 13 15
50 1577.12 -987.34 164.15 0.94 1.14 0.66 0.04 1577.123 2.42 175 14 15
51 1537.14 -972.44 159.83 0.91 1.13 0.65 0.03 1537.142 2.42 175 15 15
47 1473.35 -1540.90 144.32 0.82 1.13 0.65 0.03 1473.354 2.17 175 11 15

A otimização do gráfico de saldo usando o método de regressão linear no Teste 3 repete completamente os resultados do Teste 1. Em outras palavras, habilitar a otimização do volume negociado não tem impacto no resultado, embora o EA Moving Average balance regression.mq5 aplique o cálculo do lote dinâmico na negociação.

A otimização do gráfico do saldo usando o método de regressão linear acabou por ser comparável ao método padrão "Balance max + Sharp Ratio".


Conclusão

Os resultados da aplicação do gráfico de saldo usando o método de regressão linear acabaram por estar no nível do método de otimização "Balance + max Sharp Ratio". Os EAs que usaram os lotes dinâmicos mostraram resultados interessantes: em alguns casos, a configuração de "normalização do volume negociado" combinada com um forward test produz uma imagem mais realista.

Eu acredito, que o método descrito tem o direito de existir, e pode ser melhorado, por exemplo, considerando a duração da operações lucrativas e com prejuízo e experimentando os seus valores obtidos.


Traduzido do russo por MetaQuotes Software Corp.
Artigo original: https://www.mql5.com/ru/articles/3642

Arquivos anexados |
MQL5.zip (11.35 KB)
Expert Advisor Multiplataforma: Stops personalizados, Breakeven e Stop Móveis Expert Advisor Multiplataforma: Stops personalizados, Breakeven e Stop Móveis

Este artigo discute como os níveis de stop personalizados podem ser configurados em um expert advisor multiplataforma. Ele também discute um método fortemente relacionado ao assunto na qual envolve a possibilidade de definir a evolução do nível de stop ao longo do tempo.

Expert Advisor Multiplataforma: Stops Expert Advisor Multiplataforma: Stops

Este artigo discute uma implementação dos níveis de stop em um expert advisor para torná-lo compatível com as duas plataformas - MetaTrader 4 e MetaTrader 5.

Uma Nova Abordagem para a Interpretação da Divergência Clássica e Oculta Uma Nova Abordagem para a Interpretação da Divergência Clássica e Oculta

O artigo considera o método clássico para a construção de divergências e fornece um método adicional de interpretação de divergência. Uma estratégia de negociação foi desenvolvida com base neste novo método de interpretação. Esta estratégia também é descrita no artigo.

Arbitragem triangular Arbitragem triangular

O artigo é dedicado ao popular método de negociação arbitragem triangular. O assunto é analisado em muitos detalhes, são discutidos os aspectos positivos e negativos da estratégia, é desenvolvido o código pronto para usar do expert.