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.