Bugs do bem: transformando os bugs do seu trading system em oportunidades

 

Não existe nada pior do que descobrir um bug em um trading system lucrativo ;-)

O que você faz, remove o bug ou deixa tudo como está?

Como essa situação não é rara, e provavelmente irá acontecer mais cedo ou mais tarde com todos que mergulham no desenvolvimento de EAs (principalmente com o MT5, onde existe um grau de dificuldade e potencialidade acima da média de outras plataformas), apresento nesse tópico uma metodologia para transformar bugs em oportunidades.

A área de finanças quantitativas apresenta esse diferencial de outras áreas, onde os bugs são simplesmente removidos e eliminados para sempre.

No nosso caso, eles muitas vezes são a porta para a descoberta de novas táticas e estratégias competitivas, e portanto devemos estar atentos aos resultados deles e em formas de transformar o que parecia uma não conformidade em uma oportunidade.

Portanto, chamarei eles aqui nesse tópico de bugs do bem!

 
figurelli:

Não existe nada pior do que descobrir um bug em um trading system lucrativo ;-)

O que você faz, remove o bug ou deixa tudo como está?

Como essa situação não é rara, e provavelmente irá acontecer mais cedo ou mais tarde com todos que mergulham no desenvolvimento de EAs (principalmente com o MT5, onde existe um grau de dificuldade e potencialidade acima da média de outras plataformas), apresento nesse tópico uma metodologia para transformar bugs em oportunidades.

A área de finanças quantitativas apresenta esse diferencial de outras áreas, onde os bugs são simplesmente removidos e eliminados para sempre.

No nosso caso, eles muitas vezes são a porta para a descoberta de novas táticas e estratégias competitivas, e portanto devemos estar atentos aos resultados deles e em formas de transformar o que parecia uma não conformidade em uma oportunidade.

Vou responder da melhor forma capitalista possível hahaha! Pra mim depende, se o EA for muito bom e estiver sendo lucrativo, talvez o melhor a se fazer seria remover essa falha, esse bug...

Agora, se através de vários testes, se for comprovado que a própria falha também seja na verdade uma grande oportunidade para lucrar mais com isso, quem sabe até o próprio EA, talvez o mais interessante é construir um setup a parte baseado nesse "bug" e segui-lo

 
rafaeltoscano:

Vou responder da melhor forma capitalista possível hahaha! Pra mim depende, se o EA for muito bom e estiver sendo lucrativo, talvez o melhor a se fazer seria remover essa falha, esse bug...

Agora, se através de vários testes, se for comprovado que a própria falha também seja na verdade uma grande oportunidade para lucrar mais com isso, quem sabe até o próprio EA, talvez o mais interessante é construir um setup a parte baseado nesse "bug" e segui-lo

Rafael, perfetio, é exatamente como penso.

Seguindo essa linha, a metodologia que proponho é criar um parâmetro para cada bug relevante (que possa mudar o comportamento esperado do EA), como por exemplo:

input bool algoritmo_bug1=false; // Habilita algoritmo do Bug 1

Ou seja, consertamos o bug como uma opção de ele voltar a existir, e ajustado por um parâmetro de entrada. O que irá decidir se é melhor ou não manter o algoritmo que gera o bug é puramente o processo de otimização.

Na verdade esse texto não ficaria muito elegante, pois denota a ideia de que é um bug dentro do código, o que deixará de ser no momento que ele se tornar uma opção, e portanto podemos alterar o texto de acordo com o que o algoritmo está fazendo, como por exemplo:

input bool algoritmo_limite_de_periodo=false; // Habilita algoritmo de limite de período

O nome do bug (como no exemplo, "limite de período") deve estar relacionado ao algoritmo resultante quando deixamos existir o bug que foi detectado.

Nesse caso, poderia ser um bug que estava limitando o valor máximo de uma variável determinante do período de um indicador. 

Evidentemente não teria lógica fazer isso para todos bugs, até porque alguns são realmente ilógicos, mas sim para aqueles onde se consiga perceber que foi criado, por acaso, um novo algoritmo que faz sentido na performance geral do EA.

Também essa lista de algoritmos não precisa ser apenas de bugs, mas de algoritmos planejados e relevantes, como por exemplo:

input bool algoritmo_expira_horario=false;    // Habilita algoritmo de expiração de horário de posições pendentes
input bool algoritmo_limite_de_periodo=false; // Habilita algoritmo de limite de período (na verdade esse era o Bug 1!)
input bool algoritmo_teste_de_volume=false;   // Habilita algoritmo de teste de volume para filtro do indicador MACD
 

No tópico abaixo existe um bom exemplo de transformar um bug em oportunidade, já que mesmo com o bug, me chamou a atenção que fazendo um backtesting de 1 ano a estratégia ainda era resiliente e competitiva.

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Dúvidas com relação ao RSI

ewertonm, 2014.01.22 01:47

Bom, eu nao sei se aqui seria o lugar ideal, mas se vocês puderem me ajudar, seria muito grato.

Bom, minha dúvida é a seguinte, iniciei recentemente a aprender programar em MQL5,

e estava a testar um EA usando o indicador RSI,

construi a seguinte rotina:

//--- Seção A.8.3: Indicador de RSI
      RSI_handle[i]=(iRSI(SymbolArr[i],PERIOD_CURRENT,per[i],PRICE_WEIGHTED));      
        if(RSI_handle[i]<0)
        {
         Print("Identificador de RSI ",SymbolArr[i]," não foi criado, identificador=",Valor Invalido,"\n Error=",GetLastError());
         ExpertRemove();
        }

bom, até ai tudo bem, mas logo em seguida estava tentando capturar o valor de RSI_handle

para realizar alguns calculos, conforme a rotina abaixo:

      //--- A linha RSI sobre os preços.
      if(CopyBuffer(RSI_handle[N],0,per[N],1,RSI_handlex)<=0)
         continue; // quebrar a iteração atual. 

      ArraySetAsSeries(RSI_handlex,true);

Só que ao comparar o valor que é lançado na seção A83 -RSI_Handle com o valor copiado para o Buffer RSI_handlerx,

os números não batem... alguém poderia me ajudar a identificar onde estou errando na construção

desta rotina?

Obrigado a todos...


Abaixo estou copiando o código fonte onde identifiquei o bug e passei uma solução: 

      //--- A linha RSI sobre os preços.
      // if(CopyBuffer(RSI_handle[N],0,per[N],1,RSI_handlex)<=0) // Bug !!!
      if(CopyBuffer(RSI_handle[0],0,0,1,RSI_handlex)<=0) // Correção!
         continue; // quebrar a iteração atual. 
      ArraySetAsSeries(RSI_handlex,true);

Mas como o Bug se mustrou lucrativo (Bug do bem?) e afeta a posição inicial de amostragem (período inicial) do RSI, uma ideia seria a abaixo, transformando o Bug em parâmetro para otimização:

input int periodo_start_RSI=0; // Período de start de medição de RSI

...

      //--- A linha RSI sobre os preços.
      // if(CopyBuffer(RSI_handle[N],0,per[N],1,RSI_handlex)<=0) // Bug !!!
      if(CopyBuffer(RSI_handle[0],0,periodo_start_RSI,1,RSI_handlex)<=0) // Correção com aproveitamento do aprendizado na solução do bug
         continue; // quebrar a iteração atual. 
      ArraySetAsSeries(RSI_handlex,true);

Nesse caso específico, recomendo não variar muito o valor (como o período é em horas, poderia ser uma faixa de 0 a 24 horas), para prevenir contra um possível sobreajuste na otimização.

Razão: