Problemas para sair da operação no E.A

 
Estou usando a classe CTrade (https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade), mas, quando opero na real a ordem que o E.A pendura para ser meu TP ou SL é atingida antes, por exemplo: de 5 a 15 pontos a mais ou a menos. Existe uma forma de garantir que ele saia exatamente no valor que eu pendurei?
Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade
Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade
  • www.mql5.com
Biblioteca Padrão / Classes de negociação / CTrade - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Rodrigo Costa:
Estou usando a classe CTrade (https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade), mas, quando opero na real a ordem que o E.A pendura para ser meu TP ou SL é atingida antes, por exemplo: de 5 a 15 pontos a mais ou a menos. Existe uma forma de garantir que ele saia exatamente no valor que eu pendurei?

Olá Rodrigo,

o fato de você usar a classe CTrade não tem nada a ver com o problema.  Use ordens LIMIT para sair da operação no preço que você quer!

 
Rogerio Giannetti Torres:

Olá Rodrigo,

o fato de você usar a classe CTrade não tem nada a ver com o problema.  Use ordens LIMIT para sair da operação no preço que você quer!

Bom dia Rogério ! Obrigado pela resposta.


Eu entro a mercado na operação, com trade.sell por exemplo:

trade.Sell(LoteEntrada, NULL, bid, bid+(100), (bid-(100)), "VENDIDO");

Escolhendo o Dessa forma ele "pendura" as ordens de SL e TP (mas mesmo assim ele acaba saindo de 5 a 15 pts antes ou depois). Penso que desta forma as ordens de saida se comportam como se fosse uma LIMIT, ou não?


Desde já agradeço.

 
Rodrigo Costa:


Bom dia,

as considerações que vou colocar são para conta REAL e modo de preenchimento FOK ou RETURN e como exemplo vou usar uma ordem de compra de 70 ações VALE3F a ASK=47,05.

1º  Uma ordem  a mercado  pode ser executada a vários preços.

    Se o preço subir antes da ordem chegar ao servidor/b3 a ordem fica na pedra, caso contrário a ordem será executada a vários preços até o preenchimento das 70 ações chegando ao um preço médio.

    Veja o book de ofertas de VALE3F para visualizar o que estou escrevendo.


2º  O SL e TP serão calculados pelo ASK e não pelo preço médio aqui já tem uma diferença. Pegou?


3º  O SL e TP são ordens start stop loss e start stop gain, ou seja você está programando o servidor MT5 para enviar uma ordem a mercado quando o preço do último negócio bater o SL ou TP aí voltamos ao que foi escrito primeiro item.


4º As Ordens LIMIT são colocadas nos livros da B3, ou seja garante o preço mas não garante o preenchimento.

 
Rogerio Giannetti Torres:

Bom dia,

as considerações que vou colocar são para conta REAL e modo de preenchimento FOK ou RETURN e como exemplo vou usar uma ordem de compra de 70 ações VALE3F a ASK=47,05.

1º  Uma ordem  a mercado  pode ser executada a vários preços.

    Se o preço subir antes da ordem chegar ao servidor/b3 a ordem fica na pedra, caso contrário a ordem será executada a vários preços até o preenchimento das 70 ações chegando ao um preço médio.

    Veja o book de ofertas de VALE3F para visualizar o que estou escrevendo.


2º  O SL e TP serão calculados pelo ASK e não pelo preço médio aqui já tem uma diferença. Pegou?


3º  O SL e TP são ordens start stop loss e start stop gain, ou seja você está programando o servidor MT5 para enviar uma ordem a mercado quando o preço do último negócio bater o SL ou TP aí voltamos ao que foi escrito primeiro item.


4º As Ordens LIMIT são colocadas nos livros da B3, ou seja garante o preço mas não garante o preenchimento.

Bom dia Rogério, obrigado pela resposta.

Então, eu tentei usar Orders Limit uma vez, entretanto, tive problemas quando enviava uma ordem e o preço não ia até ela. Neste caso, eu precisava deletar a ordem "Pendurada", mas não achei nenhum lugar ensinando como fazer isso. Agora nesse caso de enviar ordens Limit para Gain e Loss eu precisaria cancelar uma logo após o acionamento da outra. Realmente seria muito melhor e ajudaria muito na minha estratégia. Como eu poderia fazer isso, você tem algum exemplo que possa me passar? Obrigado!

 
Rodrigo Costa:

Bom dia Rogério, obrigado pela resposta.

Então, eu tentei usar Orders Limit uma vez, entretanto, tive problemas quando enviava uma ordem e o preço não ia até ela. Neste caso, eu precisava deletar a ordem "Pendurada", mas não achei nenhum lugar ensinando como fazer isso. Agora nesse caso de enviar ordens Limit para Gain e Loss eu precisaria cancelar uma logo após o acionamento da outra. Realmente seria muito melhor e ajudaria muito na minha estratégia. Como eu poderia fazer isso, você tem algum exemplo que possa me passar? Obrigado!

Olá Rodrigo,

não se fie nessa solução é só  exemplo e não está completo! 

//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         if(deal_symbol==Symbol()
            && deal_magic==magicNumber
            && (ENUM_DEAL_ENTRY)deal_entry==DEAL_ENTRY_IN)
           {
            flagOnTrade=true;
           }
         if(deal_symbol==Symbol()
            && deal_magic==magicNumber
            && (ENUM_DEAL_ENTRY)deal_entry==DEAL_ENTRY_OUT)
           {
            flagOnTrade=false;  //---  Acabou de fechar uma posição
            DoCloseOrders();
           }
        }
     }
  }
//+------------------------------------------------------------------+
void DoCloseOrders()
  {
   int total=OrdersTotal();
   for(int i=0;i<total;i++)
     {
      ulong _Ticket=OrderGetTicket(i);
      if(OrderSelect(_Ticket))
         if(OrderGetString(ORDER_SYMBOL)==cSymbol.Name()
            && OrderGetInteger(ORDER_MAGIC)==magicNumber)
            cTrade.OrderDelete(_Ticket);
     }
  }
//+------------------------------------------------------------------+
 
Muito obrigado Rogério, me ajudou muito esse código!
Razão: