Как закрыть половину лота и у оставшейся подтянуть стоплосс на то же количество пунктов

 
Помогите пожалуйста. Написал советник (в MQL4) открывающий 1 маркет ордер и 1 лимит ордер. Как к ним прикрутить закрытие половины прибыли и подтянуть стоплсс оставшейся позиции на количество пунктов к месту входа, чтоб если выбьет, убыток не получить???
Только начинаю изучать программирование, подскажите пожалуйста.
 
Hugeen20015:
Как к ним прикрутить закрытие половины прибыли

Используйте OrderClose(). Объём для закрытия вычисляется так: допустим у Вас открыта позиция 1лот , и Вам надо закрыть половину, значит закрываемый объём лота будет равен 0.5 , его и указываем в OrderClose(). Это "образное" описание алгоритма... 

подтянуть стоплсс оставшейся позиции на количество пунктов к месту входа

поможет OrderModify().

Всё это можно оформить одной, отдельной функцией.

 
Hugeen20015:
Помогите пожалуйста. Написал советник (в MQL4) открывающий 1 маркет ордер и 1 лимит ордер. Как к ним прикрутить закрытие половины прибыли и подтянуть стоплсс оставшейся позиции на количество пунктов к месту входа, чтоб если выбьет, убыток не получить???
Только начинаю изучать программирование, подскажите пожалуйста.

Алгоритм такой. Советник проверяет если у позиции ордер стоп лосс находится в без убытке значит половина позиции уже была закрыта. Иначе все делаете как сказал выше Сергей, с помощью функции OrderClose(), которой в качестве параметра "количество лотов для закрытия" передаете размер половины лота вашей открытой позиции. После чего с помощью OrderModify() переносите стоп лосс в без убыток.

Если перед закрытием позиции не проводить проверку на предмет  того закрыта уже половина позиции или нет то эксперт будет на каждом тике закрывать половину. До тех пор пока не останется минимально допустимый лот. А далее последуют ошибки. 

 
Vitalii Ananev:

Советник проверяет если у позиции ордер стоп лосс находится в без убытке значит половина позиции уже была закрыта.

Как альтернативный вариант - проверять не стоплосс в без убытке, а комментарий открытой позиции. Если в комментарии присутствует "from #" , значит позиция уже "располовинена" и её не трогаем, если нет то закрываем часть.

которой в качестве параметра "количество лотов для закрытия" передаете размер половины лота вашей открытой позиции

Думаю правильнее будет в настройках указывать не "количество лотов для закрытия", а вычислять объём закрытия в процентах - реализовать будет чуть сложнее, но работа с позициями будет гибче. Но это уже выбор топик-стартера.. 
 
Sergey Kolemanov:
Как альтернативный вариант - проверять не стоплосс в без убытке, а комментарий открытой позиции. Если в комментарии присутствует "from #" , значит позиция уже "располовинена" и её не трогаем, если нет то закрываем часть.
Думаю правильнее будет в настройках указывать не "количество лотов для закрытия", а вычислять объём закрытия в процентах - реализовать будет чуть сложнее, но работа с позициями будет гибче. Но это уже выбор топик-стартера.. 

Можно и комментарий только тогда надо анализировать содержимое комментария. Но для данного случая проще проверить стоит ли стоп в без убытке. К тому же некоторые брокеры любят в комментарий вставлять свои комментарии.

Если закрывать в процентах то ни чего сложного половина это 50% или 50/100 = 0.5 и Получается что размер лота который мы должны передать в функцию OrderClose() будет равен

NormalizeDouble(OrderLots()*0.5,2). Соответственно надо еще проверить будет ли рассчитанный объем больше или равен минимально допустимому.

 
Sergey Kolemanov:

Используйте OrderClose(). Объём для закрытия вычисляется так: допустим у Вас открыта позиция 1лот , и Вам надо закрыть половину, значит закрываемый объём лота будет равен 0.5 , его и указываем в OrderClose(). Это "образное" описание алгоритма... 

поможет OrderModify().

Всё это можно оформить одной, отдельной функцией.


Хорошо, как мне тогда это организовать подскажите пожалуйста. Функции что вы назвали, я и так знаю. Как это сделать в коде? Вот что я не понимаю.

То есть у меня уровень закрытия половины лота стоит к примеру на 150пп. Цена подходит к уровню и на тике закрывает половину лота, потом идет проверка котировок снова (ибо цена уже может не быть 150пп) и если цена равна ТПрофиту, то включается OrderModify(). ??? Я правильно понимаю?

Файлы:
Sikle.mq4  9 kb
 
Hugeen20015:

Хорошо, как мне тогда это организовать подскажите пожалуйста. Функции что вы назвали, я и так знаю. Как это сделать в коде? Вот что я не понимаю.

То есть у меня уровень закрытия половины лота стоит к примеру на 150пп. Цена подходит к уровню и на тике закрывает половину лота, потом идет проверка котировок снова (ибо цена уже может не быть 150пп) и если цена равна ТПрофиту, то включается OrderModify(). ??? Я правильно понимаю?


Вычисляете на сколько пунктов цена удалилась от вашей позиции. Если они равно 150 то проделываете все выше описанные действия. Узнать цену открытия позиции поможет функция OrderOpenPrice() текущая цена это Bid или Ask соответственно разница между этими ценами деленная на Point() и будет кол-вом пунктов. При расчетах надо учитывать направление сделки BUY или SELL.

 
Vitalii Ananev:


Вычисляете на сколько пунктов цена удалилась от вашей позиции. Если они равно 150 то проделываете все выше описанные действия. Узнать цену открытия позиции поможет функция OrderOpenPrice() текущая цена это Bid или Ask соответственно разница между этими ценами деленная на Point() и будет кол-вом пунктов. При расчетах надо учитывать направление сделки BUY или SELL.

>=150
 
khorosh:
>=150

Да, точно спасибо за уточнение.

 
Hugeen20015Хорошо, как мне тогда это организовать подскажите пожалуйста. Функции что вы назвали, я и так знаю. Как это сделать в коде? Вот что я не понимаю.
У Вас есть функция подсчета лимитных ордеров OP_BUYLIMIT
Такой же цикл организуйте по OP_BUY и по OP_SELL 
и вместо count++ сделайте анализ выбранного ордера и при необходимости обработку закрытия и модификации СЛ
 
У меня похожая ситуация ....у меня ордер закрывается по стоплоссу , а в точке  закрытия по стопу возникает необходимость вновь открыть точно такой же ордер . Я плачу спред . Зачем ? Можно как то подтянуть стоп  к точке закрытия ордера по стоплоссу и чтобы новый ордер не открывался в точке стоплосса старого , а  старый ордер чтобы  не закрывался в точке стоплосса  , а был чтобы подтянут   стоплосс  текущего ( старого ) ордера ........вообщем белибирда получается , но по  научному не могу объяснить .
Причина обращения: