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

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

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

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

поможет OrderModify().

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

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

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

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

Sergey Kolemanov
1020
Sergey Kolemanov  
Vitalii Ananev:

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

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

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

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

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

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

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

Hugeen20015
84
Hugeen20015  
Sergey Kolemanov:

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

поможет OrderModify().

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


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

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

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

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

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


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

khorosh
12498
khorosh  
Vitalii Ananev:


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

>=150
Vitalii Ananev
11035
Vitalii Ananev  
khorosh:
>=150

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

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