Retorno médio mensal como critérios personalizados de otimização

 

Gostaria de utilizar a fórmula, CAR*(CAR/MDD), como critérios personalizados de otimização.

CAR=Retorno médio mensal em %  |  MDD=Máximo Drawdown em % (STAT_BALANCEDD_PERCENT)

Meu maior problema é como criar a variável CAR.

Alguém poderia me ajudar? Pois estou começando agora a programar em MQL e não encontrei nada sobre como fazer isso. 

Obrigado. 

 
macolognese:

Gostaria de utilizar a fórmula, CAR*(CAR/MDD), como critérios personalizados de otimização.

CAR=Retorno médio mensal em %  |  MDD=Máximo Drawdown em % (STAT_BALANCEDD_PERCENT)

Meu maior problema é como criar a variável CAR.

Alguém poderia me ajudar? Pois estou começando agora a programar em MQL e não encontrei nada sobre como fazer isso. 

Obrigado. 

Olá Marco,

a princípio o CAR (Compound Annual Return) e é uma medida anualizada de retorno... mas pelo visto, você gostaria mesmo é de implementar o retorno mensal médio (acredito que composto, claro...).

Logo, apenas pra enfatizar, assim que calculada a medida CAR, seria necessário, como último passo, converter a taxa de retorno anualizada pra mês. Isso é absolutamente simples, sendo necessário, pra tanto, apenas o uso da taxa equivalente para realizar a transformação da taxa composta anual pra mensal.

Mas, como você mesmo disse, o "complicado" está mesmo no cálculo da CAR. Andei pensando em como calcular isso no MetaTrader e tenho algumas "ideias" iniciais, que gostaria se colocar aqui em discussão... acredito que com mais gente colaborando poderemos rapidamente encontrar uma solução pro teu problema, que, aliás, me pareceu absolutamente interessante! Parabéns!

Vamos lá... na minha humilde opinião, pra conseguirmos calcular o CAR, seria necessário proceder da seguinte forma:

1) Calcular as datas do primeiro e do último trades realizados pelo EA. Isso você consegue facilmente através da função HistoryDealGetInteger, especificamente através da opção DEAL_TIME.

2) Transformar a diferença entre as datas do último e do primeiro trades para dias, algo como

MathRound((lastDealDate - firstDealDate)/86400)

(onde 86.400 é a quantidade de segundos em um dia -> 24*60*60)

Logo, pega-se a diferença entre as datas, calculada como sendo a quantidade de segundos entre as mesmas, e divide-se essa diferença por 86.400 para sabermos quantos dias existem entre as duas datas. MathRound, aqui, serve pra arredondar essa medida para um dia inteiro.

3) Pegar o retorno bruto do EA no período através da função TesterStatistics, especificamente através da opção STAT_GROSS_PROFIT.

Caso nós tenhamos essas duas informações básicas, a saber, 1) o retorno bruto do EA e 2) a quantidade de dias necessários para se obter esse retorno, é perfeitamente possível calcular o retorno anualizado, também através de uma simples conversão de taxa composta através da fórmula da taxa equivalente.

Imagine, como exemplo, um EA que tenha dado um retorno (bruto) percentual de 25% em 175 dias. Nesse caso, usando taxa equivalente, teríamos:

double CAR = ((1+grossProfit)^(360/daysBetween)-1)*100;

 onde grossProfit é igual a 0.25 (25%) e daysBetween seria igual a 175 (dias entre a primeira e última operações).

Enfim, essas são minhas ideias iniciais. Espero ter ajudado.

Abraços,
Malacarne 

Documentação sobre MQL5: Funções de Negociação (Trade) / HistoryDealGetInteger
Documentação sobre MQL5: Funções de Negociação (Trade) / HistoryDealGetInteger
  • www.mql5.com
Funções de Negociação (Trade) / HistoryDealGetInteger - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader5
 

Olá Malacarne.

Acabei pensando em uma coisa e escrevendo outra... O ideal para o cálculo acima é realmente o retorno ANUAL, e não o mensal como eu disse.

A ideia seria de que para um sistema ser interessante, ele deve ter no mínimo um retorno anual maior ou igual ao seu maior drawdown.  Dessa forma o retorno seria, na teoria, sempre maior que o risco. 

Porém, essa razão entre CAR/MDD (retorno Anual/Maxdd) não irá distinguir entre uma otimização que teve o retorno de 50% no ano com 50% de mdd, de uma que teve 2%/2%. Por isso multiplico essa razão pelo retorno anual novamente. Dessa forma levo em consideração o retorno e o risco, dando sempre preferência para os passos mais rentáveis.  

A fórmula para ver o retorno anual composto (CAR) será = ( ( (capitalFinal / capitalInicial)^(1 / anos) -1) *100)  Meu problema é como colocar ela dentro do programa tendo em vista que será meu primeiro. hehehe...

 

Agradeço sua ajuda. Irei tentando colocar ela no meu sistema. Como disse, estou começando agora a programar em MQL, e passo a passo estou me familiarizando com a linguagem, mesmo nunca tendo sido um expert em programação. Antigamente eu programava em AFL, que não tem nada a ver com esse padrão de linguagem do MetaTrader que é bem mais robusto do meu ponto de vista.

 

Obrigado novamente! Abraço! 

Marco Antônio

 
macolognese:

Olá Malacarne.

Acabei pensando em uma coisa e escrevendo outra... O ideal para o cálculo acima é realmente o retorno ANUAL, e não o mensal como eu disse.

A ideia seria de que para um sistema ser interessante, ele deve ter no mínimo um retorno anual maior ou igual ao seu maior drawdown.  Dessa forma o retorno seria, na teoria, sempre maior que o risco. 

Porém, essa razão entre CAR/MDD (retorno Anual/Maxdd) não irá distinguir entre uma otimização que teve o retorno de 50% no ano com 50% de mdd, de uma que teve 2%/2%. Por isso multiplico essa razão pelo retorno anual novamente. Dessa forma levo em consideração o retorno e o risco, dando sempre preferência para os passos mais rentáveis.  

A fórmula para ver o retorno anual composto (CAR) será = ( ( (capitalFinal / capitalInicial)^(1 / anos) -1) *100)  Meu problema é como colocar ela dentro do programa tendo em vista que será meu primeiro. hehehe...

 

Agradeço sua ajuda. Irei tentando colocar ela no meu sistema. Como disse, estou começando agora a programar em MQL, e passo a passo estou me familiarizando com a linguagem, mesmo nunca tendo sido um expert em programação. Antigamente eu programava em AFL, que não tem nada a ver com esse padrão de linguagem do MetaTrader que é bem mais robusto do meu ponto de vista.

 

Obrigado novamente! Abraço! 

Marco Antônio

Olá Marco Antônio, recomendo analisares bem todas constantes padrões disponíveis nas estatísticas de testes, documentadas no link abaixo:

https://www.mql5.com/en/docs/constants/environment_state/statistics#enum_statistics

Por exemplo, o capital inicial (STAT_INITIAL_DEPOSIT) e final (STAT_INITIAL_DEPOSIT+STAT_PROFIT).

No artigo em https://www.mql5.com/en/articles/286 você também encontra alguns bons exemplos de construção do teu algoritmo de otimização. 

 

Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Testing Statistics
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Testing Statistics
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Testing Statistics - Reference on algorithmic/automated trading language for MetaTrader 5