English Deutsch 日本語
preview
Торговый инструментарий MQL5 (Часть 5): Расширение EX5-библиотеки для управления историей с помощью функций позиции

Торговый инструментарий MQL5 (Часть 5): Расширение EX5-библиотеки для управления историей с помощью функций позиции

MetaTrader 5Примеры |
34 0
Wanateki Solutions LTD
Kelvin Muturi Muigua

Введение

В предыдущей статье мы начали разработку основных функций библиотеки HistoryManager EX5, отвечающих за извлечение, сортировку и категоризацию исторических данных по различным типам, включая ордера, сделки, отложенные ордера и позиции. Большинство этих функций были разработаны для работы в фоновом режиме, незаметно для пользователей библиотеки, и к ним не было прямого доступа. Единственными экспортируемыми функциями были функции печати, которые позволяли пользователям выводить простые описательные списки ордеров, сделок, отложенных ордеров и позиций в журнал MetaTrader 5.

В этой статье мы расширим исходный код HistoryManager.mq5 путем введения дополнительных доступных пользователю функций, которые основываются на базовых функциях, созданных нами в предыдущей статье. Эти новые функции позволят пользователям библиотеки с легкостью запрашивать данные по истории торговли. Пользователи смогут получить ключевые данные, такие как продолжительность сделки в секундах, тикеты открытия и закрытия последней закрытой позиции, была ли позиция инициирована отложенным ордером или прямым входом на рынок, метрики на основе пунктов, такие как прибыль, стоп-лосс и тейк-профит, а также чистую прибыль после учета расходов, таких как комиссии и свопы. Все это позволит импортировать EX5-библиотеку в проекты MQL5 и запрашивать историю различных позиций с минимальными усилиями посредством простых вызовов функций.

Для начала откроем файл HistoryManager.mq5 из предыдущей статьи и начнем с создания функции GetTotalDataInfoSize(). Начальный исходный код HistoryManager.mq5 прикреплен как в конце предыдущей, так и этой статьи (HistoryManager_Part1.mq5). Мы продолжим добавлять новый код под функцией PrintPendingOrdersHistory(), на которой мы остановились ранее.


Функция общего размера исторических данных

Функция GetTotalDataInfoSize() извлекает и возвращает размер указанного массива исторических данных. Функция работает в паре с FetchHistoryByCriteria(), позволяя динамически определять объем данных, доступных в конкретной структуре данных. Его основная роль — определить, какой набор данных нас интересует (сделки, ордера, позиции или отложенные ордера), и вернуть общее количество элементов в этом наборе данных.

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

Начнем с определения сигнатуры функции. Поскольку эта функция возвращает целое число, представляющее размер указанного массива данных, он использует возвращаемый тип int. Входной параметр или аргумент — беззнаковое целое число (uint), которое позволяет нам передавать предопределенные константы для указания типа запрашиваемых нами данных.

int GetTotalDataInfoSize(uint dataToGet)
  {
//-- Our function's code will go here
  }

Далее мы объявим локальную переменную, totalDataInfo, которая будет хранить размер запрошенного набора данных.

int totalDataInfo = 0;

Мы будем использовать оператор switch для проверки значения параметра dataToGet. В зависимости от его значения мы определим соответствующий набор данных и используем функцию ArraySize() для определения его размера.

  • Данные истории сделок: Если dataToGet равен GET_DEALS_HISTORY_DATA, мы рассчитаем размер массива dealInfo и сохраним его в totalDataInfo.
  • Данные истории ордеров: Если dataToGet равен GET_ORDERS_HISTORY_DATA, рассчитаем размер массива orderInfo и сохраним его в totalDataInfo.
  • Данные истории позиций: Для GET_POSITIONS_HISTORY_DATA рассчитаем размер массива positionInfo и сохраним его в totalDataInfo.
  • Данные об отложенных ордерах: Когда dataToGet совпадает с GET_PENDING_ORDERS_HISTORY_DATA, мы определим размер массива pendingOrderInfo и сохраним его в totalDataInfo.
  • Случай по умолчанию: Если ни одна из предопределенных констант не подходит, установим totalDataInfo на 0 как запасной вариант.

Наконец, вернем значение, сохраненное в totalDataInfo, после выхода из switch. Это гарантирует, что функция выведет правильный размер для указанного типа данных или 0, если не указан допустимый тип данных.

switch(dataToGet)
  {
   case GET_DEALS_HISTORY_DATA:
      totalDataInfo = ArraySize(dealInfo);
      break;

   case GET_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(orderInfo);
      break;

   case GET_POSITIONS_HISTORY_DATA:
      totalDataInfo = ArraySize(positionInfo);
      break;

   case GET_PENDING_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(pendingOrderInfo);
      break;

   default:
      totalDataInfo = 0;
      break;
  }
return(totalDataInfo);

Ниже представлена полная реализация функции GetTotalDataInfoSize() со всеми сегментами кода в правильной последовательности.

int GetTotalDataInfoSize(uint dataToGet)
  {
   int totalDataInfo = 0; //- Saves the total elements of the specified history found
   switch(dataToGet)
     {
      case GET_DEALS_HISTORY_DATA: //- Check if we have any available deals history data
         totalDataInfo = ArraySize(dealInfo); //- Save the total deals found
         break;

      case GET_ORDERS_HISTORY_DATA: //- Check if we have any available orders history data
         totalDataInfo = ArraySize(orderInfo); //- Save the total orders found
         break;

      case GET_POSITIONS_HISTORY_DATA: //- Check if we have any available positions history data
         totalDataInfo = ArraySize(positionInfo); //- Save the total positions found
         break;

      case GET_PENDING_ORDERS_HISTORY_DATA: //- Check if we have any available pending orders history data
         totalDataInfo = ArraySize(pendingOrderInfo); //- Save the total pending orders found
         break;

      default: //-- Unknown entry
         totalDataInfo = 0;
         break;
     }
   return(totalDataInfo);
  }


Функция извлечения истории по критериям

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

Функция FetchHistoryByCriteria() систематически извлекает исторические данные на основе определенных критериев, начиная с последних 24 часов и расширяя период извлечения при необходимости. Сначала она проверяет самые последние данные, и если не удается найти соответствующую историю, постепенно сканирует более старые данные — сначала по неделям, а затем по годам. Если после сканирования всего года данные не будут найдены, будет предпринята попытка извлечь всю доступную историю учетной записи.

Функция FetchHistoryByCriteria() будет служить ключевой утилитой для извлечения торговых данных за разные периоды и позволит EX5-библиотеке сканировать и извлекать историю до тех пор, пока не будут найдены необходимые данные. Если соответствующие данные не будут найдены, библиотека все равно сможет попытаться восстановить более старую или полную историю учетной записи.

Начнем с определения сигнатуры функции. Поскольку эта функция будет использоваться внутренними модулями ядра библиотеки, ее нельзя будет экспортировать.

bool FetchHistoryByCriteria(uint dataToGet)
  {
//-- Our function's code will go here
  }

Мы определим переменную интервала, которая модулирует период извлечения истории. Первоначально будет установлено значение 1, чтобы начать с 24-часового диапазона времени.

int interval = 1;

Рассчитаем временной диапазон, начиная с 24 часов назад до текущего времени.

datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
datetime toDateTime = TimeCurrent();

Далее используем функцию GetHistoryData() для извлечения данных в определенном диапазоне времени.

GetHistoryData(fromDateTime, toDateTime, dataToGet);

Если данные не найдены в последние 24 часа, мы войдем в цикл, где увеличим интервал на одну неделю за один раз. Мы продолжим этот процесс, пока не просканируем весь год (53 недели). Во время каждой итерации временной диапазон обновляется с учетом дополнительной недели.

while(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   interval++;
   fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
   toDateTime = TimeCurrent();
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

   if(interval > 53)
     {
      break;
     }
  }

Если данные по-прежнему не найдены после сканирования года, мы сбросим временной диапазон, чтобы охватить всю историю счета (от эпохи до текущего времени). Это гарантирует проверку всей доступной истории.

fromDateTime = 0;
toDateTime = TimeCurrent();
GetHistoryData(fromDateTime, toDateTime, dataToGet);

Наконец, мы проверим, была ли успешно восстановлена какая-либо история. Если после сканирования всей истории аккаунта данные не будут найдены, регистрируем неудачу и возвращаем false. Если данные найдены, возвращаем true.

if(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   return(false);
  }
else
  {
   return(true);
  }

Вот полная реализация функции FetchHistoryByCriteria() со всеми сегментами кода.

