CPositionInfo::SelectByIndex()

 

На неттинге, метод CPositionInfo::SelectByIndex() должен возвращать позиции в порядке сортировки по времени (msc) открытия позиции?

Или это изначально неправильное построение списка позиций методом PositionsTotal()?

 

Имеется три позиции, вот такой код:

//+------------------------------------------------------------------+
//|                    Is sorting according to m_position.Ticket.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\PositionInfo.mqh>
CPositionInfo  m_position;                   // trade position object
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  Print("Select By Index:");
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         Print("position ticket ",m_position.Ticket(),", position opening in (msc)",m_position.TimeMsc());
  
  }
//+------------------------------------------------------------------+

выдаёт:

2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5)   Select By Index:
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5)   position ticket 41106934, position opening in (msc)1480550551775
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5)   position ticket 41087567, position opening in (msc)1480530602752
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5)   position ticket 41087566, position opening in (msc)1480530602746

Обратите внимание, позиция с тикетом 41087566 имеет время 1480530602746, но оказалась в списке после позиции с тикетом 41087567 и временем открытия 1480530602752.

 

Итак вопрос: изначально неверное составление списка методом PositionsTotal() или метод CPositionInfo::SelectByIndex():

 

//+------------------------------------------------------------------+
//| Select a position on the index                                   |
//+------------------------------------------------------------------+
bool CPositionInfo::SelectByIndex(const int index)
  {
   ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
   if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      ulong ticket=PositionGetTicket(index);
      if(ticket==0)
         return(false);
     }
   else
     {
      string name=PositionGetSymbol(index);
      if(name=="")
         return(false);
     }
//---
   return(true);
  }

перекручивает список? 

 

2016.12.01 08:05:55.334 Terminal        MetaTrader 5 x64 build 1486 started (MetaQuotes Software Corp.)
2016.12.01 08:05:55.336 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 4926 / 8077 Mb, HDD: 385991 / 476372 Mb, GMT+02:00
2016.12.01 08:05:55.336 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


 

 

Время открытия позиции - довольно скользкое понятие. Это время первого ENTRY_IN или ENTRY_INOUT. Можно закрывать частично позицию (или доливать), а время ее открытия не будет меняться. Хотя логично, что после частичного закрытия это уже другая позиция. Поэтому возвращать сортировку по времени вовсе не требуется. Сортировка же истории есть.

Скорее всего, сортировка позиций идет по времени их последних изменений - времени соответствующих сделок в истории. В этом есть логика.

 
@Rashid Umarov, зачем выбор позиции для Hedge и Netto сделали по-разному?
//+------------------------------------------------------------------+
//| Select a position on the index                                   |
//+------------------------------------------------------------------+
bool CPositionInfo::SelectByIndex(const int index)
  {
   ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
   if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      ulong ticket=PositionGetTicket(index);
      if(ticket==0)
         return(false);

     }
   else
     {
      string name=PositionGetSymbol(index);
      if(name=="")
         return(false);
     }
//---
   return(true);
  }
PositionGetTicket отлично работает на обоих типах счетов. Поэтому вся функция могла бы быть только в виде выделенных строк.
 
fxsaber:

Время открытия позиции - довольно скользкое понятие. Это время первого ENTRY_IN или ENTRY_INOUT. Можно закрывать частично позицию (или доливать), а время ее открытия не будет меняться. Хотя логично, что после частичного закрытия это уже другая позиция. Поэтому возвращать сортировку по времени вовсе не требуется. Сортировка же истории есть.

Скорее всего, сортировка позиций идет по времени их последних изменений - времени соответствующих сделок в истории. В этом есть логика.

Про время открытия (журнал):

2016.11.30 17:30:02.652 Trades  '180653': market sell 0.01 EURUSD sl: 1.06632 tp: 1.05422
2016.11.30 17:30:02.653 Trades  '180653': market buy 0.01 AUDUSD sl: 0.73355 tp: 0.74455
*
2016.11.30 17:30:02.674 Trades  '180653': accepted market sell 0.01 EURUSD sl: 1.06632 tp: 1.05422
2016.11.30 17:30:02.686 Trades  '180653': accepted market buy 0.01 AUDUSD sl: 0.73355 tp: 0.74455
*
2016.11.30 17:30:02.748 Trades  '180653': deal #30906140 sell 0.01 EURUSD at 1.05704 done (based on order #41087566)
2016.11.30 17:30:02.749 Trades  '180653': order #41087566 sell 0.01 / 0.01 EURUSD at 1.05704 done in 97.684 ms
2016.11.30 17:30:02.752 Trades  '180653': deal #30906141 buy 0.01 AUDUSD at 0.73812 done (based on order #41087567)
2016.11.30 17:30:02.753 Trades  '180653': order #41087567 buy 0.01 / 0.01 AUDUSD at 0.73812 done in 101.827 ms
*
*
*

история (сделки)

История

 

После HistorySelectByPosition какое значение возвращает HistoryDealsTotal?

И опять же, нет логики в сортировке позиций по времени открытия. Она прослеживается только для сделок и ордеров.  

Причина обращения: