Creating Virtual Trailing Stop

 

Hello,


My existing code :


void TrailingStopLoss(int TrailingStopLoss_magic)
  {
// Loop through all open orders
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         double TrailingStopLoss_entryPrice = OrderOpenPrice();


        
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == TrailingStopLoss_magic && OrderType() == OP_BUY)
           {

            if(Bid - (TrailingStopLoss_entryPrice + Trailing_TP * Pips) > Pips * Trailing_Gap)
              {
               if(OrderStopLoss() < Bid - Pips * Trailing_Gap)
                 {
                  OrderModify(OrderTicket(), TrailingStopLoss_entryPrice + Trailing_TP * Pips, Bid - Pips * Trailing_Gap, OrderTakeProfit(), 0, clrNONE);

                 }
              }
           }

         
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == TrailingStopLoss_magic && OrderType() == OP_SELL)
           {

            if((TrailingStopLoss_entryPrice - Trailing_TP * Pips) - Ask > Pips * Trailing_Gap)
              {
               if(OrderStopLoss() > Ask + Pips * Trailing_Gap || OrderStopLoss() == 0.0)
                 {

                  OrderModify(OrderTicket(), TrailingStopLoss_entryPrice - Trailing_TP * Pips, Ask + Pips * Trailing_Gap, OrderTakeProfit(), 0, clrNONE);


                 }
              }
           }
        }
     }
  }


This code work fine but this modify order soo frequently, this make issue sometime when high ping rate or several order to modify at ones. And also many broker have limitation of order modification. So, i am planning to create Virtual and Hidden Trailing Stop equivalent to this code.


This is how i am doing :

void TrailingStopLoss(int TrailingStopLoss_magic)
{
    static string trailingStopLineBuy = "TrailingStopLineBuy";
    static string trailingStopLineSell = "TrailingStopLineSell";

    static double previousBid = 0.0;
    static double previousAsk = 0.0;

    // Calculate new trailing stop levels
    double newBid = Bid;
    double newAsk = Ask;

    if (previousBid != 0.0 && previousAsk != 0.0) {
        double trailingGapPips = Pips * Trailing_Gap;

        // For Buy Orders
        if (newBid > previousBid) {
            double trailingStopLoss = previousBid + Trailing_TP * Pips;
            double newStopLoss = NormalizeDouble(newBid - trailingGapPips, Digits);

            if (newStopLoss > trailingStopLoss) {
                // Update the stop loss internally without modifying the order
                trailingStopLoss = newStopLoss;
            }

            // Create or move horizontal line for Buy
            if (ObjectFind(trailingStopLineBuy) == -1)
                ObjectCreate(trailingStopLineBuy, OBJ_HLINE, 0, 0, trailingStopLoss);
            else
                ObjectMove(trailingStopLineBuy, 0, 0, trailingStopLoss);
            ObjectSetInteger(0, trailingStopLineBuy, OBJPROP_COLOR, clrPurple);

            // Check if price reaches trailing stop and close the order
            if (newBid <= trailingStopLoss) {
                // Close the buy order
                OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrRed);
            }
        }

        // For Sell Orders
        if (newAsk < previousAsk) {
            double trailingStopLoss = previousAsk - Trailing_TP * Pips;
            double newStopLoss = NormalizeDouble(newAsk + trailingGapPips, Digits);

            if (newStopLoss < trailingStopLoss) {
                // Update the stop loss internally without modifying the order
                trailingStopLoss = newStopLoss;
            }

            // Create or move horizontal line for Sell
            if (ObjectFind(trailingStopLineSell) == -1)
                ObjectCreate(trailingStopLineSell, OBJ_HLINE, 0, 0, trailingStopLoss);
            else
                ObjectMove(trailingStopLineSell, 0, 0, trailingStopLoss);
            ObjectSetInteger(0, trailingStopLineSell, OBJPROP_COLOR, clrPurple);

            // Check if price reaches trailing stop and close the order
            if (newAsk >= trailingStopLoss) {
                // Close the sell order
                OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrRed);
            }
        }
    }

    // Store current Bid and Ask for next iteration
    previousBid = newBid;
    previousAsk = newAsk;
}

But not working :( .  I made several changes but not sure where i am making mistake.

Reason: