Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте, уважаемые знатоки...

У меня есть робот на MT5, который работает сессиями с пачками рыночных позиций.
В очередном апдейте я хочу его научить, чтобы он учитывал историю закрытых сделок не только непосредственно закрытых им самим (по Magic_ID), но и закрытых вручную (при условии, что робот их открывал).
Общая блок схема:
1. При изменении истории сделок робот собирает первичную информацию по сделкам закрытия (DEAL_ENTRY_OUT) с начала своей сессии.
2. С помощью DEAL_POSITION_ID получаем тикет открывающей сделки.
3. С помощью DEAL_MAGIC получаем Magic_ID открывающей сделки
4. Если Magic_ID открывающей позиции равен заданному в настройках, то считаем закрывающую сделку нашей и фиксируем сведения о ней.
5. Отрисовываем метки открытия и закрытия позиции и линию жизни позиции. (Это удобно, когда на одной паре стоит несколько роботов, чтобы графически видеть нужную часть истории).
По этой блок-схеме я сделал инклюд. На тестере работает как задумано. В журнал пишет:
Но на реале как надо не работает. Путем последовательно исключения выяснил, что DEAL_MAGIC не считывает у сделки открытия.

И условие if(deal_id_in != id_Orders){continue;} // если ID входящей сделки не наш, выбираем следующий ордер // (строка 94) дальше не пускает
Прошу вас указать в чем причина и как её победить?
Код инклюда прилагаю.
Здравствуйте, уважаемые знатоки...
У меня есть робот на MT5, который работает сессиями с пачками рыночных позиций.
В очередном апдейте я хочу его научить, чтобы он учитывал историю закрытых сделок не только непосредственно закрытых им самим (по Magic_ID), но и закрытых вручную (при условии, что робот их открывал).
Общая блок схема:
1. При изменении истории сделок робот собирает первичную информацию по сделкам закрытия (DEAL_ENTRY_OUT) с начала своей сессии.
2. С помощью DEAL_POSITION_ID получаем тикет открывающей сделки.
3. С помощью DEAL_MAGIC получаем Magic_ID открывающей сделки
4. Если Magic_ID открывающей позиции равен заданному в настройках, то считаем закрывающую сделку нашей и фиксируем сведения о ней.
5. Отрисовываем метки открытия и закрытия позиции и линию жизни позиции. (Это удобно, когда на одной паре стоит несколько роботов, чтобы графически видеть нужную часть истории).
По этой блок-схеме я сделал инклюд. На тестере работает как задумано. В журнал пишет:
Но на реале как надо не работает. Путем последовательно исключения выяснил, что DEAL_MAGIC не считывает у сделки открытия.
И условие if(deal_id_in != id_Orders){continue;} // если ID входящей сделки не наш, выбираем следующий ордер // (строка 94) дальше не пускает
Прошу вас указать в чем причина и как её победить?
Код инклюда прилагаю.
На беглый взгляд, первый и второй логи выводятся _разными_ кодами.
И приведённому коду соответствует только первый лог, а второй выводится каким-то другим кодом.
На беглый взгляд, первый и второй логи выводятся _разными_ кодами.
И приведённому коду соответствует только первый лог, а второй выводится каким-то другим кодом.
Код тот же.
Но поскольку на реале до конечного лога не добираемся, то я раскоментил строку 92, чтобы было видно докуда доходим.
Здравствуйте, уважаемые знатоки...
У меня есть робот на MT5, который работает сессиями с пачками рыночных позиций.
В очередном апдейте я хочу его научить, чтобы он учитывал историю закрытых сделок не только непосредственно закрытых им самим (по Magic_ID), но и закрытых вручную (при условии, что робот их открывал).
Общая блок схема:
1. При изменении истории сделок робот собирает первичную информацию по сделкам закрытия (DEAL_ENTRY_OUT) с начала своей сессии.
2. С помощью DEAL_POSITION_ID получаем тикет открывающей сделки.
3. С помощью DEAL_MAGIC получаем Magic_ID открывающей сделки
4. Если Magic_ID открывающей позиции равен заданному в настройках, то считаем закрывающую сделку нашей и фиксируем сведения о ней.
5. Отрисовываем метки открытия и закрытия позиции и линию жизни позиции. (Это удобно, когда на одной паре стоит несколько роботов, чтобы графически видеть нужную часть истории).
По этой блок-схеме я сделал инклюд. На тестере работает как задумано. В журнал пишет:
Но на реале как надо не работает. Путем последовательно исключения выяснил, что DEAL_MAGIC не считывает у сделки открытия.
И условие if(deal_id_in != id_Orders){continue;} // если ID входящей сделки не наш, выбираем следующий ордер // (строка 94) дальше не пускает
Прошу вас указать в чем причина и как её победить?
Код инклюда прилагаю.
Так и думал, что никто ничего путёвого не подскажет. Видимо баг MQL5. Как иначе обьяснить, что на тестере (с визуалом и без) работает как надо, а на реале - нет.
Так и думал, что никто ничего путёвого не подскажет. Видимо баг MQL5. Как иначе обьяснить, что на тестере (с визуалом и без) работает как надо, а на реале - нет.
Я пытался разобраться в вашем коде, но написано так, что мой мозг не воспринимает этого.
Вы зря не пользуетесь функцией OnTradeTransaction. Это избавило бы вас от перебора всех позиций.
И вот это
почему на втором снимке написано подругому? Наверное печатает из другого места кода.
Я пытался разобраться в вашем коде, но написано так, что мой мозг не воспринимает этого.
Вы зря не пользуетесь функцией OnTradeTransaction. Это избавило бы вас от перебора всех позиций.
И вот это
почему на втором снимке написано подругому? Наверное печатает из другого места кода.
Я уже писал выше, что поскольку на реале до конечного лога не добираемся, то я раскоментил строку 92, чтобы было видно докуда доходим и почему дальше не проходим: условие по DEAL_MAGIC не выполняется в строке 94.
И вопрос в том, почему это работает на тестере (в том числе с визуализацией), а на реале идет затык. Ведь такого не должно быть.
Перефразирую вопрос. Как вы думаете, почему эта строка на визуальном тестере выдает Magic, а на реале выдает 0 ?
Вероятно "ларчик то просто открывается", и я упускаю какую-то мелочь. Ну или это всё-таки баг MQL5? Что думаете - СУПЕРПРОФИ ?
Посмотрел функцию OnTradeTransaction. Если мне идти по этому пути, то будет совсем другой код. И не факт, что он будет проще.
Мне ведь надо не просто сделать обработку результатов выполнения торгового запроса. А выполнить прикладную задачу - связать ручную сделку закрытия со сделкой открытия с помощью эксперта.
Здравствуйте. ))) Спасибо за проявленный интерес.
Я уже писал выше, что поскольку на реале до конечного лога не добираемся, то я раскоментил строку 92, чтобы было видно докуда доходим и почему дальше не проходим: условие по DEAL_MAGIC не выполняется в строке 94.
И вопрос в том, почему это работает на тестере (в том числе с визуализацией), а на реале идет затык. Ведь такого не должно быть.
Перефразирую вопрос. Как вы думаете, почему эта строка на визуальном тестере выдает Magic, а на реале выдает 0 ?
Вероятно "ларчик то просто открывается", и я упускаю какую-то мелочь. Ну или это всё-таки баг MQL5? Что думаете - СУПЕРПРОФИ ?
Посмотрел функцию OnTradeTransaction. Если мне идти по этому пути, то будет совсем другой код. И не факт, что он будет проще.
Мне ведь надо не просто сделать обработку результатов выполнения торгового запроса. А выполнить прикладную задачу - связать ручную сделку закрытия со сделкой открытия с помощью эксперта.
В тестере всё совсем не так как в реале.
Вот эта строка
почему вы решили, что это тикет сделки?
Внимательно прочтите что такое DEAL_POSITION_ID и как выбрать ордера и сделки относящиеся к одной позиции.
Посмотрел функцию OnTradeTransaction. Если мне идти по этому пути, то будет совсем другой код. И не факт, что он будет проще.
Мне ведь надо не просто сделать обработку результатов выполнения торгового запроса. А выполнить прикладную задачу - связать ручную сделку закрытия со сделкой открытия с помощью эксперта.
Да, это будет другой код. И будет гораздо проще. Посмотрите структуры функции
Вам не придётся на каждом тике проверять не изменилась ли история. Вы сразу получаете событие, проверяете что это и код выполняется в определённом направлении.
Но дело ваше, не нравится, не ешьте…😊
В тестере всё совсем не так как в реале.
Вы общими расхожими фразами выражаетесь вместо конкретики. Определенные различия между тестером и реалом в MQL5 конечно есть. Они описаны. Но в данном случае, в чем именно разница на реале и визуале в обработке этой строки?
почему вы решили, что это тикет сделки?
Потому что так написано в мануале.
DEAL_POSITION_ID
Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая позиция имеет уникальный идентификатор, который присваивается всем сделкам, совершенным на инструменте в течение всей жизни позиции.
"Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция."
Значит тикет сделки открытия рыночной позиции это и будет для всех остальных ордеров идентификатором позиции (т.е. DEAL_POSITION_ID). Тестер с визуализацией это подтверждают.
Вам не придётся на каждом тике проверять не изменилась ли история.
И тут тоже вы не угадали. Разве я не понимаю?))) Запрос истории у меня идет не на каждом тике. И даже не по времени вообще, а при изменении суммарного обьема лотов по инструменту.
Потому что так написано в мануале.
DEAL_POSITION_ID
Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая позиция имеет уникальный идентификатор, который присваивается всем сделкам, совершенным на инструменте в течение всей жизни позиции.
"Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция."
POSITION_TICKET
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_IDENTIFIER.
Значение POSITION_TICKET соответствует MqlTradeRequest::position.
long
POSITION_IDENTIFIER
Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.
Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.
При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.
long
Вот разница между тикетом позиции и идентификатором позиции.
Когда-то в этом описании была оговорка «…как правило соответствует тикету ордера…»
А в тестере это просто совпадение. Случайное попадание в цель…