Robô com execução de ordens fantasma - página 2

 
Carlos Martins:

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

 
Eu vendo 1000
 
Ruy Christian Hoffmann:

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.

Amigos, hoje eu fechei todos os gráficos e abri novamente.. tomei cuidado para abrir apenas um Robô...


O problema está na execução de ordens mesmo... parece ser um bug, pois a minha order está sendo enviada de compra com um SL e TK. E hoje percebi que aparece uma venda no mesmo horário porém com o mesmo TK e SL da compra.  Estou achando que a execução de ordem está com problema no meu meta.


Estou usando da seguinte forma :

trade.Buy(v_contratos,_Symbol,ask,ask -v_pontos_loss, ask+v_pontos_gain,"COMPRA");

seria para comprar a mercado essa ordem...

Vi que no exemplo que você usou está usando uma função. É possível compartilhar essa função ? Creio que se eu mudar essa execução de ordem deve resolver o problema.


Obrigado !

 
Carlos Martins:

Amigos, hoje eu fechei todos os gráficos e abri novamente.. tomei cuidado para abrir apenas um Robô...


O problema está na execução de ordens mesmo... parece ser um bug, pois a minha order está sendo enviada de compra com um SL e TK. E hoje percebi que aparece uma venda no mesmo horário porém com o mesmo TK e SL da compra.  Estou achando que a execução de ordem está com problema no meu meta.


Estou usando da seguinte forma :

trade.Buy(v_contratos,_Symbol,ask,ask -v_pontos_loss, ask+v_pontos_gain,"COMPRA");

seria para comprar a mercado essa ordem...

Vi que no exemplo que você usou está usando uma função. É possível compartilhar essa função ? Creio que se eu mudar essa execução de ordem deve resolver o problema.


Obrigado !

Carlos, vou compartilhar, mas já aviso que é confuso porque meu EA possui 7 Setup´s diferentes (Fase 1 ao 7) e as Ordens são de acordo com o Setup. Por outro lado você tem ai todos os exemplos: Market, Limit e Stop. Eu uso o CTrade.

void Compra()
{
   if(CheckMoneyForTrade(_Symbol,1,ORDER_TYPE_BUY))
   {
      if(SemPosicao() && SemOrdem() && Comprado=="S")
      {
         if(!simbolo.RefreshRates())
            return;
                  
         if(VFase=="Fase 1" || VFase=="Fase 2")
         {
            string VMsg = "Compra_"+VFase;
            double price=VPrice;
            double stoploss=NormalizeDouble(simbolo.NormalizePrice(price - SLFinal),0);
            double takeprofit=NormalizeDouble(simbolo.NormalizePrice(price + TPFinal),0);
            negocio.BuyLimit(Volume, price, NULL, stoploss, takeprofit,ORDER_TIME_GTC,0,VMsg);
            Print("Setup: ",VMsg);
            Print("Resultado do Dia: ",ResultadoDia());
            VBreakEvenAtivo=0;
            VSMSN="N";
            VContador++;
            
         }
         
         if(VFase=="Fase 3" ||VFase=="Fase 4" || VFase=="Fase 5" || VFase=="Fase 6")
         {
            string VMsg = "Compra_"+VFase;
            double price=simbolo.Bid();
            double stoploss=NormalizeDouble(simbolo.NormalizePrice(price - SLFinal),0);
            double takeprofit=NormalizeDouble(simbolo.NormalizePrice(price + TPFinal),0);
            negocio.Buy(Volume, NULL, price, stoploss, takeprofit, VMsg);
            Print("Resultado do Dia: ",ResultadoDia());
            Print("Setup: ",VMsg);
            VBreakEvenAtivo=0;
            VSMSN="N";
            if(VMin==1)
            {
               VMin=2;
               SetupsHabilitados();
            }
            
         } 

         if(VFase=="Fase 7")
         {
            string VMsg = "Compra_"+VFase;
            double price=VPrice;
            double stoploss=NormalizeDouble(simbolo.NormalizePrice(price - SLFinal),0);
            double takeprofit=NormalizeDouble(simbolo.NormalizePrice(price + TPFinal),0);
            negocio.BuyStop(Volume, price, NULL, stoploss, takeprofit,ORDER_TIME_GTC,0,VMsg);
            Print("Resultado do Dia: ",ResultadoDia());
            Print("Setup: ",VMsg);
            VBreakEvenAtivo=0;
            VSMSN="N";
         } 
         
      }
   }
}

Complementando, caso você não saiba como usar o CTrade, você precisará adicionar a classe colocando  antes do OnInit() do seu EA: ... e claro, vale a pena ler sobre o CTrade aqui mesmo no Buscar do MQL para saber como ele funciona e explorar mais coisas que ele faz.

#include <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>

CTrade negocio;
CSymbolInfo simbolo;

Outra sugestão é meio, digamos primitiva mas pelo menos você tira a dúvida se é um problema do código ou com a plataforma, corretora, etc.

Se você criar um EA do zero, só para teste, onde não tenha setup algum, puramente carrega o EA e executa duas Ordens: abre e depois fecha sua posição, por exemplo Compra, logo a seguir Vende e por fim ExpertRemove(); para sair do EA sem fazer mais nada. Se neste caso não duplicar a ordem, é porque é um erro em seu código. E ainda digo mais, 99% de chances de ser erro no seu código, eu pelo menos ainda não houvi falar de bug desse tipo.

Só não analiso seu código porque não gosto de ler códigos, quando leio os meus é empurrado pela necessidade, senão revisaria ele para você.

 
Ruy Christian Hoffmann:

Carlos, vou compartilhar, mas já aviso que é confuso porque meu EA possui 7 Setup´s diferentes (Fase 1 ao 7) e as Ordens são de acordo com o Setup. Por outro lado você tem ai todos os exemplos: Market, Limit e Stop. Eu uso o CTrade.

Complementando, caso você não saiba como usar o CTrade, você precisará adicionar a classe colocando  antes do OnInit() do seu EA: ... e claro, vale a pena ler sobre o CTrade aqui mesmo no Buscar do MQL para saber como ele funciona e explorar mais coisas que ele faz.

Outra sugestão é meio, digamos primitiva mas pelo menos você tira a dúvida se é um problema do código ou com a plataforma, corretora, etc.

Se você criar um EA do zero, só para teste, onde não tenha setup algum, puramente carrega o EA e executa duas Ordens: abre e depois fecha sua posição, por exemplo Compra, logo a seguir Vende e por fim ExpertRemove(); para sair do EA sem fazer mais nada. Se neste caso não duplicar a ordem, é porque é um erro em seu código. E ainda digo mais, 99% de chances de ser erro no seu código, eu pelo menos ainda não houvi falar de bug desse tipo.

Só não analiso seu código porque não gosto de ler códigos, quando leio os meus é empurrado pela necessidade, senão revisaria ele para você.

Ruy, muito obrigado pelas informações... não tinha pensado nisso..fazer um código seco só com o envio de onders... Estou parando essa semana para verificar essas questões... E fazendo um debug hj do meu código que tem muitas condições.


Eu ainda acho que é erro na plataforma pois o meu envio de ordens está com vários preenchimentos e as fantasmas não... Talvez reinstalar o meta resolva, mas antes quero confirmar pra ter certeza. Muito obrigado pela ajuda . Como faço para te avaliar aqui na comunidade ?


abs !

 
Carlos Martins:

Ruy, muito obrigado pelas informações... não tinha pensado nisso..fazer um código seco só com o envio de onders... Estou parando essa semana para verificar essas questões... E fazendo um debug hj do meu código que tem muitas condições.


Eu ainda acho que é erro na plataforma pois o meu envio de ordens está com vários preenchimentos e as fantasmas não... Talvez reinstalar o meta resolva, mas antes quero confirmar pra ter certeza. Muito obrigado pela ajuda . Como faço para te avaliar aqui na comunidade ?


abs !

Olá Carlos,

A melhor avaliação que você poderia me dar eu já ganhei de você: é poder ter  ajudado de alguma forma. Desconheço se existe avaliação de pessoas do fórum, mas obrigado pela intenção.

Espero que consiga resolver seu problema, quando tá assim é melhor revisar tudo mesmo que achará o problema.

Depois dê notícias como conseguiu e onde estava o problema, etc. 

Abraços,

 
Ruy Christian Hoffmann:

Olá Carlos,

A melhor avaliação que você poderia me dar eu já ganhei de você: é poder ter  ajudado de alguma forma. Desconheço se existe avaliação de pessoas do fórum, mas obrigado pela intenção.

Espero que consiga resolver seu problema, quando tá assim é melhor revisar tudo mesmo que achará o problema.

Depois dê notícias como conseguiu e onde estava o problema, etc. 

Abraços,

Ruy eu descobri o problema... Realmente estava na função do metatrader que eu estava utilizando. Eu fiz um debug detalhado identifiquei os processo que ela chama e peguei apenas o objeto de envio de ordens.


Trouxe para meu código e funcionou com sucesso :


     

   m_request.action   =TRADE_ACTION_DEAL;

         m_request.symbol   =_Symbol;

         m_request.magic    =06;

         m_request.volume   =v_contratos;

         m_request.type     =ORDER_TYPE_BUY;

         m_request.price    =ask;

         m_request.sl       =(ask -v_pontos_loss);

         m_request.tp       =(ask+v_pontos_gain);

         m_request.deviation=10;

         m_request.comment="COMPRA";


         OrderSend(m_request,m_result);


Pra isso funcionar precisa declarar as variáveis :

MqlTradeRequest     m_request;         // request data

MqlTradeResult      m_result;          // result data


Com isso resolveu meu problema aqui..Robô executou com sucesso hoje na conta real.


Abraço meu amigo !

 
Carlos Martins:

Ruy eu descobri o problema... Realmente estava na função do metatrader que eu estava utilizando. Eu fiz um debug detalhado identifiquei os processo que ela chama e peguei apenas o objeto de envio de ordens.


Trouxe para meu código e funcionou com sucesso :


     

   m_request.action   =TRADE_ACTION_DEAL;

         m_request.symbol   =_Symbol;

         m_request.magic    =06;

         m_request.volume   =v_contratos;

         m_request.type     =ORDER_TYPE_BUY;

         m_request.price    =ask;

         m_request.sl       =(ask -v_pontos_loss);

         m_request.tp       =(ask+v_pontos_gain);

         m_request.deviation=10;

         m_request.comment="COMPRA";


         OrderSend(m_request,m_result);


Pra isso funcionar precisa declarar as variáveis :

MqlTradeRequest     m_request;         // request data

MqlTradeResult      m_result;          // result data


Com isso resolveu meu problema aqui..Robô executou com sucesso hoje na conta real.


Abraço meu amigo !

Opa, so dando pitaco aqui!


Pq vc não usa a classe CTrade? ela abstrai todo esse processo de formatação de envio de ordem, e tem uma interface super amigável, vc so precisa se preocupar em passar preço, take e stop corretamente e pegar o retorno e mais nada!


Enfim é so um pitaco, há pessoas que eu conheço que preferem usar as estruturas de request e response pra fazer isso, mas na minha humilde opinião, VERBOSO e  TRABALHOSO!


Att,

Jonathan

 
Carlos Martins:

Ruy eu descobri o problema... Realmente estava na função do metatrader que eu estava utilizando. Eu fiz um debug detalhado identifiquei os processo que ela chama e peguei apenas o objeto de envio de ordens.


Trouxe para meu código e funcionou com sucesso :


     

   m_request.action   =TRADE_ACTION_DEAL;

         m_request.symbol   =_Symbol;

         m_request.magic    =06;

         m_request.volume   =v_contratos;

         m_request.type     =ORDER_TYPE_BUY;

         m_request.price    =ask;

         m_request.sl       =(ask -v_pontos_loss);

         m_request.tp       =(ask+v_pontos_gain);

         m_request.deviation=10;

         m_request.comment="COMPRA";


         OrderSend(m_request,m_result);


Pra isso funcionar precisa declarar as variáveis :

MqlTradeRequest     m_request;         // request data

MqlTradeResult      m_result;          // result data


Com isso resolveu meu problema aqui..Robô executou com sucesso hoje na conta real.


Abraço meu amigo !

Opa Carlos! boa notícia,ótimo!

Abraços e suce$$o com o EA :)

 
Jonathan Pereira:

Opa, so dando pitaco aqui!


Pq vc não usa a classe CTrade? ela abstrai todo esse processo de formatação de envio de ordem, e tem uma interface super amigável, vc so precisa se preocupar em passar preço, take e stop corretamente e pegar o retorno e mais nada!


Enfim é so um pitaco, há pessoas que eu conheço que preferem usar as estruturas de request e response pra fazer isso, mas na minha humilde opinião, VERBOSO e  TRABALHOSO!


Att,

Jonathan

Fala Jonatha, blz ?


Era justamente ela que estava dando problema e duplicando o envio de ordens.. Talvez o objeto dentro do meu meta que esteja com o problema. Por isso fiz a substituição e funcionou... 


Abs !

Razão: