Take Profit Order Achieved but the order is not closed!

 
void TpModify(double tp)
{
 
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double TakeProfit_B=NormalizeDouble(Ask+minstoplevel + tp*Point,Digits); //BUY
   double TakeProfit_S=NormalizeDouble(Bid-minstoplevel - tp*Point,Digits); //SELL
   
      for (int i=OrdersTotal()-1; i>=0; i--)
      {
         if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))continue;
         if(OrderSymbol()!=Symbol())continue;
         if(OrderMagicNumber()!= MagicNumber)continue;

            if (OrderType() == OP_BUY)
               {
                 if (OrderOpenPrice()<  TakeProfit_B)
                     {                  
                     if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), 0,0, clrGreen))
                        Print("Modifying order, delete TakeProfit"); 
                     }
                   
                  if (tp< TakeProfit_B)
                   {
                     if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), TakeProfit_B,0, clrGreen))
                        Print("Modifying order, TakeProfit_B!");
                     else
                        Print("Error modifying order!, error#", GetLastError());
                   }     
                  else if(tp> TakeProfit_B)  
                  {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), tp, 0, clrGreen))
                        Print("Modifying order!");
                     else
                        Print("Error modifying order!, error#", GetLastError());
                  }
               
               }
            if (OrderType()==OP_SELL)
               {  
                  
                 if (OrderOpenPrice()> TakeProfit_S)
                     {                  
                        if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), 0,0, clrGreen))
                           Print("Modifying order, delete TakeProfit"); 
                     }
                   if (tp< TakeProfit_S)
                   {
                     if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), TakeProfit_S, 0, clrGreen))
                        Print("Modifying orderTakeProfit_S!");
                     else
                        Print("Error modifying order!, error#", GetLastError());
                   }     
                  else if (tp> TakeProfit_S)
                  {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), tp, 0, clrGreen))
                        Print("Modifying order!");
                     else
                        Print("Error modifying order!, error#", GetLastError());
                  }
               
               }
         }

Guys I made this function that moves me the tp of the orders, in input I pass him the value of an average, now this happens sometimes despite the take is "taken" the order does not close (I enclose screen), and then it also happens that the take follows the price then the price is (withdraws) and the take remains without closing the order (I do not know how to explain better I should make a video)

have you ever had any suggestions?

Files:
Media.jpg  95 kb
 

You buy at the Ask and sell at the Bid. Pending Buy Stop orders become market orders when hit and open at the Ask.

  1. Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid / OrderClosePrice reaches it. Using the Ask±n, makes your SL shorter and your TP longer, by the spread. Don't you want the specified amount used in either direction?

  2. Your sell order's TP/SL (or Buy Stop's/Buy Limit's entry) will be triggered when the Ask / OrderClosePrice reaches it. To trigger close to a specific Bid price, add the average spread.
              MODE_SPREAD (Paul) - MQL4 programming forum - Page 3 #25

  3. The charts show Bid prices only. Turn on the Ask line to see how big the spread is (Tools → Options (control+O) → charts → Show ask line.)
    Most brokers with variable spreads widen considerably at end of day (5 PM ET) ± 30 minutes. My GBPJPY (OANDA) shows average spread = 26 points, but average maximum spread = 134 (your broker will be similar).