Otimizando uma estratégia usando o gráfico do saldo e comparando os resultados com o critério "Balance + max Sharpe Ratio"
Vladimir Karputov | 16 novembro, 2017
Conteúdo
- 1. Introdução
- 2. Como calcular uma linha de tendência para um gráfico de saldo?
- 2.1. Algoritmo para calcular o critério de otimização
- 2.2. Apresentando a primeira variável TrendProfit
- 2.3. Variável ProfitStability
- 3. Trabalhando com a biblioteca ALGLIB
- 4. Inclusão da classe CBalanceRegression
- 4.1. Expert Advisor gerado pelo Assistente MQL5
- 4.2. Expert Advisors com base no MACD Sample e na Média Móvel padrão
- 5. Otimização no EURUSD H4, sem forward test
- 5.1. EA test balance regression.mq5, EURUSD H4, sem forward test
- 5.1.1 Teste 1
- 5.1.2. Comparando a velocidade do teste em uma rede doméstica local com dois PCs e na nuvem
- 5.1.3. Teste 2
- 5.1.4. Teste 3
- 5.2. Moving Average balance regression.mq5, EURUSD H4, sem forward test
- 5.3. MACD Sample balance regression.mq5, EURUSD H4, sem forward test
- 6. Otimização no EURUSD M15 com forward test
- 6.1. EA test balance regression.mq5, com forward test
- 6.2. MACD Sample balance regression.mq5, com forward test
- 6.3. Moving Average balance regression.mq5, com forward test
- Conclusão
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. 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
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
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
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
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. 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.
- Define o saldo inicial — chama o método SetStartBalance.
- Define a data inicial para solicitar o histórico de negociação — chama o método SetFromDate.
- 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'.
- 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
- 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
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:
- 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;
- 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
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
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
Definições do testador para o Teste 2 (nota: a "Normalização do volume" na coluna Valor é 'false'):
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, 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
Configurações do testador para Teste 3 (nota: "Normalização do volume" na coluna Valor é 'true'):
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
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, 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, 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
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, 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 |
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
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, 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, 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, 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, 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, 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, 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, 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, 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 |
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, 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, 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 |
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.