bool FetchHistoryByCriteria(uint dataToGet)
  {
   int interval = 1; //- Modulates the history period

//- Save the history period for the last 24 hours
   datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
   datetime toDateTime = TimeCurrent();

//- Get the specified history
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we have no history in the last 24 hours we need to keep increasing the retrieval
//- period by one week untill we scan a full year (53 weeks)
   while(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      interval++;
      fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
      toDateTime = TimeCurrent();
      GetHistoryData(fromDateTime, toDateTime, dataToGet);

      //- If no history is found after a one year scanning period, we exit the while loop
      if(interval > 53)
        {
         break;
        }
     }

//- If we have not found any trade history in the last year, we scan and cache the intire account history
   fromDateTime = 0; //-- 1970 (Epoch)
   toDateTime = TimeCurrent(); //-- Time now
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we still havent retrieved any history in the account, we log this info by
//- printing it and exit the function by returning false
   if(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      return(false); //- Specified history not found, exit and return false
     }
   else
     {
      return(true); //- Specified history found, exit and return true
     }
  }


Функция получения данных о последней закрытой позиции

Функция GetLastClosedPositionData() отвечает за получение свойств последней закрытой позиции и сохранение этих данных в предоставленной ссылке lastClosedPositionInfo. Эта функция будет опираться на функцию FetchHistoryByCriteria() для извлечения соответствующих данных истории торговли, обеспечивающая доступ к необходимой информации о позициях. Если закрытых позиций не обнаружено, функция выведет сообщение об ошибке и вернет false. В случае успеха она извлечет данные и вернет true.

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

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
//-- Our function's code will go here
  }

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

if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
  {
   Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
   return(false);
  }

Если данные истории позиций недоступны (то есть функция FetchHistoryByCriteria() возвращает false), мы регистрируем сообщение об ошибке, используя функцию Print(), которая помогает в отладке, предоставляя полезную информацию о сбое. Затем функция возвращает false, что указывает на то, что не удалось восстановить последнюю закрытую позицию.

Если данные истории позиций успешно извлечены, сохраним информацию о последней закрытой позиции в переменной lastClosedPositionInfo. Это делается путем назначения первого элемента в массиве positionInfo в lastClosedPositionInfo, так как этот массив содержит историю всех позиций, причем самая последняя закрытая позиция находится в начале массива. Чтобы завершить функцию, вернем true для указания того, что данные о последней закрытой позиции были успешно извлечены и сохранены в предоставленной ссылочной переменной.

lastClosedPositionInfo = positionInfo[0];
return(true);

Вот полная реализация функции GetLastClosedPositionData() со всеми сегментами кода.

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
   if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
     {
      Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
      return(false);
     }

//-- Save the last closed position data in the referenced lastClosedPositionInfo variable
   lastClosedPositionInfo = positionInfo[0];
   return(true);
  }


Функция типа последней закрытой позиции

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

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

Начнем с определения сигнатуры функции. Поскольку эта функция предназначена для использования файлами MQL5, которые импортируют EX5-библиотеку, мы пометим ее как экспортируемую. Это обеспечит внешний доступ к функции, повысив как модульность, так и удобство использования.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
//-- Our function's code will go here
  }

Начнем с объявления локальной переменной lastClosedPositionInfo типа PositionData. Эта переменная будет временно хранить информацию о последней закрытой позиции, которую мы извлечем с помощью функции GetLastClosedPositionData().

PositionData lastClosedPositionInfo;

Вызовем функцию GetLastClosedPositionData(), передав lastClosedPositionInfo в качестве аргумента. Если функция возвращает true, это означает, что данные по последней закрытой позиции были успешно получены.

if(GetLastClosedPositionData(lastClosedPositionInfo))
{
   //- Process the retrieved data
}

Если GetLastClosedPositionData() возвращает false, функция немедленно завершается, возвращая false, чтобы указать, что операция не может быть завершена.

Внутри блока if мы извлекаем свойство типа из lastClosedPositionInfo и присваиваем его ссылочной переменной lastClosedPositionType. Это гарантирует, что вызывающий код имеет доступ к типу последней закрытой позиции. После успешного сохранения типа возвращаем true, чтобы указать, что операция прошла успешно, и выйти из функции.

lastClosedPositionType = lastClosedPositionInfo.type;
return(true);

Если извлечение последней закрытой позиции не удается, функция пропускает блок if и возвращает напрямую false. Это означает, что тип позиции определить не удалось.

return(false);

Вот полная реализация функции LastClosedPositionType() со всеми сегментами кода в правильном порядке.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionType = lastClosedPositionInfo.type;
      return(true);
     }
   return(false);
  }


Функция объема последней закрытой позиции

Функция LastClosedPositionVolume() отвечает за извлечение объема последней закрытой позиции в торговой истории. Она сохраняет объем в ссылочную переменную lastClosedPositionVolume. Если функция LastClosedPositionVolume() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionVolume значением объема и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionVolume не изменяется, а функция возвращает false.

bool LastClosedPositionVolume(double &lastClosedPositionVolume) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionVolume = lastClosedPositionInfo.volume;
      return(true);
     }
   return(false);
  }


Функция символа последней закрытой позиции

Функция LastClosedPositionSymbol() отвечает за извлечение символа последней закрытой позиции в торговой истории. Она сохраняет этот символ в ссылочную переменную lastClosedPositionSymbol. Если функция LastClosedPositionSymbol() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionSymbol значением символа и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionSymbol не изменяется, а функция возвращает false.

bool LastClosedPositionSymbol(string &lastClosedPositionSymbol) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSymbol = lastClosedPositionInfo.symbol;
      return(true);
     }
   return(false);
  }


Функция тикета последней закрытой позиции

Функция LastClosedPositionTicket() отвечает за извлечение тикета последней закрытой позиции в торговой истории. Она сохраняет тикет в ссылочную переменную lastClosedPositionTicket. Если функция LastClosedPositionTicket() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionTicket с номером тикета и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionTicket не изменяется, а функция возвращает false.

bool LastClosedPositionTicket(ulong &lastClosedPositionTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTicket = lastClosedPositionInfo.ticket;
      return(true);
     }
   return(false);
  }


Функция прибыли последней закрытой позиции

Функция LastClosedPositionProfit() отвечает за извлечение прибыли последней закрытой позиции в торговой истории. Она сохраняет прибыль в ссылочную переменную lastClosedPositionProfit. Если функция LastClosedPositionProfit() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionProfit со значением прибыли и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionProfit не изменяется, а функция возвращает false.

bool LastClosedPositionProfit(double &lastClosedPositionProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionProfit = lastClosedPositionInfo.profit;
      return(true);
     }
   return(false);
  }


Функция чистой прибыли последней закрытой позиции

Функция LastClosedPositionNetProfit() отвечает за извлечение чистой прибыли последней закрытой позиции в торговой истории. Чистая прибыль позиции - окончательное значение прибыли после всех расходов, таких как комиссия и свопы. Функция сохраняет чистую прибыль в ссылочную переменную lastClosedPositionNetProfit. Если функция LastClosedPositionNetProfit() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionNetProfit со значением чистой прибыли и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionNetProfit не изменяется, а функция возвращает false.

bool LastClosedPositionNetProfit(double &lastClosedPositionNetProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionNetProfit = lastClosedPositionInfo.netProfit;
      return(true);
     }
   return(false);
  }


Функция прибыли последней закрытой позиции в пипсах (пунктах)

Функция LastClosedPositionPipProfit() отвечает за извлечение прибыли в пипсах последней закрытой позиции в торговой истории. Она сохраняет прибыль в пипсах в ссылочную переменную lastClosedPositionPipProfit. Если функция LastClosedPositionPipProfit() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionPipProfit с прибылью в пипсах и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionPipProfit не изменяется, а функция возвращает false.

bool LastClosedPositionPipProfit(int &lastClosedPositionPipProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionPipProfit = lastClosedPositionInfo.pipProfit;
      return(true);
     }
   return(false);
  }


Функция цены закрытия последней закрытой позиции

Функция LastClosedPositionClosePrice() отвечает за извлечение цены закрытия последней закрытой позиции в торговой истории. Она сохраняет цену закрытия в ссылочную переменную lastClosedPositionClosePrice. Если функция LastClosedPositionClosePrice() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionClosePrice с ценой закрытия и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionClosePrice не изменяется, а функция возвращает false.

bool LastClosedPositionClosePrice(double &lastClosedPositionClosePrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosePrice = lastClosedPositionInfo.closePrice;
      return(true);
     }
   return(false);
  }


