Обсуждение статьи "Рецепты MQL5 - История сделок и библиотека функций для получения свойств позиции"
Статья хорошая, понравилась. Часто бывает так, что текущая позиция состоит из нескольких сделок и кроме первой и последней хотелось бы узнать параметры 2, 3 и т.д. сделок. Tакая функция обогатила бы статью.
Вопрос автору статьи.
Как получить идентификатор позиции, в которой участвовала сделка, сразу же после того, как позиция была открыта?
Вопрос автору статьи.
Как получить идентификатор позиции, в которой участвовала сделка, сразу же после того, как позиция была открыта?
Выбрать позицию с помощью функции 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)); } //--- }
Выбрать позицию с помощью функции PositionSelect() и получить её идентификатор с помощью функции PositionGetInteger() и идентификатора mql5 - POSITION_IDENTIFIER.
Пример из Справки:
Спасибо, tol64! В принципе правда Ваша.
А я извиняюсь за то, что первый вопрос был кратким...несмотря на то, что дал ссылку на идентификатор позиции.
Имеется в виду такая проблема. Нужно после того, как поза была открыта, поймать это открытие в истории сделок с помощью класса CDealInfo методом ::PositionId(). Причём желательно с наименьшим временным разрывом между моментом открытия и моментом появления сделки типа DEAL_ENTRY_IN или DEAL_ENTRY_INOUT в истории.
Спасибо, 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 // сюда примем значение свойства );
Исходник приложил.
Анатолий, столкнулся тут с проблемой. Просьба поделиться своим опытом. Или есть баг при работе с функциями, или иду "не туда". Но вроде всё по уму сделал...
Вопрос по вариантам функции, где второй не "пашет".
...
А что Вы видите в журнале? У меня при запуске скрипта проблем не обнаружено.
Вижу, что при умолчательных настройках скрипта идёт запись типа "Неудача возврата функции HistoryOrderGetDouble()".
Т.е. булевый вариант функции не получает значение свойства.
Вижу, что при умолчательных настройках скрипта идёт запись типа "Неудача возврата функции HistoryOrderGetDouble()".
Т.е. булевый вариант функции не получает значение свойства.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Рецепты MQL5 - История сделок и библиотека функций для получения свойств позиции:
Пришло время подвести краткий итог по материалам предыдущих статей о свойствах позиции. В этой статье мы создадим несколько дополнительных функций для получения тех свойств, которые можно получить только после обращения к истории сделок. Мы также познакомимся со структурами данных, что сделает доступ к свойствам позиции и символа еще удобнее.
Автор: Anatoli Kazharski