Jeito Correto de Abrir uma Ordem Por EA - (MQL5)

 

Bom dia, eu já tenho um EA que opero faz 1 ano, mas agora estou aprimorando ele e gostaria de saber qual o jeito "correto" de abrir um ordem de tipo Pending (TRADE_ACTION_PENDING), Limit e Filling Return.

Eu uso o MqlTradeRequest e MqlTradeResult mas ainda ocorrem alguns erros em relação a erros que ocorrem na hora da ordem, como por exemplo o volume diminui na hora da minha ordem (eu checo o volume antes), ou algum erro de conexão,  ou  o preço muda, etc...

Se alguém pudesse me falar qual a melhor maneira pra abrir ordens eu agradeceria muito.

Obrigado

 

   TRADE_ACTION_DEAL
      ->Coloca uma ordem de negociação para a transação ser executada imediatamente usando os parâmetros especificados (ordem de mercado)
   TRADE_ACTION_PENDING
      ->Coloca uma ordem de negociação para a transação ser executada sob certas condições (ordem pendente)
   TRADE_ACTION_SLTP
      ->Modifica valores de Stop-Loss e Take-Profit numa posição aberta
   TRADE_ACTION_MODIFY
      ->Modifca os parâmetros de uma ordem colocada anteriormente
   TRADE_ACTION_REMOVE
      ->Exclui uma ordem pendente colocada anteriormente
   TRADE_ACTION_CLOSE_BY
      ->Fechar a posição oposta



 
LucasHeise:

Bom dia, eu já tenho um EA que opero faz 1 ano, mas agora estou aprimorando ele e gostaria de saber qual o jeito "correto" de abrir um ordem de tipo Pending (TRADE_ACTION_PENDING), Limit e Filling Return.

Eu uso o MqlTradeRequest e MqlTradeResult mas ainda ocorrem alguns erros em relação a erros que ocorrem na hora da ordem, como por exemplo o volume diminui na hora da minha ordem (eu checo o volume antes), ou algum erro de conexão,  ou  o preço muda, etc...

Se alguém pudesse me falar qual a melhor maneira pra abrir ordens eu agradeceria muito.

Obrigado

@LucasHeise

Esse fenômeno de ele abrir a ordem com volume menor que o programado é bem estranho.

Talvez seja por você não ter margem suficiente alocada junto à corretora. Em algumas corretoras, não adianta simplesmente você ter as garantias depositadas, às vezes é necessário você alocar explicitamente as garantias para o tipo de operação que você vai fazer e/ou para a plataforma que vai usar (por exemplo, na Clear você tem que fazer a alocação de garantia especificamente para operações day trade, senão ela não permite a operação, mesmo q vc tenha 1 milhão de reais depositados na conta-corrente, já na Modalmais, você tem que alocar garantia específica para minicontratos, etc.).

Mas mesmo assim eu acho estranho, pois o comportamento que eu sempre observei no Metatrader quando faltam garantias para a operação é que a ordem não é colocada. Nunca vi ser colocada uma ordem com volume menor.

Verifique se esse fenômeno de abrir ordem com volume menor acontece também em conta demo (na conta demo não há exigência de garantias, qualquer ordem que você enviar será acatada, desde que enviada corretamente).

Quanto à forma correta de abrir a ordem, sugiro que você comece testando o exemplo de ordem pendente que está na documentação do MQL5 (neste link) e que certamente vai funcionar. Daí você vai modificando aos poucos, um atributo de cada vez, até ficar do jeito que você precisa. Fazendo uma modificação de cada vez a partir de um exemplo que funciona, você vai descobrir exatamente o que você está fazendo errado.

Sugiro que comece a partir do exemplo abaixo, que é um dentre os disponíveis na documentação e que funciona perfeitamente:

#property description "Example of placing pending orders"
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // MagicNumber of the expert
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // order type
//+------------------------------------------------------------------+
//| Placing pending orders                                           |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declare and initialize the trade request and result of trade request
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- parameters to place a pending order
   request.action   =TRADE_ACTION_PENDING;                             // type of trade operation
   request.symbol   =Symbol();                                         // symbol
   request.volume   =0.1;                                              // volume of 0.1 lot
   request.deviation=2;                                                // allowed deviation from the price
   request.magic    =EXPERT_MAGIC;                                     // MagicNumber of the order
   int offset = 50;                                                    // offset from the current price to place the order, in points
   double price;                                                       // order triggering price
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // value of point
   int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // number of decimal places (precision)
   //--- checking the type of operation
   if(orderType==ORDER_TYPE_BUY_LIMIT)
     {
      request.type     =ORDER_TYPE_BUY_LIMIT;                          // order type
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;        // price for opening 
      request.price    =NormalizeDouble(price,digits);                 // normalized opening price 
     }
   else if(orderType==ORDER_TYPE_SELL_LIMIT)
     {
      request.type     =ORDER_TYPE_SELL_LIMIT;                          // order type
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;         // price for opening 
      request.price    =NormalizeDouble(price,digits);                  // normalized opening price 
     }
   else if(orderType==ORDER_TYPE_BUY_STOP)
     {
      request.type =ORDER_TYPE_BUY_STOP;                                // order type
      price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // price for opening 
      request.price=NormalizeDouble(price,digits);                      // normalized opening price 
     }
   else if(orderType==ORDER_TYPE_SELL_STOP)
     {
      request.type     =ORDER_TYPE_SELL_STOP;                           // order type
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;         // price for opening 
      request.price    =NormalizeDouble(price,digits);                  // normalized opening price 
     }
   else Alert("This example is only for placing pending orders");   // if not pending order is selected
//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());                 // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+
 

Boa tarde @LucasHeise,

Acredito que o problema que você está enfrentando é por causa do tipo de execução da ordem, ou seja, ordem Return.

Veja detalhes em https://www.mql5.com/en/docs/constants/tradingconstants/orderproperties#enum_order_type_filling

Alguns comentários sobre o tipo de execução:

  • FOK, Fill or Kill (tudo ou nada): executa o volume total da ordem ou não executa nada. Sempre sabemos o que esperar da execução;
  • IOC, Immediate or Cancel (tudo ou parcial): executa o volume disponível no book e cancela o resto, ou seja, a ordem pode não ser executada completamente, na verdade nunca sabemos o quanto vai ser executado. Este tipo de execução deve sempre ser verificado após o envio da ordem;
  • Return (Retorna): executa o volume disponível no book e aguarda até executar o volume restante ou até o prazo de expiração da ordem, ou seja, a ordem pode ser executada em várias partes, pode demorar para ser completada e pode ainda nunca ser executada completamente. Este preenchimento também deve ser verificado após a execução.

Espero ter ajudado

Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Requests to execute trade operations are formalized as orders. Each order has a variety of properties for reading. Information on them can be obtained using functions Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The...
Razão: