Count opened orders of a day (without all those partial closes)

 

Hi,

I want to get the number of trades from a day I've done so I loop through OrdersHistoryTotal. Problem now is I often do partial closes of an order so the total number of trades I get now from my code is way too high because of all those partial closed trades which are present in History Tab.

Example:

- buy 0.5 lots EURUSD 
- partial close/sell with 0.1 lot
- another partial close/sell with 0.2 lots 
- trade exit with reminder 0.2 lot

^^^This get counted as 3 trades. I want to get this as 1 trade counted.

Is it ok to rely on that "from #...."/"to #...." OrderComment the broker do? So count all orders which have not "to #" in the comment gives me my total opened trades (without all those partial closes)?

 if (StringFind(OrderComment(),"to #", 0) == -1)
 {
   OrdersTotalWithThatMagicNumber++;
 }

Or other there better ways to do it (because relying on that order comment is vague afaik because every broker can do their own thing here)?

 
  1. Sort the trades by OrderOpenTime. Sum the ones that have the same time.
  2. Not a good idea, brokers can change comments, including complete replacement.
 

Thanks, done this (and looks ok)...

 

datetime OrdersSortByOrderOpenTime[]; //Array to store trade open times
dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
int total = GetTradesTotalOfThatDay("", -1, MagicNumber, dt);

int GetTradesTotalOfThatDay(string sy = "", int op = -1, int mn = -1, datetime dt = 0)
{
  int OrdersTotalWithThatMagicNumber = 0;
  ArrayResize(OrdersSortByOrderOpenTime, 0); //reset array
  int j = 0;
  if (sy == "0") sy = Symbol();

  for (int i = OrdersHistoryTotal()-1; i >=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if ((OrderSymbol() == sy || sy == "") && (op < 0 || OrderType() == op))
      {
        if (OrderType() == OP_BUY || OrderType() == OP_SELL)
        {
          if (mn < 0 || OrderMagicNumber() == mn)
          {
            if (dt < OrderCloseTime())
            {
              ArrayResize(OrdersSortByOrderOpenTime, j+1);
              OrdersSortByOrderOpenTime[j] = OrderOpenTime();
              j++;
            }
          }
        }
      }
    }
  } // for (int i = OrdersHistoryTotal()-1; i >=0; i--)
  
   datetime OldOpenTime;
   //Sort array
   int size_OrdersSortByOrderOpenTime = ArraySize(OrdersSortByOrderOpenTime);

   if (size_OrdersSortByOrderOpenTime > 0) {
      ArraySort(OrdersSortByOrderOpenTime, WHOLE_ARRAY, 0, MODE_ASCEND);
      
      for (int cc = 0; cc <= size_OrdersSortByOrderOpenTime-1; cc++)
      {
         if(OldOpenTime != OrdersSortByOrderOpenTime[cc]) {
            OldOpenTime = OrdersSortByOrderOpenTime[cc];
            OrdersTotalWithThatMagicNumber++;
         }
      }//for (int cc = 0; cc <= size_OrdersSortByOrderOpenTime-1; cc++)

   } // if (ArraySize(OrdersSortByOrderOpenTime) > 0) {
   
  return (OrdersTotalWithThatMagicNumber);
}
 
Uninitialized variable is random value. Set to 0 as no open order has that time.
datetime OldOpenTime;
You just wanted the count, but if you also needed the tickets then make it a 2D array
double OrdersSortByOrderOpenTime[][2]; //Array to store trade open times
:
              OrdersSortByOrderOpenTime[j][0] = OrderOpenTime();
              OrdersSortByOrderOpenTime[j][1] = OrderTicket();
:
if(OrdersSortByOrderOpenTime[i][0] == OrdersSortByOrderOpenTime[i+1][0])
  PrintFormat("Tickets %i and %i were once one",
              OrdersSortByOrderOpenTime[i][1],
              OrdersSortByOrderOpenTime[i+1][1]);
  
N extra unnecessary subtractions.
for (int cc = 0; cc <= size_OrdersSortByOrderOpenTime-1; cc++)
Use the C idiom index < count
for (int cc = 0; cc < size_OrdersSortByOrderOpenTime; cc++)
 
Changed your mentioned parts... thanks again WHRoeder.