Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

leaf leftleaf right
Notifications
Clear all

[Solucionado] Estratégia de 2 Medias Moveis

11 Posts
2 Usuários
5 Reactions
235 Visualizações
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

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. 


   
Citar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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!

 


   
ReplyCitar
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

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

   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

Oi @carlosbueno!

Fiz alguns ajustes no código para que ele funcione no Módulo de Automação.

  1. Substituição de funções  ToCover pela função equivalente compatível com o Módulo de Automação;
  2. As ordens de alvo foram substituidas por ordens limite;
  3. Devido a um bug do Módulo, acrescentei o bloco de encerramento de posição às 20h, o que na prática nunca vai ocorrer, mas elimina problema do Módulo dizer que não há ordens para encerramento de posiçã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

   
ReplyCitar
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

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!!!!  😀 😀 😀 


   
ReplyCitar
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

Caro John, como poderia colocar o filtro na estratégia que voce corrigiu para evitar operações em possiveis regiões de consolidação? 


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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;

 


   
ReplyCitar
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

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?


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

@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!

 


   
ReplyCitar
CarlosBueno
(@carlosbueno)
Membro eminente
Registrou: 2 anos atrás
Posts: 16
Iniciador do tópico  

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...


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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!


   
ReplyCitar