Функция цены открытия последней закрытой позиции

Функция LastClosedPositionOpenPrice() отвечает за извлечение цены открытия последней закрытой позиции в торговой истории. Она сохраняет цену открытия в ссылочную переменную lastClosedPositionOpenPrice. Если функция LastClosedPositionOpenPrice() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionOpenPrice с ценой открытия и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionOpenPrice не изменяется, а функция возвращает false.

bool LastClosedPositionOpenPrice(double &lastClosedPositionOpenPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenPrice = lastClosedPositionInfo.openPrice;
      return(true);
     }
   return(false);
  }


Функция цены стоп-лосса последней закрытой позиции

Функция LastClosedPositionSlPrice() отвечает за извлечение цены стоп-лосса последней закрытой позиции в торговой истории. Она сохраняет цену стоп-лосса в ссылочную переменную lastClosedPositionSlPrice. Если функция LastClosedPositionSlPrice() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionSlPrice с ценой стоп-лосса и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionSlPrice не изменяется, а функция возвращает false.

bool LastClosedPositionSlPrice(double &lastClosedPositionSlPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPrice = lastClosedPositionInfo.slPrice;
      return(true);
     }
   return(false);
  }


Функция цены тейк-профита последней закрытой позиции

Функция LastClosedPositionTpPrice() отвечает за извлечение цены тейк-профита последней закрытой позиции в торговой истории. Она сохраняет цену тейк-профита в ссылочную переменную lastClosedPositionTpPrice. Если функция LastClosedPositionTpPrice() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionTpPrice с ценой тейк-профита и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionTpPrice не изменяется, а функция возвращает false.

bool LastClosedPositionTpPrice(double &lastClosedPositionTpPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPrice = lastClosedPositionInfo.tpPrice;
      return(true);
     }
   return(false);
  }


Функция стоп-лосса последней закрытой позиции в пунктах (пипсах)

Функция LastClosedPositionSlPips() отвечает за извлечение значения стоп-лосса последней закрытой позиции в пунктах (пипсах). Она сохраняет значение стоп-лосса в ссылочную переменную lastClosedPositionSlPips. Если функция LastClosedPositionSlPips() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionSlPips со значением стоп-лосса в пипсах и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionSlPips не изменяется, а функция возвращает false.

bool LastClosedPositionSlPips(int &lastClosedPositionSlPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPips = lastClosedPositionInfo.slPips;
      return(true);
     }
   return(false);
  }


Функция тейк-профита последней закрытой позиции в пунктах (пипсах)

Функция LastClosedPositionTpPips() отвечает за извлечение значения тейк-профита последней закрытой позиции в торговой истории в пунктах (пипсах). Она сохраняет значение тейк-профита в ссылочную переменную lastClosedPositionTpPips. Если функция LastClosedPositionTpPips() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionTpPips со значением тейк-профита в пипсах и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionTpPips не изменяется, а функция возвращает false.

bool LastClosedPositionTpPips(int &lastClosedPositionTpPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPips = lastClosedPositionInfo.tpPips;
      return(true);
     }
   return(false);
  }


Функция времени открытия последней закрытой позиции

Функция LastClosedPositionOpenTime() отвечает за извлечение времени открытия последней закрытой позиции. Она сохраняет время открытия в ссылочную переменную lastClosedPositionOpenTime. Если функция LastClosedPositionOpenTime() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionOpenTime со значением времени открытия и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionOpenTime не изменяется, а функция возвращает false.

bool LastClosedPositionOpenTime(datetime &lastClosedPositionOpenTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenTime = lastClosedPositionInfo.openTime;
      return(true);
     }
   return(false);
  }


Функция времени закрытия последней закрытой позиции

Функция LastClosedPositionCloseTime() отвечает за извлечение времени закрытия последней закрытой позиции. Она сохраняет время закрытия в ссылочную переменную lastClosedPositionCloseTime. Если функция LastClosedPositionCloseTime() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionCloseTime с временем закрытия и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionCloseTime не изменяется, а функция возвращает false.

bool LastClosedPositionCloseTime(datetime &lastClosedPositionCloseTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCloseTime = lastClosedPositionInfo.closeTime;
      return(true);
     }
   return(false);
  }


Функция свопа последней закрытой позиции

Функция LastClosedPositionSwap() отвечает за извлечение значения свопа последней закрытой позиции. Она сохраняет значение свопа в ссылочную переменную lastClosedPositionSwap. Если функция LastClosedPositionSwap() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionSwap со значением свопа и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionSwap не изменяется, а функция возвращает false.

bool LastClosedPositionSwap(double &lastClosedPositionSwap) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSwap = lastClosedPositionInfo.swap;
      return(true);
     }
   return(false);
  }


Функция комиссии за последнюю закрытую позицию

Функция LastClosedPositionCommission() отвечает за извлечение значения комиссии последней закрытой позиции. Она сохраняет значение комиссии в ссылочную переменную lastClosedPositionCommission. Если функция LastClosedPositionCommission() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionCommission с комиссией и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionCommission не изменяется, а функция возвращает false.

bool LastClosedPositionCommission(double &lastClosedPositionCommission) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCommission = lastClosedPositionInfo.commission;
      return(true);
     }
   return(false);
  }


Функция типа ордера, инициировавшего последнюю закрытую позицию

Функция LastClosedPositionInitiatingOrderType() отвечает за извлечение типа инициирующего ордера последней закрытой позиции. Она позволяет нам узнать, была ли позиция инициирована отложенным ордером (Buy Stop, Buy Limit, Sell Stop, Sell Limit, Buy Stop Limit или Sell Stop Limit) или прямым рыночным ордером. Функция сохраняет тип инициирующего ордера в ссылочную переменную lastClosedPositionInitiatingOrderType. Если функция LastClosedPositionInitiatingOrderType() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionInitiatingOrderType с типом инициирующего ордера и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionInitiatingOrderType не изменяется, а функция возвращает false.

bool LastClosedPositionInitiatingOrderType(ENUM_ORDER_TYPE &lastClosedPositionInitiatingOrderType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatingOrderType = lastClosedPositionInfo.initiatingOrderType;
      return(true);
     }
   return(false);
  }


Функция идентификатора последней закрытой позиции

Функция LastClosedPositionId() отвечает за извлечение идентификатора последней закрытой позиции. Она сохраняет идентификатор позиции в ссылочную переменную lastClosedPositionId. Если функция LastClosedPositionId() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionId с идентификатором позиции и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionId не изменяется, а функция возвращает false.

bool LastClosedPositionId(ulong &lastClosedPositionId) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionId = lastClosedPositionInfo.positionId;
      return(true);
     }
   return(false);
  }


Функция последней закрытой позиции, инициированной отложенным ордером

Функция LastClosedPositionInitiatedByPendingOrder() отвечает за проверку того, была ли последняя закрытая позиция инициирована отложенным ордером. Функция сохраняет эту информацию в ссылочную переменную lastClosedPositionInitiatedByPendingOrder. Если функция LastClosedPositionInitiatedByPendingOrder() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionInitiatedByPendingOrder и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionInitiatedByPendingOrder не изменяется, а функция возвращает false.

bool LastClosedPositionInitiatedByPendingOrder(bool &lastClosedPositionInitiatedByPendingOrder) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatedByPendingOrder = lastClosedPositionInfo.initiatedByPendingOrder;
      return(true);
     }
   return(false);
  }


Функция тикета ордера открытия последней закрытой позиции

Функция LastClosedPositionOpeningOrderTicket() отвечает за извлечение номера тикета открытия ордера последней закрытой позиции. Функция сохраняет номер тикета в ссылочную переменную lastClosedPositionOpeningOrderTicket. Если функция LastClosedPositionOpeningOrderTicket() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionOpeningOrderTicket с номером тикета и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionOpeningOrderTicket не изменяется, а функция возвращает false.

bool LastClosedPositionOpeningOrderTicket(ulong &lastClosedPositionOpeningOrderTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningOrderTicket = lastClosedPositionInfo.openingOrderTicket;
      return(true);
     }
   return(false);
  }


Функция тикета сделки открытия последней закрытой позиции

Функция LastClosedPositionOpeningDealTicket() отвечает за извлечение номера тикета сделки открытия последней закрытой позиции. Она сохраняет номер тикета сделки в ссылочную переменную lastClosedPositionOpeningDealTicket. Если функция LastClosedPositionOpeningDealTicket() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionOpeningDealTicket с номером тикета сделки и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionOpeningDealTicket не изменяется, а функция возвращает false.

bool LastClosedPositionOpeningDealTicket(ulong &lastClosedPositionOpeningDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningDealTicket = lastClosedPositionInfo.openingDealTicket;
      return(true);
     }
   return(false);
  }


Функция тикета сделки закрытия последней закрытой позиции

Функция LastClosedPositionClosingDealTicket() отвечает за извлечение номера тикета сделки закрытия последней закрытой позиции. Функция сохраняет номер тикета сделки в ссылочную переменную lastClosedPositionClosingDealTicket. Если функция LastClosedPositionClosingDealTicket() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionClosingDealTicket с номером тикета сделки и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionClosingDealTicket не изменяется, а функция возвращает false.

bool LastClosedPositionClosingDealTicket(ulong &lastClosedPositionClosingDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosingDealTicket = lastClosedPositionInfo.closingDealTicket;
      return(true);
     }
   return(false);
  }


Функция магического числа последней закрытой позиции

Функция LastClosedPositionMagic() отвечает за извлечение магического числа последней закрытой позиции. Она сохраняет магическог число в ссылочную переменную lastClosedPositionMagic. Если функция LastClosedPositionMagic() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionMagic с магическим числом и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionMagic не изменяется, а функция возвращает false.

bool LastClosedPositionMagic(ulong &lastClosedPositionMagic) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionMagic = lastClosedPositionInfo.magic;
      return(true);
     }
   return(false);
  }


Функция комментария последней закрытой позиции

Функция LastClosedPositionComment() отвечает за извлечение комментария к последней закрытой позиции. Она сохраняет комментарий в ссылочную переменную lastClosedPositionComment. Если функция LastClosedPositionComment() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionComment с комментарием и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionComment не изменяется, а функция возвращает false.

bool LastClosedPositionComment(string &lastClosedPositionComment) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionComment = lastClosedPositionInfo.comment;
      return(true);
     }
   return(false);
  }


Функция продолжительности последней закрытой позиции

Функция LastClosedPositionDuration() отвечает за извлечение продолжительности последней закрытой позиции в секундах. Она сохраняет продолжительность в ссылочную переменную lastClosedPositionDuration. Если функция LastClosedPositionDuration() успешно извлекает данные для последней закрытой позиции, она обновляет переменную lastClosedPositionDuration с продолжительностью и подтверждает успешность операции, возвращая true. Если получить данные не удалось, переменная lastClosedPositionDuration не изменяется, а функция возвращает false.

bool LastClosedPositionDuration(long &lastClosedPositionDuration) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionDuration = lastClosedPositionInfo.duration;
      return(true);
     }
   return(false);
  }


Заключение

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

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

Ниже приложена последняя версия исходного кода библиотеки HistoryManager.mq5, которая включает все функции, созданные в этой статье, а также функции, представленные в предыдущей. Спасибо за внимание и до встречи в следующей статье!

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/16681

Прикрепленные файлы |
HistoryManager.mq5 (55.17 KB)
Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
От новичка до эксперта: Программирование японских свечей От новичка до эксперта: Программирование японских свечей
В настоящей статье сделаем первый шаг в программировании на MQL5, даже для совсем новичков. Мы покажем вам, как преобразовать знакомые свечные паттерны в полнофункциональный пользовательский индикатор. Свечные паттерны ценны тем, что они отражают реальное движение цены и сигнализируют о сдвигах на рынке. Вместо ручного сканирования графиков — подхода, чреватого ошибками и неэффективностью, — мы обсудим, как автоматизировать этот процесс с помощью индикатора, идентифицирующего и помечающего паттерны для вас. Попутно рассмотрим такие ключевые понятия, как индексация, временные ряды, средний истинный диапазон (для обеспечения точности при различной волатильности рынка), а также разработку пользовательской библиотеки свечных паттернов для многократного использования в будущих проектах.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Нейросети в трейдинге: Модель адаптивной графовой диффузии (SAGDFN) Нейросети в трейдинге: Модель адаптивной графовой диффузии (SAGDFN)
В статье мы раскрываем архитектуру SAGDFN — современного фреймворка, способного преобразовать подход к обработке пространственно-временных данных. Он сохраняет ключевую информацию даже в сложных графах и при этом снижает вычислительные издержки.