CHistoryPositionInfo class provides an easy access to the closed position properties.
The class has a similar interface to CPositionInfo class of the standard library.
class CHistoryPositionInfo : public CObject   { public:                     CHistoryPositionInfo(void);                     ~CHistoryPositionInfo(void);   //--- methods of access to protected data   ulong            Ticket(void)          const { return(m_curr_ticket); }   //--- fast access methods to the integer position properties   datetime          TimeOpen(void);   ulong            TimeOpenMsc(void);   datetime          TimeClose(void);   ulong            TimeCloseMsc(void);   ENUM_POSITION_TYPE PositionType(void);   string            TypeDescription(void);   long              Magic(void);   long              Identifier(void);   ENUM_DEAL_REASON  OpenReason(void);   ENUM_DEAL_REASON  CloseReason(void);   //--- fast access methods to the double position properties   double            Volume(void);   double            PriceOpen(void);   double            StopLoss(void) const;   double            TakeProfit(void) const;   double            PriceClose(void);   double            Commission(void);   double            Swap(void);   double            Profit(void);   //--- fast access methods to the string position properties   string            Symbol(void);   string            OpenComment(void);   string            CloseComment(void);   string            OpenReasonDescription(void);   string            CloseReasonDescription(void);   string            DealTickets(const string separator = " ");   //--- info methods   string            FormatType(string &str,const uint type) const;   string            FormatReason(string &str,const uint reason) const;   //--- methods for select position   bool              HistorySelect(datetime from_date,datetime to_date);   int              PositionsTotal(void) const;   bool              SelectByTicket(const ulong ticket);   bool              SelectByIndex(const int index);   };
Here is a sample code showing how to use the class in your code
#include <CHistoryPositionInfo.mqh> //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void OnStart()   { //--- variable to hold the history position info   CHistoryPositionInfo hist_position; //--- Retrieve the history of closed positions for the specified period   if(!hist_position.HistorySelect(0,TimeCurrent()))     {       Alert("CHistoryPositionInfo::HistorySelect() failed!");       return;     } //--- now process the list of closed positions   int total = hist_position.PositionsTotal();   for(int i = 0; i < total; i++)     {       //--- Select a closed position by its index in the list       if(hist_position.SelectByIndex(i))         {         ulong    ticket            = hist_position.Ticket();         datetime time_open        = hist_position.TimeOpen();         ulong    time_open_msc    = hist_position.TimeOpenMsc();         datetime time_close        = hist_position.TimeClose();         ulong    time_close_msc    = hist_position.TimeCloseMsc();         long    type              = hist_position.PositionType();         string  type_desc        = hist_position.TypeDescription();         long    magic            = hist_position.Magic();         long    pos_id            = hist_position.Identifier();         double  volume            = hist_position.Volume();         double  price_open        = hist_position.PriceOpen();         double  price_sl          = hist_position.StopLoss();         double  price_tp          = hist_position.TakeProfit();         double  price_close      = hist_position.PriceClose();         double  commission        = hist_position.Commission();         double  swap              = hist_position.Swap();         double  profit            = hist_position.Profit();         string  symbol            = hist_position.Symbol();         string  open_comment      = hist_position.OpenComment();         string  close_comment    = hist_position.CloseComment();         string  open_reason_desc  = hist_position.OpenReasonDescription();         string  close_reason_desc = hist_position.CloseReasonDescription();         string  deal_tickets      = hist_position.DealTickets(",");         //---         int      deals_count      = HistoryDealsTotal();  // of the selected position         int      orders_count      = HistoryOrdersTotal();  // of the selected position         }     } //---   Print("Total closed positions = ",hist_position.PositionsTotal());   } //+------------------------------------------------------------------+
Note: when using the methods HistorySelect() and SelectByIndex(), the list of positions is ordered by time of closing (not by the opening times).
This means the history of closed positions (data rows) is ordered by Close Time to help calculate the running Balance, correctly.