Problema com Ordem Pendente ( error = 4756)

 

Olá Amigos!!

Estou fazendo meu primeiro EA, se alguém puder me ajudar eu agradeço muito.

Ao rodar o EA no testador obtenho o erro: 

2021.03.16 23:10:47.306 2021.03.08 09:30:00   failed buy stop 4 WINJ21 at 113710 sl: 113350 tp: 114070 [Invalid expiration]

2021.03.16 23:10:47.306 2021.03.08 09:30:00   Error sending Order to Buy. Error = 4756

Alguém saberia me dizer se tem algo errado nesse código:

///////////////////////////////////////////////////////
// BUY STOP
void BuyAtMarket() 
  {
   MqlTradeRequest   request={0};         // request
   MqlTradeResult    response={0};        // response
   
   ZeroMemory(request);
   ZeroMemory(response);
   
   //--- For Buy Order
   request.action       = TRADE_ACTION_PENDING;                         // Trade operation type - ordem pendente
   request.magic        = magic_number;                                 // Magic number
   request.symbol       = _Symbol;                                      // Trade symbol
   request.volume       = tamanho_lote_normalizado;                     // Lots number
   request.price        = NormalizeDouble(preco_compra,_Digits);        // Price to buy
   request.sl           = NormalizeDouble(preco_compra - tp_sl,_Digits);// Stop Loss Price
   request.tp           = NormalizeDouble(preco_compra + tp_sl,_Digits);// Take Profit
   request.deviation    = 0;                                            // Maximal possible deviation from the requested price
   request.type         = ORDER_TYPE_BUY_STOP;                          // Order type
   request.type_filling = ORDER_FILLING_FOK;                            // Order execution type
   
   //---
   OrderSend(request,response);
   //---
   if(response.retcode == 10008 || response.retcode == 10009)
     {
      Print("Order Buy executed successfully!!");
     }
   else
     {
       Print("Error sending Order to Buy. Error = ", GetLastError());
       ResetLastError();
     }
  }
/////////////////////////////////////////////////////////////////////

Observação: Já tentei usar "request.type_filling = ORDER_FILLING_RETURN;" mas não teve efeito nenhum.

Obrigado!!!

 
Felipe Passos De Moraes Alves:

Olá Amigos!!



Olá,

obrigatório vencimento no dia para WIN, ou seja,   faltou colocar m_request.time_type=ORDER_TIME_DAY.

 
Rogerio Giannetti Torres:

Olá,

obrigatório vencimento no dia para WIN, ou seja,   faltou colocar m_request.time_type=ORDER_TIME_DAY.

Olá Rogério!! Muito Obrigado, incluindo isso e alterando o type_filling para RETURN funcionou.

Ficou assim:

//--- For Sell Order
   request.action       = TRADE_ACTION_PENDING;                         // Trade operation type
   request.magic        = magic_number;                                 // Magic number
   request.symbol       = _Symbol;                                      // Trade symbol
   request.volume       = tamanho_lote_normalizado;                     // Lots number
   request.price        = NormalizeDouble(preco_venda,_Digits);         // Price to sell
   request.sl           = NormalizeDouble(preco_venda + tp_sl,_Digits); // Stop Loss Price
   request.tp           = NormalizeDouble(preco_venda - tp_sl,_Digits); // Take Profit
   request.type         = ORDER_TYPE_SELL_STOP;                         // Order type
   request.type_filling = ORDER_FILLING_RETURN;                         // Order execution type
   request.type_time    = ORDER_TIME_DAY;                               // Order expiration type

:-)

 
Felipe Passos De Moraes Alves:


Olá Felipe,

pelo seu agradecimento, coisa raríssima nesse fórum, segue umas dicas para corrigir e generalizar o seu EA

1) Os preços em uma ordem devem ser múltiplos do TICK SIZE do instrumento, leia sobre o conceito na internet. Então para evitar INVALID STOPS use a normalização de preço como exemplificada abaixo:

2) Para evitar  INVALID PRICE  os preços dos stops não podem ficar dentro do spread e devem obedecer ao nível mínimo de stop ( muito comum em FOREX ) leia no MQL5 o conceito de nível mínimo de stop;

//+------------------------------------------------------------------+
//|                                                  Forum365969.mq5 |
//|                                         Rogério Giannetti Torres |
//+------------------------------------------------------------------+
#property copyright "Rogério Giannetti Torres"
#property link      "mailto:giannetti.rogerio@gmail.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlTick  tick;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(SymbolInfoTick(_Symbol, tick))
     {
      double precoEntrada = tick.last * 1.0078;
      Print(tick.last," ==> ",precoEntrada);
      precoEntrada = NormalizePrice(precoEntrada);
      Print(tick.last," ==> ",precoEntrada,"\n");
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizePrice(double price)
  {
   double m_tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
   if(m_tick_size != 0)
      return(NormalizeDouble(MathRound(price / m_tick_size) * m_tick_size, _Digits));
   return(NormalizeDouble(price, _Digits));
  }
//+------------------------------------------------------------------+
 
Rogerio Giannetti Torres:

Olá Felipe,

pelo seu agradecimento, coisa raríssima nesse fórum, segue umas dicas para corrigir e generalizar o seu EA

1) Os preços em uma ordem devem ser múltiplos do TICK SIZE do instrumento, leia sobre o conceito na internet. Então para evitar INVALID STOPS use a normalização de preço como exemplificada abaixo:

2) Para evitar  INVALID PRICE  os preços dos stops não podem ficar dentro do spread e devem obedecer ao nível mínimo de stop ( muito comum em FOREX ) leia no MQL5 o conceito de nível mínimo de stop;

Poxa... mais uma vez muito obrigado Rogério!!

Implementei essa alteração conforme sua sugestão!!

Apenas uma dúvida, o valor 1.0078 é padrão?

 
Felipe Passos De Moraes Alves:


Apenas uma dúvida, o valor 1.0078 é padrão?

Não.