Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Размещай ссылки на чужие сигналы и зарабатывай
MetaQuotes Software Corp.
Модератор
181360
MetaQuotes Software Corp. 2013.04.18 16:56 

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

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

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

Автор: Anatoli Kazharski

Maxim Khrolenko
7118
Maxim Khrolenko 2013.04.19 12:15  
Статья хорошая, понравилась. Часто бывает так, что текущая позиция состоит из нескольких сделок и кроме первой и последней хотелось бы узнать параметры 2, 3 и т.д. сделок. Tакая функция обогатила бы статью.
Anatoli Kazharski
56954
Anatoli Kazharski 2013.04.20 08:01  
paladin800:
Статья хорошая, понравилась. Часто бывает так, что текущая позиция состоит из нескольких сделок и кроме первой и последней хотелось бы узнать параметры 2, 3 и т.д. сделок. Tакая функция обогатила бы статью.
Пусть это пока будет домашним заданием. Но всё же попробую написать потом что-нибудь ещё на эту тему. 
Dennis Kirichenko
11330
Dennis Kirichenko 2013.05.23 12:06  

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

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



Anatoli Kazharski
56954
Anatoli Kazharski 2013.05.23 13:05  
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));
     }
//---
  }
Dennis Kirichenko
11330
Dennis Kirichenko 2013.05.23 13:58  
tol64:

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

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

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

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

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

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

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

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

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

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

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

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

Dennis Kirichenko
11330
Dennis Kirichenko 2013.09.27 10:43  

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

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

К примеру:

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         // сюда примем значение свойства
   );

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

Файлы:
Anatoli Kazharski
56954
Anatoli Kazharski 2013.09.27 10:56  
denkir:

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

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

...

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

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

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

Anatoli Kazharski
56954
Anatoli Kazharski 2013.09.27 12:25  
denkir:

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

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

У меня всё успешно проходит. Посмотрите всё более подробно (вывод в журнал) для выяснения причины. Количество ордеров, тикеты, номер ошибки и т.д.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий