Обсуждение статьи "Рецепты MQL5 - История сделок и библиотека функций для получения свойств позиции"

 

Опубликована статья Рецепты MQL5 - История сделок и библиотека функций для получения свойств позиции:

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

Рецепты MQL5 - История сделок и библиотека функций для получения свойств позиции

Автор: Anatoli Kazharski

 
Статья хорошая, понравилась. Часто бывает так, что текущая позиция состоит из нескольких сделок и кроме первой и последней хотелось бы узнать параметры 2, 3 и т.д. сделок. Tакая функция обогатила бы статью.
 
paladin800:
Статья хорошая, понравилась. Часто бывает так, что текущая позиция состоит из нескольких сделок и кроме первой и последней хотелось бы узнать параметры 2, 3 и т.д. сделок. Tакая функция обогатила бы статью.
Пусть это пока будет домашним заданием. Но всё же попробую написать потом что-нибудь ещё на эту тему. 
 

Вопрос автору статьи.

Как получить идентификатор позиции, в которой участвовала сделка, сразу же после того, как позиция была открыта?



 
denkir:

Вопрос автору статьи.

Как получить идентификатор позиции, в которой участвовала сделка, сразу же после того, как позиция была открыта?

Выбрать позицию с помощью функции PositionSelect() и получить её идентификатор с помощью функции PositionGetInteger() и идентификатора mql5 - POSITION_IDENTIFIER

Пример из Справки:

//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- проверим наличие позиции и выведем время её изменения
   if(PositionSelect(_Symbol))
     {     
//--- получим идентификатор позиции для дальнейшей работы с ней
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- получим время образования позиции в миллисекундах с 01.01.1970
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- получим время последнего изменения позиции в секундах с 01.01.1970
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- получим время последнего изменения позиции в миллисекундах с 01.01.1970
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

Выбрать позицию с помощью функции PositionSelect() и получить её идентификатор с помощью функции PositionGetInteger() и идентификатора mql5 - POSITION_IDENTIFIER

Пример из Справки:

Спасибо, tol64! В принципе правда Ваша.

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

Имеется в виду такая проблема. Нужно после того, как поза была открыта, поймать это открытие в истории сделок с помощью класса CDealInfo методом ::PositionId(). Причём желательно с наименьшим временным разрывом между моментом открытия и моментом появления сделки типа DEAL_ENTRY_IN или DEAL_ENTRY_INOUT в истории.

Можно ли так сделать? Не через список активных позиций, а через список сделок в истории...
 
denkir:

Спасибо, tol64! В принципе правда Ваша.

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

Имеется в виду такая проблема. Нужно после того, как поза была открыта, поймать это открытие в истории сделок с помощью класса CDealInfo методом ::PositionId(). Причём желательно с наименьшим временным разрывом между моментом открытия и моментом появления сделки типа DEAL_ENTRY_IN или DEAL_ENTRY_INOUT в истории.

Можно ли так сделать? Не через список активных позиций, а через список сделок в истории...

На мой взгляд для этого вполне подходит отслеживание события в OnTrade(), как в примере выше. Но я бы подумал, что вдруг позицию не удастся выбрать по торговому событию, а следующее будет не скоро. Тогда нужно отслеживать окружение по таймеру. Сейчас уже даже миллисекунды можно устанавливать.

Ну или вместо отслеживания открытой позиции сканировать историю сделок (количество сделок). Помним предыдущее, сравниваем с текущим. Также в таймере это можно делать. Вариантов море. Всё зависит от конкретной задачи.

 

Анатолий, столкнулся тут с проблемой. Просьба поделиться своим опытом. Или есть баг при работе с функциями, или иду "не туда". Но вроде всё по уму сделал...

Вопрос по вариантам функции, где второй не "пашет".

К примеру:

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // тикет
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // идентификатор свойства
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // тикет
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // идентификатор свойства
   double&                     double_var         // сюда примем значение свойства
   );

Исходник приложил.

Файлы:
 
denkir:

Анатолий, столкнулся тут с проблемой. Просьба поделиться своим опытом. Или есть баг при работе с функциями, или иду "не туда". Но вроде всё по уму сделал...

Вопрос по вариантам функции, где второй не "пашет".

...

А что Вы видите в журнале? У меня при запуске скрипта проблем не обнаружено.
 
tol64:
А что Вы видите в журнале? У меня при запуске скрипта проблем не обнаружено.

Вижу, что при умолчательных настройках скрипта идёт запись типа "Неудача возврата функции HistoryOrderGetDouble()".

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

 
denkir:

Вижу, что при умолчательных настройках скрипта идёт запись типа "Неудача возврата функции HistoryOrderGetDouble()".

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

У меня всё успешно проходит. Посмотрите всё более подробно (вывод в журнал) для выяснения причины. Количество ордеров, тикеты, номер ошибки и т.д.
Причина обращения: