Как к ним прикрутить закрытие половины прибыли
Используйте OrderClose(). Объём для закрытия вычисляется так: допустим у Вас открыта позиция 1лот , и Вам надо закрыть половину, значит закрываемый объём лота будет равен 0.5 , его и указываем в OrderClose(). Это "образное" описание алгоритма...
подтянуть стоплсс оставшейся позиции на количество пунктов к месту входа
поможет OrderModify().
Всё это можно оформить одной, отдельной функцией.
Помогите пожалуйста. Написал советник (в MQL4) открывающий 1 маркет ордер и 1 лимит ордер. Как к ним прикрутить закрытие половины прибыли и подтянуть стоплсс оставшейся позиции на количество пунктов к месту входа, чтоб если выбьет, убыток не получить???
Только начинаю изучать программирование, подскажите пожалуйста.
Алгоритм такой. Советник проверяет если у позиции ордер стоп лосс находится в без убытке значит половина позиции уже была закрыта. Иначе все делаете как сказал выше Сергей, с помощью функции OrderClose(), которой в качестве параметра "количество лотов для закрытия" передаете размер половины лота вашей открытой позиции. После чего с помощью OrderModify() переносите стоп лосс в без убыток.
Если перед закрытием позиции не проводить проверку на предмет того закрыта уже половина позиции или нет то эксперт будет на каждом тике закрывать половину. До тех пор пока не останется минимально допустимый лот. А далее последуют ошибки.
Советник проверяет если у позиции ордер стоп лосс находится в без убытке значит половина позиции уже была закрыта.
которой в качестве параметра "количество лотов для закрытия" передаете размер половины лота вашей открытой позиции
Как альтернативный вариант - проверять не стоплосс в без убытке, а комментарий открытой позиции. Если в комментарии присутствует "from #" , значит позиция уже "располовинена" и её не трогаем, если нет то закрываем часть.
Думаю правильнее будет в настройках указывать не "количество лотов для закрытия", а вычислять объём закрытия в процентах - реализовать будет чуть сложнее, но работа с позициями будет гибче. Но это уже выбор топик-стартера..
Можно и комментарий только тогда надо анализировать содержимое комментария. Но для данного случая проще проверить стоит ли стоп в без убытке. К тому же некоторые брокеры любят в комментарий вставлять свои комментарии.
Если закрывать в процентах то ни чего сложного половина это 50% или 50/100 = 0.5 и Получается что размер лота который мы должны передать в функцию OrderClose() будет равен
NormalizeDouble(OrderLots()*0.5,2). Соответственно надо еще проверить будет ли рассчитанный объем больше или равен минимально допустимому.
Используйте OrderClose(). Объём для закрытия вычисляется так: допустим у Вас открыта позиция 1лот , и Вам надо закрыть половину, значит закрываемый объём лота будет равен 0.5 , его и указываем в OrderClose(). Это "образное" описание алгоритма...
поможет OrderModify().
Всё это можно оформить одной, отдельной функцией.
Хорошо, как мне тогда это организовать подскажите пожалуйста. Функции что вы назвали, я и так знаю. Как это сделать в коде? Вот что я не понимаю.
То есть у меня уровень закрытия половины лота стоит к примеру на 150пп. Цена подходит к уровню и на тике закрывает половину лота, потом идет проверка котировок снова (ибо цена уже может не быть 150пп) и если цена равна ТПрофиту, то включается OrderModify(). ??? Я правильно понимаю?
Хорошо, как мне тогда это организовать подскажите пожалуйста. Функции что вы назвали, я и так знаю. Как это сделать в коде? Вот что я не понимаю.
То есть у меня уровень закрытия половины лота стоит к примеру на 150пп. Цена подходит к уровню и на тике закрывает половину лота, потом идет проверка котировок снова (ибо цена уже может не быть 150пп) и если цена равна ТПрофиту, то включается OrderModify(). ??? Я правильно понимаю?
Вычисляете на сколько пунктов цена удалилась от вашей позиции. Если они равно 150 то проделываете все выше описанные действия. Узнать цену открытия позиции поможет функция OrderOpenPrice() текущая цена это Bid или Ask соответственно разница между этими ценами деленная на Point() и будет кол-вом пунктов. При расчетах надо учитывать направление сделки BUY или SELL.
Вычисляете на сколько пунктов цена удалилась от вашей позиции. Если они равно 150 то проделываете все выше описанные действия. Узнать цену открытия позиции поможет функция OrderOpenPrice() текущая цена это Bid или Ask соответственно разница между этими ценами деленная на Point() и будет кол-вом пунктов. При расчетах надо учитывать направление сделки BUY или SELL.
>=150
Да, точно спасибо за уточнение.
Такой же цикл организуйте по OP_BUY и по OP_SELL
и вместо count++ сделайте анализ выбранного ордера и при необходимости обработку закрытия и модификации СЛ
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Только начинаю изучать программирование, подскажите пожалуйста.