OrderSelect Problem

 

hey there

hope you find it in a good health

i am trying to select only the first and last buy order but i cant get the loop condition

i am using the ticket number but still not working

any help will be highly appreciated

Thanks

 

Filter for:

  • OrderMagicNumber() if needed
  • OrderSymbol() if needed
  • Ordertype() == OP_BUY
  • OrderOpenTime()
Ticket number is not needed.
 

thank you very much for your reply sir

for instance

there are 6 orders

1st  buy

2nd sell

3rd buy

4th sell

5th buy

6th sell

i want to select the first and last buy only and not the second buy

 

look for the oldest and the newest ones.

Post your code if you want help.

 
double ABuy()
  
  {
   double Lots = 0;
   double OrderOPrice = 0;
   double LotsPrice = 0;
   double a = 0;
   
   for (int i = OrdersTotal() - 1; i >= 0; i--)
     {
      bool select = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == _Symbol && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
        {
        Alert( Lots = Lots + OrderLots());
         LotsPrice = LotsPrice + OrderLots() * OrderOpenPrice();
        }
        
     }
   
   if(Lots > 0) a = LotsPrice/Lots;

   return(a);
  }
 
//+------------------------------------------------------------------+
//---> find first buy
//+------------------------------------------------------------------+
int FirstBuy()
  {
   datetime time=0;
   int ticket=-1;
//--- find first buy
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber()==MagicNumber)
                 {
                  if(OrderOpenTime() > time || time==0)
                    {
                     time=OrderOpenTime();
                     ticket=OrderTicket();
                    }
                 }
              }
           }
        }
     }
   return(ticket);
  }
//+------------------------------------------------------------------+
//---> find last buy
//+------------------------------------------------------------------+
int LastBuy()
  {
   datetime time=0;
   int ticket=-1;
//--- find last buy
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber()==MagicNumber)
                 {
                  if(OrderOpenTime() < time || time==0)
                    {
                     time=OrderOpenTime();
                     ticket=OrderTicket();
                    }
                 }
              }
           }
        }
     }
   return(ticket);
  }
//+------------------------------------------------------------------+
These return the ticket number so you can then use that to load the additional values.
 
 

sir can you please check that it is okay

market is off today and i cannot test it

 
double AveragePrice(int type)
 
  {
   double Lots = 0;
   double OrderOPrice = 0;
   double LotsPrice = 0;
   double average = 0;
   double Lots1 = 0;
   double LotsPrice1 = 0;   
   double Lots2 = 0;
   double LotsPrice2 = 0;
   
   for (int i = OrdersTotal() - 1; i >= 0; i--)
     {
      bool select = OrderSelect(FirstBuy(), SELECT_BY_TICKET, MODE_HISTORY);
      if(select && OrderSymbol() == _Symbol && OrderType() == type)// && OrderMagicNumber() == MagicNumber)
        {
         Lots1 = OrderLots();
         LotsPrice1 = OrderLots() * OrderOpenPrice();
        }
      
      bool s = OrderSelect(LastBuy(), SELECT_BY_TICKET, MODE_HISTORY);
      if(s && OrderSymbol() == _Symbol && OrderType() == type)// && OrderMagicNumber() == MagicNumber)
        {
         Lots2 = OrderLots();
         LotsPrice2 = OrderLots() * OrderOpenPrice();
        }
     }
     
   Lots = Lots1 + Lots2;
   LotsPrice = LotsPrice1 + LotsPrice2;
   
   if(Lots > 0) average = LotsPrice/Lots;

   return(average);
  }
Reason: