Robô com execução de ordens fantasma

 

Amigos,


Eu criei um Robô e ele executa perfeitamente na conta de simulador, porém quando ele trabalha na conta real assim que o Robô executa uma ordem, aparece outra no sentido oposto que anula a posição. Isso acontece no mesmo momento que o Robô executa minha ordem. Todas ordens enviadas pelo meu robô preenchem o campo Comentários, e as ordens fantasma que aparecem está em branco. Jà entrei em contato com a XP e eles insistem em falar que é um problema do Robô, porém acredito que se fosse teria que aconcer na conta de simulador e esse problema acontece apenas em conta Real. Podem verificar o exemplo no anexo ? Como eu faço para identificar esse problema, pois todas as ordens do meu Robô preenche o campo de comentários e essas ordens não.


Muito Obrigado a quem puder me ajudar !

Carlos Martins

Arquivos anexados:
 

Dá uma olhada nas abas "Experts" e "Diário" pra ver que tipo de ordens são essas. Verifique se são ordens enviadas pelo robô ou acionadas automaticamente pelo servidor (stop-loss ou take-profit).

Vc tem o código-fonte do robô? Deve ter alguma falha de lógica.

 
Trader_Patinhas:

Dá uma olhada nas abas "Experts" e "Diário" pra ver que tipo de ordens são essas. Verifique se são ordens enviadas pelo robô ou acionadas automaticamente pelo servidor (stop-loss ou take-profit).

Vc tem o código-fonte do robô? Deve ter alguma falha de lógica.

Segue o log com o horário das execuções de ordem...

Arquivos anexados:
20200513.log  26 kb
 

Parece que o teu robô tá doido mesmo.

Está comprando a mercado e vendendo a mercado logo em seguida.

Tem algum erro de lógica na tua programação. Vc tem que depurar isso.

Se o erro não aparece na conta demo, talvez tenha algo a ver com o tempo que leva pra ordem ser executada (na conta demo as ordens são executadas instantaneamente, enquanto que na conta real tem o tempo de tráfego até a bolsa).

A sua programação deve estar com alguma premissa errada (por exemplo: lê a posição logo em seguida e, se a posição não tiver mudado, manda outra ordem, ou algo assim). Deve ser algum tipo de problema que não se manifesta se a ordem for executada rápido, como acontece na conta demo.

Certifique-se também de que a conta demo e a real sejam do mesmo tipo (ou ambas netting ou ambas hedging).

 

Olá,

Seu robô está comprando/vendendo com diferenças de mile segundos, tem erro na lógica de programação. Provavelmente você colocou a chamada de compra/venda a partir do OnTick() ou coisa assim e não fechou um controle de looping. Tente espaçar, tipo de candle em candle/intervalos de tempo em tempo, ou então explore o OnTradeTransaction() para que possa criar um controle maior entre uma entrada e outra. 

 
Trader_Patinhas:

Parece que o teu robô tá doido mesmo.

Está comprando a mercado e vendendo a mercado logo em seguida.

Tem algum erro de lógica na tua programação. Vc tem que depurar isso.

Se o erro não aparece na conta demo, talvez tenha algo a ver com o tempo que leva pra ordem ser executada (na conta demo as ordens são executadas instantaneamente, enquanto que na conta real tem o tempo de tráfego até a bolsa).

A sua programação deve estar com alguma premissa errada (por exemplo: lê a posição logo em seguida e, se a posição não tiver mudado, manda outra ordem, ou algo assim). Deve ser algum tipo de problema que não se manifesta se a ordem for executada rápido, como acontece na conta demo.

Certifique-se também de que a conta demo e a real sejam do mesmo tipo (ou ambas netting ou ambas hedging).

Olá Meu amigo, 


O meu envio de ordens sempre preenche o campo de comentários, já essas ordens que estão ai estão vazias... Veja a parte do código que faz o envio :


  // ----------------------------------- //

  // ****** Enviando ordem de compra ******

  // ----------------------------------- //

  if (v_abertura_1 < v_max_2 

        && v_fech_1 > v_max_2 

           && v_comprado == 0 

               && v_vendido == 0 

                  && (v_tempo == 0.0 || v_tempo + 0.05 <= v_tempo_novo) // realiza prox trade após 5 min

                    && v_tempo_novo > 9.05 // inicia a partir das 9:50

                       && (v_take == v_loss || v_take <= v_loss * v_recupera) // Executa trade apenas se não tem take ou se está em loss

                          && (v_loss < 3) // No terceiro Loss Robo não opera mais

     ) 

        {

        trade.Buy(v_contratos,_Symbol,ask,ask -v_pontos_loss, ask+v_pontos_gain,"COMPRA"); //260 de loss e 50 de gain 

        v_trade = "Compra";

        v_preco = trade.RequestPrice(); // Recupera o preço de compra

        TimeToStruct(TimeCurrent(),v_horario);

       v_tempo =  v_horario.hour;

       v_tempo = v_tempo + (StringToDouble(v_horario.min)/100); 

       v_dia = v_horario.day;

       v_mes = v_horario.mon; 

    }

  

  // ----------------------------------- //

  // ****** Enviando ordem de venda ******

  // ----------------------------------- //

  if (v_abertura_1 > v_min_2 

       && v_fech_1 < v_min_2 

           &&  v_comprado == 0 

              && v_vendido == 0 

                  && (v_tempo == 0.0 || v_tempo + 0.05 <= v_tempo_novo)  // realiza prox trade após 5 min

                    && v_tempo_novo > 9.05 // inicia a partir das 9:50

                      && (v_take == v_loss || v_take <= v_loss * v_recupera) // Executa trade apenas se não tem take ou se está em loss

                        && (v_loss < 3) // No terceiro Loss Robo não opera mais

     ) 

      {

       trade.Sell(v_contratos,_Symbol,bid,bid +v_pontos_loss, bid-v_pontos_gain,"VENDA"); //260 de loss e 50 de gain     

       v_trade = "Venda";

       v_preco = trade.RequestPrice(); // Recupera o preço de venda

       TimeToStruct(TimeCurrent(),v_horario);

       v_tempo =  v_horario.hour;

       v_tempo = v_tempo + (StringToDouble(v_horario.min)/100); 

       v_dia = v_horario.day;

       v_mes = v_horario.mon; 

 
Ruy Christian Hoffmann:

Olá,

Seu robô está comprando/vendendo com diferenças de mile segundos, tem erro na lógica de programação. Provavelmente você colocou a chamada de compra/venda a partir do OnTick() ou coisa assim e não fechou um controle de looping. Tente espaçar, tipo de candle em candle/intervalos de tempo em tempo, ou então explore o OnTradeTransaction() para que possa criar um controle maior entre uma entrada e outra. 

Olá meu amigo,


Você teria um exemplo ? Eu sou novo no meta...Até postei no outro comentário a parte do meu código que faz o envio de ordens. O Processo sempre preenche o campo de comentários...e essas ordens fantasmas estão com o campo em branco.. Por isso que fica difícil acreditar que o Robô que está fazendo esse envio indevido.

Ele tem um controle em uma variável também, se já enviou a ordem não envia novamente... Por isso ainda acredito que ele está correto...Se puderem me ajudar a entender o que está errado agradeço..


Abs !

Carlos

 
Carlos Martins:

Olá meu amigo,


Você teria um exemplo ? Eu sou novo no meta...Até postei no outro comentário a parte do meu código que faz o envio de ordens. O Processo sempre preenche o campo de comentários...e essas ordens fantasmas estão com o campo em branco.. Por isso que fica difícil acreditar que o Robô que está fazendo esse envio indevido.

Ele tem um controle em uma variável também, se já enviou a ordem não envia novamente... Por isso ainda acredito que ele está correto...Se puderem me ajudar a entender o que está errado agradeço..


Abs !

Carlos

Oi Carlos, tenho sim,

Primeiro fique atento para as dicas acima do Patinhas, pois eu não analisei seu código então há possibilidade de conter erro no seu código também.

Agora baseando no seu pedido de exemplo, você pode fazer com o famoso isNewBar apresentado nessa documentação desse link que controla 1 entrada por candle apenas: https://www.mql5.com/pt/articles/159

Mas por preferência minha eu faço de outro jeito que vou dar o exemplo abaixo. Além de restringir os horários que eu desejo que faça abertura das Ordens, eu também controlo para que ele só entre 1x por Candle após 3 segundos de cada candle:

Primeiro carrego essa variável na abertura do EA:

datetime PREVTIME=0;

depois no meu OnTick() faço a seguinte instrução:

void OnTick()
{
//INI: Barra-em-Barra
//INI: do PREVTIME
   if(PREVTIME != iTime(NULL, PERIOD_CURRENT, 0) && TimeCurrent() > (iTime(NULL, PERIOD_CURRENT, 0) + 2))
   {
      if(VSMSN=="S")
         StopMovelBarra_a_Barra();
      
      if(!simbolo.RefreshRates())
         return;

      if(SemPosicao() && !SemOrdem())
         PendingOrderDelete();

      if(HorarioEntrada() && !HorarioFechamento() && ControleSaldo())
      {
         int resultado_cruzamento=Cruzamento();
         if(resultado_cruzamento==1)
         {
            Compra();
         }
         
         if(resultado_cruzamento==-1)
         {
            Venda();
         }
      }

      if(HorarioFechamento())
      {
         if(!SemPosicao())
         {
            Fechar();
         }
      }

   PREVTIME = iTime(NULL, PERIOD_CURRENT, 0);
   }
//Final do PREVTIME
... continuação do OnTick()...
}

Tudo que está entre a abertura e o fechamento do PREVTIME é executado logo após 3 segundos da abertura de cada candle e apenas 1x, assim evito duplicidade.

Mas você tem que ver ai no seu caso, pois se sua estratégia abrange mais de uma entrada por candle então esse exemplo creio que não vai lhe atender. Caso você precise abrir mais de uma Ordem por candle, talvez você precise usar o OnTime() ou então o OnTradeTransaction(), mas ambos eu não utilizo para essa finalidade, então não tenho exemplo a postar do OnTradeTransaction() e do OnTime(). 

Handler de evento "nova barra"
Handler de evento "nova barra"
  • www.mql5.com
Os autores dos indicadores e especialistas sempre estiveram interessados em escrever o código compacto em termos de tempo de execução. Você pode resolver este problema a partir de diferentes ângulos. A partir deste amplo tópico neste artigo, cobriremos o problema, que aparentemente foi solucionado: verifique por uma nova barra. Este é um meio...
 
Carlos Martins:

Olá Meu amigo, 


O meu envio de ordens sempre preenche o campo de comentários, já essas ordens que estão ai estão vazias... Veja a parte do código que faz o envio :


Nem todas as corretoras permitem o uso do Campo Comentários...

;)

 

Olá,

Estou supondo que esse objeto "trade" é da classe "cTrade" da biblioteca padrão, correto? 

Sei que parece meio óbvio, mas, dada a situação, convém conferir todas as premissas, para descartar a possibilidade de as ordens-fantasmas estarem sendo geradas dentro desses métodos "buy" e "sell" do objeto "trade". 

Uma vez verificada esta premissa, como as ordens-fantasmas não têm SL nem TP e nem comentário, fica evidente que elas NÃO vieram do código-fonte que vc está mostrando acima. Vieram de outro lugar.

Então me parece que só restam duas hipóteses:

(1) as ordens-fantasma estão sendo geradas em outra parte do código-fonte do seu robô

(2) as ordens-fantasma estão sendo geradas por outro robô que esteja rodando na mesma conta-corrente, podendo esse outro robô estar no mesmo terminal ou em outro terminal (outro computador, outro lugar, etc., mas logado na sua conta-corrente)

A hipótese (2) me parece mais forte, pq vc relata que na conta demo esse problema não acontece.

Vc chegou a examinar a aba "Experts" ?

Vc usa algum robô ou boleta que gera ordens automaticamente (SL, TP, zeragem automática, etc.) em algum terminal que esteja conectado a essa mesma conta-corrente?

 
Trader_Patinhas:

Olá,

Estou supondo que esse objeto "trade" é da classe "cTrade" da biblioteca padrão, correto? 

Sei que parece meio óbvio, mas, dada a situação, convém conferir todas as premissas, para descartar a possibilidade de as ordens-fantasmas estarem sendo geradas dentro desses métodos "buy" e "sell" do objeto "trade". 

Uma vez verificada esta premissa, como as ordens-fantasmas não têm SL nem TP e nem comentário, fica evidente que elas NÃO vieram do código-fonte que vc está mostrando acima. Vieram de outro lugar.

Então me parece que só restam duas hipóteses:

(1) as ordens-fantasma estão sendo geradas em outra parte do código-fonte do seu robô

(2) as ordens-fantasma estão sendo geradas por outro robô que esteja rodando na mesma conta-corrente, podendo esse outro robô estar no mesmo terminal ou em outro terminal (outro computador, outro lugar, etc., mas logado na sua conta-corrente)

A hipótese (2) me parece mais forte, pq vc relata que na conta demo esse problema não acontece.

Vc chegou a examinar a aba "Experts" ?

Vc usa algum robô ou boleta que gera ordens automaticamente (SL, TP, zeragem automática, etc.) em algum terminal que esteja conectado a essa mesma conta-corrente?

Amigo Patinhas, pensei nisso também: "(2) as ordens-fantasma estão sendo geradas por outro robô que esteja rodando na mesma conta-corrente, podendo esse outro robô estar no mesmo terminal ou em outro terminal (outro computador, outro lugar, etc., mas logado na sua conta-corrente)"

Uma vez por "orelhada" minha tava eu com o EA na VPS e local também, então ele ficou gerando 2x as mesmas operações.

Razão: