HistoryPosition - неопубликованный функционал MQL5-языка.

22 ноября 2023, 00:14
fxsaber
7
383

HistoryPositionsTotal

Возвращает количество всех закрытых позиций в истории. HistorySelect() не влияет на результат данной функции.

int HistoryPositionsTotal();


Возвращаемое значение

Значение типа int.

Примечание

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

HistoryPositionGetTicket

Выбирает закрытую позицию для дальнейшей обработки и возвращает тикет закрытой позиции в истории. HistorySelect() не влияет на результат данной функции.

ulong  HistoryPositionGetTicket(
   const int Index      // номер закрытой позиции
   );

Параметры

Index

[in]  Номер сделки в списке сделок.

Возвращаемое значение

Значение типа ulong. В случае неудачного выполнения возвращает 0.

Примечание

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

HistoryPositionSelect

Выбирает закрытую позицию для дальнейшей работы с ней по указанному тикету. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. HistorySelect() не влияет на результат данной функции.

bool  HistoryPositionSelect(
   const ulong Ticket     // тикет позиции
   );


Параметры

Ticket

[in]  Тикет позиции.

Возвращаемое значение

Значение типа bool.

Примечание

Функция HistoryPositionSelect() копирует данные о закрытой позиции в программное окружение, и последующие вызовы  HistoryPositionGetDouble(),  HistoryPositionGetInteger() и  HistoryPositionGetString() возвращают ранее скопированные данные.

HistoryPositionGetInteger

Возвращает запрошенное свойство закрытой позиции. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

long HistoryPositionGetInteger(
   const ENUM_POSITION_HISTORY_PROPERTY_INTEGER Property        // идентификатор свойства
   );


2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool HistoryPositionGetInteger(
   const ENUM_POSITION_HISTORY_PROPERTY_INTEGER Property,       // идентификатор свойства
   long&                                        long_var        // сюда примем значение свойства
   );


Параметры

Property

[in]  Идентификатор свойства сделки. Значение может быть одним из значений перечисления ENUM_POSITION_HISTORY_PROPERTY_INTEGER.

long_var

[out]  Переменная типа long, принимающая  значение запрашиваемого свойства.

Возвращаемое значение

Значение типа long.

Примечание

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

HistoryPositionGetDouble

Возвращает запрошенное свойство закрытой позиции. Свойство закрытой позиции должно быть типа double. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double HistoryPositionGetDouble(
   const ENUM_POSITION_HISTORY_PROPERTY_DOUBLE Property        // идентификатор свойства
   );

2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool HistoryPositionGetDouble(
   const ENUM_POSITION_HISTORY_PROPERTY_DOUBLE Property,       // идентификатор свойства
   double&                                     double_var      // сюда примем значение свойства
   );

Параметры

Property

[in]  Идентификатор свойства сделки. Значение может быть одним из значений перечисления ENUM_POSITION_HISTORY_PROPERTY_DOUBLE.

double_var

[out]  Переменная типа double, принимающая  значение запрашиваемого свойства.

Возвращаемое значение

Значение типа double.

Примечание

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

HistoryPositionGetString

Возвращает запрошенное свойство закрытой позиции. Свойство закрытой позиции должно быть типа string. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

string HistoryPositionGetString(
   const ENUM_POSITION_HISTORY_PROPERTY_STRING Property        // идентификатор свойства
   );

2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool HistoryPositionGetString(
   const ENUM_POSITION_HISTORY_PROPERTY_STRING Property,       // идентификатор свойства
   string&                                     string_var      // сюда примем значение свойства
   );


Параметры

Property

[in]  Идентификатор свойства сделки. Значение может быть одним из значений перечисления ENUM_POSITION_HISTORY_PROPERTY_STRING.

string_var

[out]  Переменная типа string, принимающая  значение запрашиваемого свойства.

Возвращаемое значение

Значение типа string.

Примечание

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


Свойства закрытых позиций

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

Для функции HistoryPositionGetInteger()

ENUM_POSITION_HISTORY_PROPERTY_INTEGER

Идентификатор

Описание

Тип

POSITION_HISTORY_TICKET

Тикет закрытой позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_HISTORY_IDENTIFIER.
 

Значение POSITION_HISTORY_TICKET
соответствует MqlTradeRequest::position.

long
POSITION_HISTORY_TYPE Тип позиции ENUM_DEAL_TYPE
POSITION_HISTORY_TIME_OPEN Время открытия позиции datetime
POSITION_HISTORY_TIME_CLOSE Время закрытия позиции datetime
POSITION_HISTORY_TIME_OPEN_MSC Время открытия позиции в миллисекундах с 01.01.1970 long
POSITION_HISTORY_TIME_CLOSE_MSC Время закрытия позиции в миллисекундах с 01.01.1970 long
POSITION_HISTORY_MAGIC Magic number для закрытой позиции (смотри ORDER_MAGIC) long
POSITION_HISTORY_TICKET_DEAL_IN Тикет первой сделки, участвующей в открытии позиции long
POSITION_HISTORY_TICKET_DEAL_OUT Тикет закрывающей позицию сделки long
POSITION_HISTORY_IDENTIFIER

Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.

 

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

long
POSITION_HISTORY_REASON_OPEN Причина открытия позиции ENUM_POSITION_REASON
POSITION_HISTORY_REASON_CLOSE Причина закрытия позиции ENUM_POSITION_REASON
POSITION_HISTORY_DEALS_AMOUNT Количество сделок, участвующих в формировании позиции до закрытия. int



Для функции HistoryPositionGetDouble()

ENUM_POSITION_HISTORY_PROPERTY_DOUBLE

Идентификатор

Описание

Тип

POSITION_HISTORY_VOLUME

Объем позиции

double

POSITION_HISTORY_PRICE_OPEN

Цена открытия позиции

double

POSITION_HISTORY_PRICE_CLOSE

Цена закрытия позиции

double

POSITION_HISTORY_PRICE_OPEN_REQUEST

Запрашивая в торговом приказе цена открытия позиции

double

POSITION_HISTORY_PRICE_CLOSE_REQUEST

Запрашивая в торговом приказе цена закрытия позиции

double

POSITION_HISTORY_SL

Уровень Stop Loss для закрытой позиции

double

POSITION_HISTORY_TP

Уровень Take Profit для закрытой позиции
double
POSITION_HISTORY_PROFIT Прибыль закрытой позиции.

double

POSITION_HISTORY_COMMISSION Комиссия закрытой позиции. double
POSITION_HISTORY_SWAP Накопленный своп при закрытии double
POSITION_HISTORY_VOLUME_OPEN Полный объем позиции перед закрытием. double



Для функции HistoryPositionGetString()

ENUM_POSITION_HISTORY_PROPERTY_STRING

Идентификатор

Описание

Тип

POSITION_HISTORY_SYMBOL

Символ, по которому закрыта позиция

string

POSITION_HISTORY_COMMENT

Комментарий к закрытой позиции

string


Пример.

// Пример работы с закрытыми позициями.

#include <HistoryPosition.mqh> // https://www.mql5.com/ru/blogs/post/755007

// Создаем структуру некоторых свойств закрытой позиции.
struct POSITION_HISTORY
{
  datetime TimeOpen;
  string Symbol;
  ENUM_DEAL_TYPE Type;
  ulong Ticket;
  double Volume;
  double PriceOpen;
  double StopLoss;
  double TakeProfit;
  datetime TimeClose;
  double PriceClose;
  double Commission;
  double Swap;
  double Profit;
  ulong Magic;
  string Comment;

  // Заполнение структуры соответствующими данными закрытой позиции.
  void Set() // https://www.mql5.com/ru/blogs/post/755007
  {
    this.TimeOpen = (datetime)HistoryPositionGetInteger(POSITION_HISTORY_TIME_OPEN);
    this.Symbol = HistoryPositionGetString(POSITION_HISTORY_SYMBOL);
    this.Type = (ENUM_DEAL_TYPE)HistoryPositionGetInteger(POSITION_HISTORY_TYPE);
    this.Ticket = HistoryPositionGetInteger(POSITION_HISTORY_TICKET);
    this.Volume = HistoryPositionGetDouble(POSITION_HISTORY_VOLUME);
    this.PriceOpen = HistoryPositionGetDouble(POSITION_HISTORY_PRICE_OPEN);
    this.StopLoss = HistoryPositionGetDouble(POSITION_HISTORY_SL);
    this.TakeProfit = HistoryPositionGetDouble(POSITION_HISTORY_TP);
    this.TimeClose = (datetime)HistoryPositionGetInteger(POSITION_HISTORY_TIME_CLOSE);
    this.PriceClose = HistoryPositionGetDouble(POSITION_HISTORY_PRICE_CLOSE);
    this.Commission = HistoryPositionGetDouble(POSITION_HISTORY_COMMISSION);
    this.Swap = HistoryPositionGetDouble(POSITION_HISTORY_SWAP);
    this.Profit = HistoryPositionGetDouble(POSITION_HISTORY_PROFIT);
    this.Magic = HistoryPositionGetInteger(POSITION_HISTORY_MAGIC);
    this.Comment = HistoryPositionGetString(POSITION_HISTORY_COMMENT);
  }
};

void OnStart()
{
  POSITION_HISTORY Positions[]; // Сюда будем собирать данные обо всех закрытых позициях.

  // https://www.mql5.com/ru/blogs/post/755007
  for (uint i = ArrayResize(Positions, HistoryPositionsTotal()); (bool)i--;) // Бежим по всем закрытым позициям.
    if (HistoryPositionGetTicket(i)) // Если выбрали закрытую позицию по индексу,
      Positions[i].Set();            // записываем ee данные.

  ArrayPrint(Positions); // Распечатали информацию обо всех закрытых позициях.
}

Результат.

             [TimeOpen] [Symbol] [Type]   [Ticket] [Volume] [PriceOpen] [StopLoss] [TakeProfit]         [TimeClose] [PriceClose] [Commission]  [Swap]     [Profit] [Magic] [Comment]
[0] 2023.11.21 21:03:59 ""            6 2095063134  0.00000     0.00000    0.00000      0.00000 2023.11.21 21:03:59      0.00000      0.00000 0.00000 100000.00000       0 ""       
[1] 2023.11.21 21:04:27 "CADCHF"      0 2119992140  1.00000     0.64568    0.00000      0.00000 2023.11.21 21:05:00      0.64540      0.00000 0.00000    -29.03000       0 ""       
[2] 2023.11.21 21:04:42 "AUDUSD"      1 2119992806  1.00000     0.65533    0.00000      0.00000 2023.11.21 21:05:00      0.65542      0.00000 0.00000     -8.25000       0 ""       
[3] 2023.11.21 21:57:32 "AUDUSD"      0 2120110833  1.00000     0.65575    0.00000      0.00000 2023.11.22 01:07:35      0.65565      0.00000 5.77000     -9.16000       0 ""       
    
    
    
    
    


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

Ссылка на блог автора.
Файлы: