O desafio do terceiro vídeo da série foi dar um desfecho momentâneo para o que foi apresentado. Eu digo momentâneo porque pode ser que daqui 6 meses, a Nelogica refatore completamente o Módulo de Automação e o Editor de Estratégias em um Módulo único integrado e que não apresente as assimetrias de contexto que observamos. Não custa nada sonhar, né pessoal!
Mas até lá, caso esse dia chegue, precisamos escrever nossos códigos fonte da melhor forma possível para que ele rode de maneira adequada na situação atual. E é isso que iremos abordar a seguir! Recomendo assistir ao vídeo, pois ele é o conteúdo principal e nele realizo demonstrações práticas que podem facilitar o seu entendimento.
O que são Melhores Práticas?
Eu sou uma pessoa bem pragmática e quando se trata de programação eu acredito que não existe o CERTO, e sim o ADEQUADO. Toda solução tem seus drawbacks, ou seja, vantagens e desvantagens e cabe a você pesar se as vantagens superam o custo imposto pelas desvantagens.
Pensando nas assimetrias de tratamento das ordens nos dois contextos do Profit: Editor de Estratégias e Módulo de Automação, temos que pensar o que queremos no final das contas:
Se você quer manter um código fonte simples…você gastará menos tempo para desenvolver seu código fonte, mas talvez pague um custo alto no desempenho do seu robô em conta real, perca na questão associada ao adequado backup de seu robô ou não simule corretamente em backtesting.
Se você quiser controlar melhor a execução das ordens geradas pelo seu robô, você gastará mais tempo desenvolvendo soluções em código fonte para as questões que encontrará no meio do caminho e para tentar compatibilizar o backtesting com a execução no Módulo de Automação. Mas em compensação, terá um código fonte robusto e toda sua estratégia estará contida nas linhas de código, podendo o backup ser realizado em qualquer editor de texto.
É importante ressaltar que melhores praticas não são sinônimo de perfeição….é o resultado de um processo de aprendizado, com muita tentativa e erro que nos leva a desenvolver os códigos de uma determinada forma visando simplicidade, efetividade e confiabilidade.
Dito isso, vamos iniciar as melhores práticas com algumas dicas sobre o processo de escrita do código fonte.
O processo de escrever código
Inicie seu código fonte de maneira estruturada com padronização e organização. Isso vai ajudar você a entender melhor o seu código, bem como outras pessoas que possam vir a te ajudar. Acesse a área de Templates do site da NeoTraderBot, lá temos modelos para cada tipo de estratégia para você começar a escrever o seu código.
Não saia escrevendo um monte de linhas para depois tentar rodar sua estratégia de uma vez só…A chance do resultado não ser o que espera e você ficar perdido sem saber o que deu errado é grande. Ao invés disso, comece escrevendo seu código da forma mais simples possível. Compile, execute, veja se fucionou. Em seguida incremente com mais algum bloco e repita o processo de teste. E vá fazendo assim de forma iterativa até finalizar seu código. Devagar e sempre…esse é o lema!
Lidando com assimetrias de contexto
Idealmente, o seu código fonte deveria ser exatamente o mesmo para rodar backtesting e no Módulo de Automação. Vimos no segundo vídeo desta série, por demonstração, que infelizmente não dá para usar exatamente o mesmo código, porque o Módulo de Automação não reconhece as funções de cobertura de posição, entre outros bugs que podem vir a ser corrigidos no futuro.
Assim, deve-se refatorar os códigos já existentes que façam uso de funções BuyToCoverLimit, BuyToCoverStop, SellShortToCoverLimt e SellShortToCoverStop para executar no Módulo de Automação. Já que teremos que alterar o código de qualquer forma, o objetivo é escrever um código que exija o menor impacto de alteração possível, de forma a mitigar a probabilidade de erros no processo.
Sobre assimetrias de contexto eu tenho 3 recomendações:
- Para aplicação de sua estratégia como sinalização em gráficos de tempo real, use sempre as funções de BuyToCover e SellShortToCover porque essas funções sinalizam no tempo do tick. Ordens limitadas ou stop são sinalizadas apenas no fechamento do candle, gerando atraso na sinalização de encerramento de posição;
- Crie uma lógica de sinais de compra, venda, reversão e liquidação em seu código. Evite espalhar comandos de ordens em vários lugares do código e concentre o roteamento de ordens em uma parte do seu código. Isto facilitará os ajustes e manutenções, se transitar de um contexto do Profit para outro. Se quiser até elaborar mais o seu código fonte, crie um parâmetro de contexto da estratégia para informar se é backtesting ou Módulo de automação e deixe seu código fonte parametrizado para utilizar as funções adequadas;
- Não realize calculo de alvo e stop na linha abaixo da ordem de abertura da posição. Isto não representa problema no Backtesting realizado dentro do Editor de Estratégias. Mas para o Módulo de Automação de estratégias, há um atraso entre enviar a ordem e ter a ordem executada, gerando a posição. Esse atraso é normal na operação real da bolsa de valores, mas em replay por alguma razão que eu não consigo compreender também há atraso. E o pior é que esse atraso é impactado pela velocidade do replay. Desta forma, seu código pode não ter por exemplo, o preço de compra na linha seguinte e apenas terá no próximo processamento da sua estratégia. A solução é criar uma variável para verificar se foi configurada a gestão de risco da operação e realizar esta configuração apenas quando a posição for efetivamente aberta.
Gestão de risco das operações
Minha recomendação é que você faça a gestão de risco pelo código fonte porque assim você terá mais controle sobre o que está sendo executado, bem como capacidade para reproduzir novamente a estratégia caso tenha backup e seu Profit tenha algum problema que necessite de uma reinstalação.
Você pode criar parâmetros em sua estratégia com o horário de início e fim para abertura de posição, e encerramento de posições de daytrade, bem como uma variável booleana para habilitar ou dessabilitar a gestão do trade, que seria a atualização das ordens de alvo e stoploss. Temos muitos códigos de exemplo sobre ordens stoploss na área de snipets do site.
Outra forma de fazer a gestão de risco das operações seria criando uma estratégia de negociação, na qual você pode configurar via interface gráfica, em percentual ou ticks o alvo e stop das operações (temos um vídeo sobre isso no canal), bem como configurando a Automação da estratégia que permite algumas parametrizações.
A vantagem de configurar por interface gráfica no Módulo de Automação a gestão de risco das operações é a exigência menor de conhecimento de programação. A desvantagem, na minha opinião, é desassociar a estratégia da gestão de risco, tratando como dois elementos separados, quando na verdade existe uma relação simbiótica entre a estratégia e a gestão de risco. Além disso, você terá que programar a gestão de risco no backtesting de qualquer forma.
Então, quanto mais completo o seu código fonte for e não necessitar de nenhum penduricalho…melhor! Isso é o ideal! Você só precisa de um editor de texto para guardar toda sua estratégia.
Tempestividade das ordens
Como vimos até o momento, as ordens à mercado, limite e stop são enviadas apenas no fechamento do candle. Enquanto a solução ideal não for feita pela Nelogica, que seria a refatoração dessas funções permitindo informar o desejo do programador de executar no próximo tick ou no fechamento da barra se houver confirmação das condições, podemos contornar de certa forma esse problema em alguns casos.
Caso esteja criando estratégias para operar em alta frequencia, abaixo de um minuto, não há muito a ser feito. Mas se sua estratégia roda em tempos gráficos acima de 10 minutos, você pode simular uma estratégia de 10 minutos com um tempo gráfico em um divisor menor. Por exemplo, você pode rodar sua estratégia em 2 minutos. Assim, cada barra de 10 minutos, corresponde nessa nova frequencia a 5 barras de 2 minutos. Uma media de 10 periodos em um frequencia de 10 minutos, equivale a uma media de 50 periodos em uma frequencia de 2 minutos.
É claro que os valores das médias serão diferentes no fechamento de 10 minutos, porque no gráfico de maior frequencia você tem 5 valores para tirar a média para cada candle de 10 minutos, ou seja, um valor e media mais preciso.
Apesar dessa abordagem dar trabalho para refatorar sua estratégia, você pode ter benefícios com uma tempestividade mais adequada de sua estratégia. Este é um ponto que precisa ser verificado caso a caso.
Depuração do código-fonte
Busque entender da forma mais completa possível a sua estratégia. Uma vez implementada, analise sua estratégia em backtesting, quando tem apenas os dados de fechamento de barra, as situações que geram abertura de posição, como as posições são encerradas e como é realizada a administração do trade. Caso plote indicadores, veja também se os indicadores estão sendo plotados corretamente. Se ficar em dúvida, complemente seu código com mais variáveis, execute com breakpoints para verificar cada etapa de calculo…não tenha pressa na depuração. Todos os problemas são mais facilmente resolvidos se descobertos no início.
Concluída essa etapa rode como estratégia de execução em um gráfico de tempo real. Você pode utilizar o replay sem problemas. No momento em que gravo este vídeo, os testes indicam que as estratégias incluídas em um gráfico, ainda que sejam o mesmo código fonte, se inseridas como indicador, coloração e execução, consistirão em instâncias diferentes. Verifique com bastante atenção como sua estratégia funciona com dados tick a tick. E se o fato de serem instancias diferentes impacta o comportamento da coloração ou dos indicadores.
Estando tudo certo, aí vem o problema de compatibilidade de contexto. Você vai criar a automação da sua estratégia….falando assim, parece até que vamos fazer algo completamente diferente. Na verdade, vamos apenas rodar com dados tick a tick em tempo real e permitir a estratégia executar de fato as ordens.
Ao colocar seu robô para rodar, teste em replay 1x. A velocidade do replay pode afetar os pontos de entrada e saída de seu robô. Algo que não faz sentido pra mim, uma vez que é um replay. Verifique se as ordens estão sendo colocadas no momento certo, se os stops e alvos estão se comportando como deveriam. Se os indicadores plotados também estão. É o momento de achar possíveis problemas antes de colocar seu robô para rodar e acabar descobrindo ao perder dinheiro de verdade.
Conclusão
Ao longo desta série sobre o tratamento de ordens dentro do Profit, vimos muita coisa: começamos entendendo cada tipo de ordem, depois verificamos por demonstrações como cada tipo de ordem é processada nos diferentes contextos do Profit e por fim, listamos algumas boas práticas em diferentes dimensões do processo de elaboração do código fonte e implementação de uma estratégia automatizada.
Espero que tenham gostado do conteúdo e se tiverem mais recomendações de boas práticas deixem nos comentários pois será bem interessante conhecer outras visões sobre o tema.