Как получить финансовые результаты по закрытым позициям?

 

В торговом терминале МТ5 на вкладке История можно выбрать отображение разных данных (позиции, сделки, ордера, ордера и сделки). Меня интересуют данные по закрытым позициям. Вот как это отображается в терминале:


Пожалуйста, подскажите, как средствами MQL5 получить список закрытых позиций? Справку читал, но почему-то не смог там найти функции для получения списка закрытых позиций или хотя бы их количества (наподобие HistoryDealsTotal для сделок).

Конечной целью является получение финансового результата (прибыль или убыток) последней закрытой позиции, а также количество последних позиций, подряд закрытых с убытком. 

В этой связи возникает дополнительный вопрос: после того, как я узнаю, как получить список закрытых позиций, есть ли гарантия, что последние закрытые позиции в этом списке находятся в самом конце (или в начале)? Иными словами, имеет ли этот список какую-то сортировку по умолчанию или нужно перебирать его весь в поисках последней закрытой позиции? 

 
Janis Ozols:

В торговом терминале МТ5 на вкладке История можно выбрать отображение разных данных (позиции, сделки, ордера, ордера и сделки). Меня интересуют данные по закрытым позициям. Вот как это отображается в терминале:


Пожалуйста, подскажите, как средствами MQL5 получить список закрытых позиций? Справку читал, но почему-то не смог там найти функции для получения списка закрытых позиций или хотя бы их количества (наподобие HistoryDealsTotal для сделок).

Конечной целью является получение финансового результата (прибыль или убыток) последней закрытой позиции, а также количество последних позиций, подряд закрытых с убытком. 

В этой связи возникает дополнительный вопрос: после того, как я узнаю, как получить список закрытых позиций, есть ли гарантия, что последние закрытые позиции в этом списке находятся в самом конце (или в начале)? Иными словами, имеет ли этот список какую-то сортировку по умолчанию или нужно перебирать его весь в поисках последней закрытой позиции? 

Позиция складывается из:

  • Сделка на открытие позиции… (Цена сделки соответствует цене открытия позиции)
  • Сделка на изменение позиции. Может быть несколько таких сделок
  • Сделка на закрытие позиции… (Цена сделки соответствует цене закрытия позиции)

Существуют ещё сделки переворота позиции, но они вас пока не интересуют.

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

Комиссия позиции — сумма комиссий по всем сделкам участвующим в открытии, изменении и закрытии позиции.

Прибыль позиции — сумма прибыли сделок участвующих в изменении и закрытии позиции.

 
Alexey Viktorov #:

Позиция складывается из:

  • Сделка на открытие позиции… (Цена сделки соответствует цене открытия позиции)
  • Сделка на изменение позиции. Может быть несколько таких сделок
  • Сделка на закрытие позиции… (Цена сделки соответствует цене закрытия позиции)

Существуют ещё сделки переворота позиции, но они вас пока не интересуют.

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

Комиссия позиции — сумма комиссий по всем сделкам участвующим в открытии, изменении и закрытии позиции.

Прибыль позиции — сумма прибыли сделок участвующих в изменении и закрытии позиции.

Иными словами, перебор всего списка сделок из истории — это единственный способ получить данные о финансовом результате закрытых позиций?
И именно так и задумывали разработчики?

Получается, что это не я не нашёл в документации функций для работы с закрытыми позициями? Их просто не существует?

 
Janis Ozols #:

Иными словами, перебор всего списка сделок из истории — это единственный способ получить данные о финансовом результате закрытых позиций?
И именно так и задумывали разработчики?

Получается, что это не я не нашёл в документации функций для работы с закрытыми позициями? Их просто не существует?

Лучше найдите определения, что такое ордер, что такое сделка и что такое позиция.

Сделка бывает исключительно в истории. А позиция только в «реальности», если можно так сказать.

Купил — сделка. Пока держишь — позиция. Продал — сделка. Больше нет позиции, остались только сделки.

 
Alexey Viktorov #:


Сделка бывает исключительно в истории. А позиция только в «реальности», если можно так сказать.

Купил — сделка. Пока держишь — позиция. Продал — сделка. Больше нет позиции, остались только сделки.

Спасибо! Теперь понятно.
 
Janis Ozols #:

Иными словами, перебор всего списка сделок из истории — это единственный способ получить данные о финансовом результате закрытых позиций?
И именно так и задумывали разработчики?

Получается, что это не я не нашёл в документации функций для работы с закрытыми позициями? Их просто не существует?

Не нужно перебирать всë. Есть идентификатор позиции. Он есть в сделке. И есть выбор всех сделок по идентификатору позиции. 
Но по сделкам пройтись придëтся, если нет под рукой тикета нужной сделки. 
 
Artyom Trishkin #:
Не нужно перебирать всë. Есть идентификатор позиции. Он есть в сделке. И есть выбор всех сделок по идентификатору позиции.
Это хорошо. А как узнать идентификатор последней закрытой позиции? Чтобы не перебирать все сделки, а ограничиться только теми, что относятся к ней?
 
Janis Ozols #:
Это хорошо. А как узнать идентификатор последней закрытой позиции? Чтобы не перебирать все сделки, а ограничиться только теми, что относятся к ней?
Из последней закрывающей сделки) 
 
Artyom Trishkin #:
Из последней закрывающей сделки

Отличная рекомендация, спасибо!

Я правильно понимаю, что для того, чтобы работать со сделками из истории счёта, нужно сначала запросить их список при помощи функции HistorySelect, потом получить их количество функцией HistoryDealsTotal, а затем организовать перебор списка в цикле, как в примере к описанию функции HistoryDealGetTicket ?

Если так, то можно ли полагаться на то, что при запросе HistorySelect(0,TimeCurrent()) сделки в списке будут отсортированы от самой ранней до самой поздней?

Иначе говоря, если начать перебор полученного таким запросом списка сделок с конца [ HistoryDealGetTicket HistoryDealsTotal() - 1 ) ], можно ли быть уверенным в том, что самая первая (с конца списка) найденная сделка с DEAL_ENTRY равным DEAL_ENTRY_OUT будет относиться к самой последней закрытой позиции? 

Я пробовал запускать этот пример и получил список сделок от самой первой до самой последней. Но всегда ли это будет так? 
 
Janis Ozols #:

Отличная рекомендация, спасибо!

Я правильно понимаю, что для того, чтобы работать со сделками из истории счёта, нужно сначала запросить их список при помощи функции HistorySelect, потом получить их количество функцией HistoryDealsTotal, а затем организовать перебор списка в цикле, как в примере к описанию функции HistoryDealGetTicket ?

Если так, то можно ли полагаться на то, что при запросе HistorySelect(0,TimeCurrent()) сделки в списке будут отсортированы от самой ранней до самой поздней?

Иначе говоря, если начать перебор полученного таким запросом списка сделок с конца [ HistoryDealGetTicket HistoryDealsTotal() - 1 ) ], можно ли быть уверенным в том, что самая первая (с конца списка) найденная сделка с DEAL_ENTRY равным DEAL_ENTRY_OUT будет относиться к самой последней закрытой позиции? 

Я пробовал запускать этот пример и получил список сделок от самой первой до самой последней. Но всегда ли это будет так? 

Совсем всё неправильно.

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

Как получить финансовые результаты по закрытым позициям?

Artyom Trishkin, 2025.11.13 12:12

Не нужно перебирать всë. Есть идентификатор позиции. Он есть в сделке. И есть выбор всех сделок по идентификатору позиции
Но по сделкам пройтись придëтся, если нет под рукой тикета нужной сделки. 

 
Еще можно так.
HistoryPosition - неопубликованный функционал MQL5-языка.
HistoryPosition - неопубликованный функционал MQL5-языка.
  • 2023.11.22
  • www.mql5.com
HistoryPositionsTotal Возвращает количество всех закрытых позиций в истории. HistorySelect() не влияет на результат данной функции. int HistoryPositionsTotal(); Возвращаемое значение Значение типа