Как правильно определить данные конкретной позиции на истории?

 

Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.

А вот после ее закрытия ???


Пока она открыта можно определить ее   Position_ID=PositionGetInteger(POSITION_IDENTIFIER);

После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...

что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?

Или можно использовать функции для обычной позиции? 

 
Gennady Mazur:

Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.

А вот после ее закрытия ???


Пока она открыта можно определить ее   Position_ID=PositionGetInteger(POSITION_IDENTIFIER);

После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...

что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?

Или можно использовать функции для обычной позиции? 

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Times New Roman'}
Попробуйте смотреть историю сделок. По ним можно определить и профит и ID позиции, в которую они входили и тип позиции.
 
Геннадий, для тех, кто переходит на MQL5, полезной может оказаться статья "Ордерa, позиции и сделки в MetaTrader 5".
 
Gennady Mazur:

Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.

А вот после ее закрытия ???


Пока она открыта можно определить ее   Position_ID=PositionGetInteger(POSITION_IDENTIFIER);

После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...

что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?

Или можно использовать функции для обычной позиции? 

Функция HistorySelectByPosition() создает в mql5-программе список ордеров и список сделок с указанным идентификатором позиции
для дальнейшего обращения к элементам списка посредством соответствующих функций.
Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal().
Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(),
для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().
 
Gennady Mazur:

После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...

что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?

Тип закрытой позиции - противоположный тип последней сделки из полученной истории.

Время закрытия - время этой же сделки из полученной истории.

Общая комиссия - сумма комиссий всех сделок из полученной истории.

Профит - общий профит всех сделок из полученной истории.

 

Только Вы легко поймете, что нужность этих данных сомнительна, запустив такой советник

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера

fxsaber, 2017.01.28 18:00

// Для Netting-счета

input int Amount = 5;       // Количество OrderSend
input int Interval = 3; // Через сколько тиков делать очередной OrderSend

bool MyOrderSend( double Lots )
{
  MqlTick Tick;

  SymbolInfoTick(_Symbol, Tick);  

  MqlTradeRequest Request = {0};
  
  Request.action = TRADE_ACTION_DEAL;
  Request.symbol = _Symbol;
  
  if (Lots > 0)
  {
    Request.volume = Lots;
    Request.price = Tick.ask;
    Request.type = ORDER_TYPE_BUY;    
  }
  else
  {
    Request.volume = -Lots;
    Request.price = Tick.bid;
    Request.type = ORDER_TYPE_SELL;    
  }

  MqlTradeResult Result;

  return(OrderSend(Request, Result));
}

void OnInit()
{
  MyOrderSend(1); // Открываем начальную BUY-позицию
}

void OnTick()
{
  static int i = 1;
  static int Count = 0;
    
  if ((Count < Amount) && (i % Interval == 0))
    if (MyOrderSend((Count %2 == 0) ? -0.99 : 0.99)) // попеременно уменьшаем и увеличиваем BUY-позу на 0.99 лота
      Count++;
  
  i++;
}

Отчет

Ордера
Время открытияОрдерСимволТипОбъемЦенаS / LT / PВремяСостояниеКомментарий
2017.01.27 00:00:002EURUSDbuy1.00 / 1.001.068172017.01.27 00:00:00filled
2017.01.27 02:01:213EURUSDsell0.99 / 0.991.068152017.01.27 02:01:21filled
2017.01.27 03:14:274EURUSDbuy0.99 / 0.991.068112017.01.27 03:14:27filled
2017.01.27 04:05:505EURUSDsell0.99 / 0.991.068512017.01.27 04:05:50filled
2017.01.27 05:18:016EURUSDbuy0.99 / 0.991.068032017.01.27 05:18:01filled
2017.01.27 06:42:477EURUSDsell0.99 / 0.991.067492017.01.27 06:42:47filled
2017.01.27 23:59:598EURUSDsell0.01 / 0.011.069682017.01.27 23:59:59filledend of test
Сделки
ВремяСделкаСимволТипНаправлениеОбъемЦенаОрдерКомиссияСвопПрибыльБалансКомментарий
2017.01.27 00:00:001balance0.000.0010 000 000.0010 000 000.00
2017.01.27 00:00:002EURUSDbuyin1.001.0681720.000.000.0010 000 000.00
2017.01.27 02:01:213EURUSDsellout0.991.0681530.000.00-1.859 999 998.15
2017.01.27 03:14:274EURUSDbuyin0.991.0681140.000.000.009 999 998.15
2017.01.27 04:05:505EURUSDsellout0.991.0685150.000.0037.0010 000 035.15
2017.01.27 05:18:016EURUSDbuyin0.991.0680360.000.000.0010 000 035.15
2017.01.27 06:42:477EURUSDsellout0.991.0674970.000.00-50.169 999 984.99
2017.01.27 23:59:598EURUSDsellout0.011.0696880.000.001.549 999 986.53end of test
0.000.00-13.479 999 986.53

 В тестере, к сожалению, новое представление не реализовано, но по отчету не сложно понять, что это будет в виде "одной строчки". Какую инфу и удобство несет эта одна строчка в данной ситуации - понять не могу. Можно месяцами очень активно торговать в режиме only BUY, при этом вместо полного закрытия позиции, оставлять мин. лот (0.01), который никакого риска не несет (копейки). И в итоге будет ОДНА строчка! Вместо того, чтобы показать, что здесь было куплено на 0.99, а здесь эти 0.99 были закрыты.

