Ordem para modificar o Stop e o Profit não funcionando, HELPPP

 

Fiz um EA que opera ações no leilão de abertura. Ele basicamente coloca uma ordem limite durante o leilão e quando o mercado abre ele modifica o TP e o SL 1% acima e abaixo do preço de abertura.

Mas estou tendo um problema, quando o mercado abre, ele executa a ordem de compra com perfeição, mas sempre da erro na hora de mudar o TP e o SL, o robô foi feito para esperar 20 ticks antes de modificar a posição, já que se for no primeiro tick, ele pegara os preços da ultima vela do dia anterior.

Agora se eu compro a ação no manual e uso outro robô só com a ordem de modificar, ele modifica sem problema
Alguém sabe o que está rolando ?


//+------------------------------------------------------------------+

//|                                                 1%_buy_limit.mq5 |

//|                                        mateustavares48@gmail.com |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "mateustavares48@gmail.com"

#property link      "https://www.mql5.com"

#property version   "1.00"


input int lotes = 100 ;// numero de lotes


MqlTradeRequest requisicao;

MqlTradeResult resultado;

MqlBookInfo book[];

MqlDateTime tempoAgora;

MqlRates candles[];

MqlTick ticks;


int numero_magico = 123456;

int x = 0;

int z = 0;




//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void Compra()

  {




   ZeroMemory(requisicao);

   ZeroMemory(resultado);


   requisicao.action = TRADE_ACTION_PENDING;

   requisicao.magic = numero_magico;

   requisicao.volume = lotes;

   requisicao.symbol = _Symbol;

   requisicao.price = NormalizeDouble(book[0].price + 50 *_Point,_Digits);

   requisicao.tp = 0;

   requisicao.sl = 0;

   requisicao.deviation = 0;

   requisicao.type = ORDER_TYPE_BUY_LIMIT;

   requisicao.type_filling = ORDER_FILLING_RETURN;


   OrderSend(requisicao,resultado);


   if(resultado.retcode == 10008 || resultado.retcode == 10009)

     {

      Print("Ordem de Compra executada com sucesso!");

     }

   else

     {

      Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());

      ResetLastError();

     }

  }




//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void modifcarSLTP()

  {

   ZeroMemory(requisicao);

   ZeroMemory(resultado);

   requisicao.action = TRADE_ACTION_SLTP;

   requisicao.symbol = _Symbol;

   requisicao.sl = NormalizeDouble(candles[0].open * 0.99,_Digits);    

   requisicao.tp = NormalizeDouble(candles[0].open * 1.01,_Digits);

   requisicao.position = 0;

   OrderSend(requisicao,resultado);


   if(resultado.retcode == 10008 || resultado.retcode == 10009)

     {

      Print("Posição Modificada com sucesso!");

      x = x+1;

     }

   else

     {

      Print(" Erro ao modificar posição = ", GetLastError());

      ResetLastError();

     }


  }


//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- create timer

   EventSetTimer(5);

   CopyRates(_Symbol,PERIOD_D1,0,4,candles);

   ArraySetAsSeries(candles,true);

   MarketBookAdd(_Symbol);

   MarketBookGet(_Symbol,book);

   SymbolInfoTick(_Symbol,ticks);

//---

   Compra();


   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//--- destroy timer

   EventKillTimer();


  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

z = z+1;


      if(x<1 && z > 20)

     {

      modifcarSLTP();


     }

  

   



  }

//+------------------------------------------------------------------+

//| Timer function                                                   |

//+------------------------------------------------------------------+

void OnTimer()

  {

//---


  }

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2021.03.02
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
mostra o erro que está aparecendo
 

da o erro 4756 sempre que ele tentar modificar o TP e o Sl

 

É amigo, ou vc manda mais dados ou assim fica dificil para eu te ajudar.

Esse erro que exibe é preço invalido, então vc tem que enviar aqui qual o preço que ele está tentando colocar

 

Acrescentando mais sugestões às já passadas pelo @Eduardo Oliveira, tente também incluir a função a seguir em seu código:


//+--------------------------------------------------------------------------------------------------------------------+
//| This function normalizes and adjusts the price to the TICK SIZE                                                    |
//+--------------------------------------------------------------------------------------------------------------------+
double NormalizePrice(double Price)
  {
   //--- Get the minimal price change
   double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

   //--- Return the price normalized and adjusted to the TICK SIZE
   return(NormalizeDouble(MathRound(Price / TickSize) * TickSize, _Digits));
  }

(fórmula sugerida por  @Rogerio Giannetti Torres nesse outro tópico)


... Depois, onde você calcula .price.tp e .slutilize a função acima em vez de NormalizeDouble().

 
Eduardo Oliveira:

É amigo, ou vc manda mais dados ou assim fica dificil para eu te ajudar.

Esse erro que exibe é preço invalido, então vc tem que enviar aqui qual o preço que ele está tentando colocar

O preço que ele tenta colocar é o preço de abertura + 1% para o  TP e abertura - 1% para o  SL, o robô já ta programado pra entrar no leilão, então eu queria que quando o mercado abrisse ele modificasse o TP e SL de acordo com o preço que abriu, mas sempre da o preço invalido na hora de modificar.
 
Vinicius de Oliveira:

Acrescentando mais sugestões às já passadas pelo @Eduardo Oliveira, tente também incluir a função a seguir em seu código:


(fórmula sugerida por  @Rogerio Giannetti Torres nesse outro tópico)


... Depois, onde você calcula .price.tp e .slutilize a função acima em vez de NormalizeDouble().

Vou acrescentar esse codigo, Obrigado
Razão: