Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
Bom dia John, sou iniciante e aproveitando alguns exemplos fiz 2 estratégias baseada em 2 Medias Moveis que o Leopoldo Couto da Nelogica ensinou a montar em um video pelo lançamento dos Robos. Elas funcionam muito bem no backtesting mas no Automação de Estratégias abre a ordem mas não fecha. Só funciona bem se colocar uma ordem oco, mas gostaria de trabalhar sem ordem oco. Coloquei anexo a estratégia do Leopoldo Couto que gostaria de saber o que tem de errado? Acho que pode ser as ordens de saida BuyToCoverStop ou SellToCoverStop? Opero no WINZ22 /1 min/2 contratos ou WDOX22 / 4R / 2 contratos.
Oi @carlosbueno! Tudo bem?
Eu particularmente tive problemas com as funções BuyToCoverStop e SellToCoverStop no Módulo de Automação de Estratégias. Conclui que as funções não funcionam no novo Módulo (pelo 2o vídeo da série que aborda o tratamento de ordens dentro do profit -Neste link).
Acontecia exatamente o que me relatou, executa uma ordem a mercado para abertura de posição, mas não encerrava a posição pelas ordens stop e limitada, dizendo que o limite de contratos havia sido alcançado.
A solução é substituir estas ordens de cobertura por ordens BuyStop e SellShortStop. Estas ordens são corretamente tratadas no módulo.
Adicionalmente, após substituir as ordens e tentar automatizar, por algum bug, o Profit pode te dizer que não há ordens para encerramento de posição.
Para este bug, eu sugiro colocar um comando de ClosePosition baseado em horário limite para encerramento de posição, mesmo que seja utilizar um horário fictício (ex: 2300). Isto contorna o bug, caso ele não tenha sido corrigido ainda pela Nelogica.
Você só não anexou o código....depois coloca aí!
Grande abs!
Primeiramente muito obrigado pela resposta. Eu pensei ter colocado o codigo no anexo no formato .psf mas vou colocar de novo e também farei uma copia abaixo:
Var condicao_compra,condicao_venda : booleano; status : inteiro; stop_loss,stop_gain : real; Inicio Se (Fechamento > Media(20,Maxima)) então Inicio Status := 1; PaintBar(clverde); fim Senão Inicio Se (Fechamento < Media(20,Minima)) então Inicio Status := - 1; PaintBar(clvermelho); fim Senão Inicio Status := 0; PaintBar(clbranco); fim; Fim; Se (Date = CurrentDate) então Inicio Se (isSold) então Inicio BuyToCoverStop(stop_gain,stop_gain); BuyToCoverStop(stop_loss,stop_loss); fim Senão Inicio Se (IsBought) então Inicio SellToCoverStop(stop_gain,stop_gain); SellToCoverStop(stop_loss,stop_loss); fim Senão Inicio condicao_compra := (status[1] = 0) e (status = 1); condicao_venda := (status[1] = 0) e (status = - 1); Se (condicao_compra) então Inicio BuyAtMarket; stop_loss := BuyPrice - 200; stop_gain := BuyPrice + 200; Fim; Se (condicao_venda) então Inicio SellShortAtMarket; stop_loss := SellPrice + 200; stop_gain := SellPrice - 200; Fim; Fim; fim; fim; Fim
Oi @carlosbueno!
Fiz alguns ajustes no código para que ele funcione no Módulo de Automação.
Var condicao_compra,condicao_venda : booleano; status : inteiro; stop_loss,stop_gain : real; Inicio Se (Fechamento > Media(20,Maxima)) então Inicio Status := 1; PaintBar(clverde); fim Senão Inicio Se (Fechamento < Media(20,Minima)) então Inicio Status := - 1; PaintBar(clvermelho); fim Senão Inicio Status := 0; PaintBar(clbranco); fim; Fim; Se (True) então Inicio Se (isSold) então Inicio stop_loss := SellPrice + 200; stop_gain := SellPrice - 200; BuyLimit(stop_gain); BuyStop(stop_loss,stop_loss); fim Senão Inicio Se (IsBought) então Inicio stop_loss := BuyPrice - 200; stop_gain := BuyPrice + 200; SellShortLimit(stop_gain); SellShortStop(stop_loss,stop_loss); fim Senão Inicio condicao_compra := (status[1] = 0) e (status = 1); condicao_venda := (status[1] = 0) e (status = - 1); Se (condicao_compra) então Inicio BuyAtMarket; Fim; Se (condicao_venda) então Inicio SellShortAtMarket; Fim; Fim; fim; if (Time >= 2000) then ClosePosition; fim; Fim
Caro Johnathas, não tenho palavras para te agradecer. Acabei de testar e está funcionando muito bem. Voce entende demais e acredito que logo a Nelogica vai te contratar para ajudar eles a resolver os problemas que não conseguem resolver. Apresentei esse problema para o suporte da Nelogica e até hoje eles não me deram resposta como resolver o problema acima e você resolveu rapidinho.
Parabéns, você é o cara!!!! 😀 😀 😀
Caro John, como poderia colocar o filtro na estratégia que voce corrigiu para evitar operações em possiveis regiões de consolidação?
Tem várias formas de fazer isso dependendo de como você identifica a consolidação.
Eu costumo iniciar utilizando o indicador TopBottomDetector (nativo no Profit). Até o fiz em um vídeo recente demonstrando como melhorar uma estratégia de cruzamento de 3 médias.
A ideia segue abaixo. Você sempre terá salvo o último topo e fundo e pode adicionar a condição de estar fora desse intervalo para realizar compra e venda.
Abs!
PS: O código abaixo não compila....é só para que você pegue as partes e incorpore no seu código!
var fUltimoTopo, fUltimoFundo, fTBDetector: float; fTBDetector := TopBottomDetector(2); if (fTBDetector <> 0) and (fTBDetector >= Close) then fUltimoTopo := fTBDetector; if (fTBDetector <> 0) and (fTBDetector <= Close) then fUltimoFundo := fTBDetector; if Not ((Close <= fUltimoTopo) and (Close >= fUltimoFundo)) then if Not (Close <= fUltimoFundo) then bSinalCompra := True; if Not ((Close <= fUltimoTopo) and (Close >= fUltimoFundo)) then if Not (Close >= fUltimoTopo) then bSinalVenda := True;
Obrigado pelo rapido retorno John, coloquei na minha estratégia mas não funcionou. Mudei o bSinalCompra e bSinalVenda para condicao_compra e condicao_venda como está na estratégia acima. Coloquei a regra após a coloração. Eu a coloquei em lugar errado?
@carlosbueno Oi Carlos.
Para que eu possa te ajudar melhor, você teria que colocar o código aqui.
Mas para esclarecer....Essas condições que coloquei de compra e venda são adicionais...você tem que inserir no seu código junto com as condições que você já tem. Você pode aninhar na sua condição, como segue abaixo:
if SUA_CONDICAO then if CONDICOES FORA DE CONSOLIDACAO then condicao_compra := true;
Outro detalhe...fiquei sabendo que este indicador de TopBottomDetector não funciona no Módulo de Automação...assim é possível fazer um backtesting preliminar, mas é preciso encontrar outra solução que rode na automação.
Abs!
Olá John, pelo que entendi voce desenvolveu uma solução para o Indicador de Topos e Fundos que funciona no Módulo de Automação. Como eu poderia colocar na minha Estratégia acima das Medias Moveis? Não esqueça como disse no primeiro contato sou principiante em programação embora esteja no mercado de dolar futuro desde janeiro de 2020. Abs...
Olá @carlosbueno!
Por enquanto disponibilizei o indicador sem o código fonte e acionei a Nelogica por uma chamado devido a um bug da plataforma: A chamada de indicadores dentro de outra estratégia está gerando ou estouro de memória ou loop infinito.
Eles estão verificando a questão e acredito que deve liberar alguma correção nos próximos dias. Aí, a utilização do indicador que criamos aqui na comunidade será exatamente igual ao indicador que já existe da Nelogica.
A ideia foi manter a mesma interface de utilização para
fTopoFundo := NeoTraderBot_TopBottomDetector(2);
O código fonte do indicador será tornado público aqui no fórum nos próximos dias...para quem quiser aprimorar ou sugerir melhorias.
Grande abs!