Одна строчка - одна позиция за месяцы активной торговли. Т.е. для неттинга инфа по позициям - почти ни о чем.

Для хеджа все гораздо проще с позициями и инфа легко приобретает нужный вид. 

 
Alexey Kozitsyn:
Попробуйте смотреть историю сделок. По ним можно определить и профит и ID позиции, в которую они входили и тип позиции.

Хорошо, значит после выбора позиции на истории мне надо определить количество сделок в этой позиции с помощью int HistoryDealsTotal();

а далее я смогу так определить например профит позиции?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals;i++)
      {
        deal_ticket=HistoryDealGetTicket(i);
        if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
          profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
        }
      }
    }
  }
 
Gennady Mazur:

Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.

А вот после ее закрытия ???


Пока она открыта можно определить ее   Position_ID=PositionGetInteger(POSITION_IDENTIFIER);

После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...

что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?

Или можно использовать функции для обычной позиции? 

 Вот скрипт, который смотрит историю и выводи такую информацию - тип операции, тип сделки, объём, символ, POSITION_ID:

2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        4: deal #35911332 at 2017.02.03 08:33:31balance
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        5: deal #35911335 at 2017.02.03 08:33:39Выход из рынка, buy 0.01 EURUSD.m (order #46823937, position ID 46771241)
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        6: deal #35911336 at 2017.02.03 08:33:39Выход из рынка, sell 0.01 EURUSD.m (order #46823938, position ID 46751794)

 если немного переделать, то будет выводить информацию только по нужному POSITION_ID

Файлы:
 
Vladimir Karputov:

 Вот скрипт, который смотрит историю и выводи такую информацию - тип операции, тип сделки, объём, символ, POSITION_ID:

2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        4: deal #35911332 at 2017.02.03 08:33:31balance
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        5: deal #35911335 at 2017.02.03 08:33:39Выход из рынка, buy 0.01 EURUSD.m (order #46823937, position ID 46771241)
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1)        6: deal #35911336 at 2017.02.03 08:33:39Выход из рынка, sell 0.01 EURUSD.m (order #46823938, position ID 46751794)

 если немного переделать, то будет выводить информацию только по нужному POSITION_ID

А то что написал я имеет право на жизнь?....Конечно это не догма, теперь понял что достаточно взять последнюю сделку или сделки в определенном диапазоне времени и с них вытянуть всю инфо.
До этого у меня просто не было необходимости обращаться к истории сделок, а тут стратегия требует небольшой анализ истории, вот и возник вопрос.
 
Gennady Mazur:

Хорошо, значит после выбора позиции на истории мне надо определить количество сделок в этой позиции с помощью int HistoryDealsTotal();

а далее я смогу так определить например профит позиции?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals;i++)
      {
        deal_ticket=HistoryDealGetTicket(i);
        if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
          profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
        }
      }
    }
  }
Нет, т.к. Вы смотрите все сделки на "выход". При переносе через день/клиринг (ФОРТС) будет некорректный результат. И только последнюю сделку Вы тоже не можете смотреть, т.к. позиция не всегда закрывается одной сделкой.
 
Alexey Kozitsyn:
Нет, т.к. Вы смотрите все сделки на "выход". При переносе через день/клиринг (ФОРТС) будет некорректный результат. И только последнюю сделку Вы тоже не можете смотреть, т.к. позиция не всегда закрывается одной сделкой.
Вообще то, я тут смотрю только сделки на выход, которые принадлежат конкретной позиции...Работа только внутри дня, переносов нет...
Это пример получения профита по закрытой позиции, получу я его так по всей позиции от ее начала до полного закрытия?
 
Gennady Mazur:
Вообще то, я тут смотрю только сделки на выход, которые принадлежат конкретной позиции...Работа только внутри дня, переносов нет...
Это пример получения профита по закрытой позиции, получу я его так по всей позиции от ее начала до полного закрытия?

Вы на ФОРТС собираетесь этот код использовать? Если да, то читайте внимательнее, что я написал. Если Ваша конкретная позиция существует на момент клиринга, то Вы зачтете клиринговую (-ые) сделки OUT.

Приведенным Вами кодом Вы часто будете получать некорректные значения. 

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