...
и ожидаем что он закроет всё.
...
На мой взгляд, "это не баг, это фича".
Закрывать позиции, не тобой открытые - с точки зрения класса весьма спорный функционал.
И, кстати, цикл FOR в приведенном коде - крайне опасно написан. Если такой цикл будет вставлен в реально работающий эксперт или скрипт - возможна трудно вычислимая ошибка с зацикливанием.
В цикле надо, по возможности, избегать проверки условий с равенством - лучше изменить условия так, чтобы было либо строгое неравенство, либо строгое равенство, в данном случае - строгое неравенство.
Очень богатая фантазия нужна, что бы такое ждать.
Дмитрий - очень информативное сообщение.
Поясните, почему нужна богатая фантазия ?
Дмитрий - очень информативное сообщение.
Поясните, почему нужна богатая фантазия ?
Потому-что параметр только один: Ctrd.PositionClose(PositionGetSymbol(i));
Сама конструкция:
for(int i=PositionsTotal()-1;i>=0;i--) Ctrd.PositionClose(PositionGetSymbol(i));
выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.
выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.
Не анализировал класс СTrade, но, в МТ5 - позиция совокупная, и в ней не бывает "много ордеров".
Если не ошибаюсь, для хеджирующего счета - ордеров может быть два - прямой, и обратный, и оба они составляют позицию, соответственно, и закрываться должны одновременно одной командой.
Да и для МТ4 класс позиции - должен включать все открытые ордера, и внутри функции PositionClose() - они должны закрываться все, через перебор.
В данном случае - вполне рабочая конструкция.
Под ордером имел ввиду позицию. Пока не пробовал хеджирующий счет, но у меня другие представления о его возможностях.
Смотрел этот класс и как раз его код как бы намекает, что позиций может быть несколько.
Не анализировал класс СTrade, но, в МТ5 - позиция совокупная, и в ней не бывает "много ордеров".
Если не ошибаюсь, для хеджирующего счета - ордеров может быть два - прямой, и обратный, и оба они составляют позицию, соответственно, и закрываться должны одновременно одной командой.
Да и для МТ4 класс позиции - должен включать все открытые ордера, и внутри функции PositionClose() - они должны закрываться все, через перебор.
В данном случае - вполне рабочая конструкция.
Очень богатая фантазия нужна, что бы такое ждать.
На мой взгляд, "это не баг, это фича".
Закрывать позиции, не тобой открытые - с точки зрения класса весьма спорный функционал.
И, кстати, цикл FOR в приведенном коде - крайне опасно написан. Если такой цикл будет вставлен в реально работающий эксперт или скрипт - возможна трудно вычислимая ошибка с зацикливанием.
В цикле надо, по возможности, избегать проверки условий с равенством - лучше изменить условия так, чтобы было либо строгое неравенство, либо строгое равенство, в данном случае - строгое неравенство.
Согласен со всем. Но пример не для олимпиады по программированию, а показывавший конкретную багу которую нужно исправить и чем проще он будет показан тем быстрее и до большего числа людей он будет понятней, но оказалось что отвечать стали на те вопросы которые я, как тс, не задавал и ответы на них меня не интересуют.
Потому-что параметр только один: Ctrd.PositionClose(PositionGetSymbol(i));
Сама конструкция:
выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.
Тот кто много знает порой плохо спит, потому что отвечает не на поставленные вопросы.
Повторяюсь - в хелпе ни слова нет о том что метод PositionClose на хеджевом счёте смотрит и за магиком тоже, поэтому надо либо исправить хелп, либо скорректировать указанную выше строку в библиотеке. Собвтенные мысли о том где что будет работать или нет можете оставить при себе.
Начнём с того что всё закрывается на ура. Хотя в рабочих экспертах использую немного другую конструкцию для закрытия всего.
Согласен со всем. Но пример не для олимпиады по программированию, а показывавший конкретную багу которую нужно исправить и чем проще он будет показан тем быстрее и до большего числа людей он будет понятней, но оказалось что отвечать стали на те вопросы которые я, как тс, не задавал и ответы на них меня не интересуют.
Тот кто много знает порой плохо спит, потому что отвечает не на поставленные вопросы.
Повторяюсь - в хелпе ни слова нет о том что метод PositionClose на хеджевом счёте смотрит и за магиком тоже, поэтому надо либо исправить хелп, либо скорректировать указанную выше строку в библиотеке. Собвтенные мысли о том где что будет работать или нет можете оставить при себе.
#include <Trade\Trade.mqh> CTrade Ctrd; void OnStart() { for(int i=PositionsTotal()-1;i>=0;i--) Ctrd.PositionCloseByTicket(PositionGetTicket(i)); }
Попробуйте так
А предложенный вами вариант не будет работать на обычных счетах, не хеджевых.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На хеджевом счёте запускаем вот такой простой скрипт:
и ожидаем что он закроет всё.
Но оказывается, если сделки открыты роботом и им присвоен какой либо магик, то эти сделки не закроются. Смотрим код библиотеки Trade.mqh и видим такую строку под номером 1504:
смотрим в хелпе описание метода PositionClose и ни слова не видим про магик.
Вывод: либо в библиотеке убрать проверку магика либо написать об этом в хелпе.
Или я что то неправильно понимаю ?
в сервисдеск не пишу по причине отсутствия реакции на предыдущее сообщение. хз чем там народ занят. все наверное в работе.