MQL5: Closed order detail

 void lastclosedorder()

  {

   uint TotalNumberOfDeal = HistoryDealsTotal();

   ulong Ticket = 0;

   long OrderType, DealEntry, Reason;

   string MySymbol = "";

   double price = 0, stoploss = 0, target = 0;

   double ltp = iClose(Symbol(), PERIOD_CURRENT, 0); // Last tick price or market price


// Persistent static array to store processed tickets

   static ulong ProcessedTickets[];

   static int ProcessedTicketsCount = 0;


   HistorySelect(0, TimeCurrent()); // Select the history for the current time range


   for(uint i = 0; i < TotalNumberOfDeal; i++)

     {

      // Get the ticket ID

      if((Ticket = HistoryDealGetTicket(i)) > 0)

        {

         // Check if this ticket has already been processed

         if(IsTicketProcessed(Ticket, ProcessedTickets, ProcessedTicketsCount))

            continue; // Skip this ticket if already processed


         // Retrieve deal information

         OrderType = HistoryDealGetInteger(Ticket, DEAL_TYPE);

         MySymbol = HistoryDealGetString(Ticket, DEAL_SYMBOL);

         DealEntry = HistoryDealGetInteger(Ticket, DEAL_ENTRY);

         Reason = HistoryDealGetInteger(Ticket, DEAL_REASON);

         // price = HistoryDealGetDouble(Ticket, DEAL_PRICE);

         stoploss = HistoryDealGetDouble(Ticket, DEAL_SL);

         target = HistoryDealGetDouble(Ticket, DEAL_TP);

         long magic_number = HistoryOrderGetInteger(Ticket, ORDER_MAGIC);

        


         // Check if this deal matches the current symbol and is an exit deal

         if(MySymbol == Symbol() && DealEntry == DEAL_ENTRY_OUT&&int(magic_number)==int(MagicNumber))

           {

            printf("OrderType: " + IntegerToString(OrderType) +

                   " MySymbol: " + MySymbol +

                   " DealEntry: " + IntegerToString(DealEntry) +

                   " Reason: " + IntegerToString(Reason)+

                   " price: " + IntegerToString(price)+

                   " stoploss: " + IntegerToString(stoploss)+

                   " target: " + IntegerToString(target));


            if(Reason == 4 && OrderType == 1)

              {

               price = stoploss+InitialTradeSl;

               if(ltp < price)

                 {

                  for(int i = 0; i < ArraySize(parts); i++)

                    {

                     trade.SetExpertMagicNumber(MagicNumber);

                     PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_BUY_STOP,stoploss, target);

                    }

                 }


               if(ltp > price)

                 {

                  for(int i = 0; i < ArraySize(parts); i++)

                    {

                     trade.SetExpertMagicNumber(MagicNumber);

                     PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_BUY_LIMIT,stoploss, target);

                    }

                 }

              }


            if(Reason == 4 && OrderType == 0)

              {

               price = stoploss-InitialTradeSl;


               if(ltp < price)

                 {

                  for(int i = 0; i < ArraySize(parts); i++)

                    {

                     trade.SetExpertMagicNumber(MagicNumber);

                     PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_SELL_LIMIT,stoploss, target);

                    }

                 }


               if(ltp > price)

                 {

                  for(int i = 0; i < ArraySize(parts); i++)

                    {

                     trade.SetExpertMagicNumber(MagicNumber);

                     PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_SELL_STOP,stoploss, target);

                    }

                 }

              }

           }


         // Mark this ticket as processed

         ArrayResize(ProcessedTickets, ProcessedTicketsCount + 1);

         ProcessedTickets[ProcessedTicketsCount++] = Ticket;

        }

     }

  }


// Function to check if a ticket is already processed

bool IsTicketProcessed(ulong ticket, ulong &processedTickets[], int processedCount)

  {

   for(int i = 0; i < processedCount; i++)

     {

      if(processedTickets[i] == ticket)

         return true; // Ticket already processed

     }

   return false;

  }


Comments

Popular posts from this blog

MQL5 : Add time to current time in mins