some programming help please

 
I would like to program this

IF NUMBER OF OPEN TRADES = 8 THEN CLOSE THE OLDEST OPEN TRADE

thanks
 
if( OrdersTotal() >= 8 )
    if( OrderSelect(0, SELECT_BY_POS) )
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3);
 
No, it's incorrect.

1. Check number of open orders.
2. If number greater then 8 --> find oldest order and remember its ticket.
3. Close order with this ticket.
 
fireflies:
if( OrdersTotal() >= 8 )
    if( OrderSelect(0, SELECT_BY_POS) )
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3);

I want to close the oldest market order if there are >=8 market orders,  but to ignore all the pending orders
 
  extern int Magic = ...
 
  //-----
 
  int BuyCnt = 0;
  int SellCnt = 0;
  
  int cnt = OrdersTotal();
  for (int i=0; i < cnt; i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    
    int type = OrderType();
    if (type == OP_BUY) BuyCnt++;
    if (type == OP_SELL) SellCnt++;
  }
  
  if (BuyCnt+SellCnt < 8) return;
 
  //-----
 
  datetime tm = 0;
  int ticket = -1;
 
  cnt = OrdersTotal();
  for (i=0; i < cnt; i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    
    type = OrderType();
    if (type == OP_BUY || type == OP_SELL)
    {
      if (OrderOpenTime() > tm)
      {
        tm = OrderOpenTime();
        ticket = OrderTicket();
      }
    }
  }
 
  //-----
 
  if (ticket != -1) OrderClose(ticket, ...
 
RickD:
  extern int Magic = ...
 
  //-----
 
  int BuyCnt = 0;
  int SellCnt = 0;
  
  int cnt = OrdersTotal();
  for (int i=0; i < cnt; i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    
    int type = OrderType();
    if (type == OP_BUY) BuyCnt++;
    if (type == OP_SELL) SellCnt++;
  }
  
  if (BuyCnt+SellCnt < 8) return;
 
  //-----
 
  datetime tm = 0;
  int ticket = -1;
 
  cnt = OrdersTotal();
  for (i=0; i < cnt; i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    
    type = OrderType();
    if (type == OP_BUY || type == OP_SELL)
    {
      if (OrderOpenTime() > tm)
      {
        tm = OrderOpenTime();
        ticket = OrderTicket();
      }
    }
  }
 
  //-----
 
  if (ticket != -1) OrderClose(ticket, ...

What to put here
extern int Magic = ...

and here
if (ticket != -1) OrderClose(ticket, ...

?
 
hopokuk:
What to put here
extern int Magic = ...

12345 for example.

hopokuk:
and here
if (ticket != -1) OrderClose(ticket, ...

?

RTFM
 
RickD:
hopokuk:
What to put here
extern int Magic = ...

12345 for example.

hopokuk:
and here
if (ticket != -1) OrderClose(ticket, ...

?

RTFM
Okay it works thanks
 
int close_trade_ticket;
 
int start()
 {
  if (closeTrade(8, 5, 0, 0))
   Print ("Order closed with ticket number "+close_trade_ticket);
  else if (close_trade_ticket > 0)
   Print ("Unsuccessful closing order with ticket number "+close_trade_ticket);
  return(0);
 }
 
bool closeTrade (int oldest, int times_to_retry, int type, int Magic)
 {
  int opened_trades,count,ticket_time=TimeCurrent();
  close_trade_ticket=0;
  bool result;
  double price;
 
  for (int i=0; i < OrdersTotal(); i++) 
   {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
     {
      if (OrderType() == OP_BUY || OrderType() == OP_SELL)
       {
        opened_trades++;
        if (OrderOpenTime() < ticket_time)
         {
          close_trade_ticket=OrderTicket();
          ticket_time=OrderOpenTime();
         {
       }
     }
   }
 
  if (opened_trades>=oldest) 
   {
    if(!IsTesting()) price=MarketInfo(Symbol(),9+OrderType());
    else
     {
      if (OrderType() == OP_BUY) price=Bid;
      else price=Ask;
     }
 
    while(!result)
     {
      result=OrderClose ( close_trade_ticket, OrderLots(), price, 0);
      count++;
      if (count >= times_to_retry) break;
     }
   }
   
  else close_trade_ticket=0;
 
  return(result);
 }

 
Rosh:
No, it's incorrect.

1. Check number of open orders.
2. If number greater then 8 --> find oldest order and remember its ticket.
3. Close order with this ticket.
Thanks Rosh.
So you're saying that the orders in the pool are not stored in any particular order?
How about the ticket number. Is it monotonic increasing or just some random but unique number?
 
Tickets numbers are monotonic increasing and always are unique.
Reason: