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

Back to topics list To post a new topic, please log in or register
avatar
14
Jagg 2016.04.12 15:51
 

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)?

avatar
12985
WHRoeder 2016.04.12 20:59 #
 
  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.
avatar
14
Jagg 2016.04.13 12:02 #
 

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);
}
avatar
12985
WHRoeder 2016.04.13 14:49 #
 
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++)

avatar
14
Jagg 2016.04.14 08:52 #
 
Changed your mentioned parts... thanks again WHRoeder.
Back to topics list  

To add comments, please log in or register