How can i get ticket of the last position?


After i use “PositionClose()” and my open position get closed, I want to know ticket of the last order and use “GetLastOrderTicket()” Function as below:

but the ticket returnd is for The last one left. How can i fix it?

ulong GetLastOrderTicket()
//--- request history for the last 10 days
      //--- notify on unsuccessful call and return -1
      Print(__FUNCTION__," HistorySelect() returned false");
      return -1;
   ulong first_order,last_order,orders=HistoryOrdersTotal();
//--- work with orders if there are any
    //  Print("Orders = ",orders);
   //    PrintFormat("first_order = %d",first_order);
         Print("GetLastOrderTicket 1    Num orders:",orders,"    first_order:",first_order,"    last_order:",last_order);
         return last_order;
      return first_order;
//--- no order found, return -1
   return -1;

If you want to know something about a closed position, you have to work with “deals” not with “orders”.


Thanks a lot…

But i could’nt solve my problem.
Immediately after PositionClose() , I cant get profit of last closed position.

After using PositionClose() function, i use HistorySelect() and HistoryDealsTotal(). but the last Deal returned does’nt refers to Last Closed position.


test_PositionClose.mq5 4 KB

if(!HistorySelect(from,to + 100))

There are plenty of problems with your code. The 2 main in your specific case is :

1° When PositionClose() returns true, that means the order to close has been successfully sent, not that the position is already close (and that MT5 is aware of it). In a script you would need to use Sleep(), in an EA better use OnTrade() or OnTradeTransaction().

2° No need to use HistorySelect() (wrongly as noted by fxsaber), and you can’t be sure the last index (deals-1) is the one concerning your position.

You know the position ticket, you should use it :


(strictly speeking, a position ID should be use with HistorySelectByPosition(), but in your case is the same as the position ticket anyway).

Using Sleep() is not OK in Tester , but when I run the program, it works correctly.

There is no need to Sleep() in the tester as the result is immediate, no delay implied.