Как закрыть два противоположных ордера по тейку и стопу одновременно?

 

Как закрыть два противоположных ордера по тейку и стопу одновременно?

Например, есть два противоположных ордера

sell 0.1

buy 0.2

на уровне безубытка (при одновременно закрытии этих ордеров стоит "стоп" для sell и "тейк" для buy.

Насколько я знаю из учебника (https://book.mql4.com/ru/trading/orderclose), чтобы скриптом закрыть два ордера за счет другого, надо использовать функцию :
bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NONE)

Каким образом ее использовать, чтобы ордера закрывались за 1-3 pip до наступления тейка и стопа? Т.е. закрывались без просадки.

В учебнике написано, что "Функция закрывает один рыночный ордер другим рыночным ордером, открытым по тому же финансовому инструменту, но в противоположном направлении".

Таким образом обеспечивается отсутствие просадок. Или я что-то не так понимаю?

 

вся фича данного метода в том, что вы при взаимном закрытиии экономите один спред, не важно как вы вы закрываете ордер - спред с вас все равно берут, при закрытии, таким образом получается при отдельном открытии\закрытии 2 ордеров вы платите 4 спреда ( 2 на открытие и 2 на закрытие) при встречном закрытии 3 спреда ( 2 на открытие и 1 на закрытие)

 
religare писал(а) >>

Как закрыть два противоположных ордера по тейку и стопу одновременно?

Например, есть два противоположных ордера

sell 0.1

buy 0.2

на уровне безубытка (при одновременно закрытии этих ордеров стоит "стоп" для sell и "тейк" для buy.

Насколько я знаю из учебника (https://book.mql4.com/ru/trading/orderclose), чтобы скриптом закрыть два ордера за счет другого, надо использовать функцию :
bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NONE)

Каким образом ее использовать, чтобы ордера закрывались за 1-3 pip до наступления тейка и стопа? Т.е. закрывались без просадки.

В учебнике написано, что "Функция закрывает один рыночный ордер другим рыночным ордером, открытым по тому же финансовому инструменту, но в противоположном направлении".

Таким образом обеспечивается отсутствие просадок. Или я что-то не так понимаю?

Прежде, чем Вы сможете воспользоваться функцией OrderCloseBy, Вам необходимо сбалансировать суммарную позицию. Т.е. в вашем примере продать 0.1 лота на нужном Вам уровне.

Но я не совсем понимаю логику Ваших действий. "Тейк" для buy всегда находится выше текущей цены, а баланс позиции говорит о том, что чем выше цена - тем больше Ваш профит. И при этом Вы хотите закрываться до этой цены, т.е ниже, с меньшим профитом. Что-то не стыкуется.

 
religare писал(а) >> Как закрыть два противоположных ордера по тейку и стопу одновременно?

Одновременно не получится, так как у брокера существует очередь из ордеров - сначала закроют один ордер, потом другой. Всё по очереди. И при этом учитывайте проскальзывание в обоих случаях.

 

Что-то здесь нестыкуется. Сначала:

religare писал(а) >>

Как закрыть два противоположных ордера по тейку и стопу одновременно?

Затем:

скриптом закрыть два ордера за счет другого

Это две разных задачи.

Для первой: Стоп для Sell нужно поставить на спрэд выше профита Buy. В этом случае закрытие по стопу и профиту произойдет одновременно. Даже если будет проскальзывание, то цены закрытия все равно будут отличаться на спрэд. В ином случае вы имеете полное право "сделать удивленные глаза" перед ДЦ.

Для второй: OrderCloseBuy закроет вам только 0.1 Sell и 0.1 Buy. Оставшиеся 0.1 Buy придется закрывать отдельно. Поэтому сначала разумнее закрыть 0.1 Buy, который дает перекос, а затем (хоть через сутки! - правда, там еще своп набежит) оставшиеся две одинаковые по объему позы.

 

Проблемы нет, в том, чтобы закрыть два противоположных ордера с профитом, можно легко по формуле расчитать на каком уровне должно быть закрытие ордеров:

Если больший ордер Buy:


TPb=NR(sl-SPR*Point); //для buy


sl=NR(slev+(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)+ProfitPips*Point); //для sell


Если больший ордер Sell:

TPs=NR(sl+SPR*Point); //для sell


sl=NR(slev-(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)-ProfitPips*Point); //для buy

Вопрос в другом: как использовать функцию OrderCloseBuy, чтобы не было просадок до наступления тейка (большего ордера) и стопа (меньшего ордера). Т.е. ордера должны взимно закрыться без просадок за 1-3 pip до достижения ценой уровня тейка и стопа.

Пример:

спрэд - 7 Pip

профит - 10 Pip



buy

Цена открытия: 190,35

0,2 лота


sell

цена открытия: 190,15

0,1 лот


уровень стопа для sell:

sl=NR(lev+(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)+ProfitPips*Point+SPR*Point);

190,35+(190,35-190,15+2*0,07)/(0,2/0,1-1)+0,10+0,07=190,79

уровень тейка для buy

190,79+0,07=190,86

Итого, при достижении ценой этого уровня, ордера buy и sell закроются с профитом 10 pip х 0,2 лота.

Но на графике будет просадка, потому что закроется вначале sell (если он был открыт первым), а потом buy.

Чтобы не было просадки, нужно до достижения ценой этого уровня, например 190,76/190,84 закрыть оба этих ордера
с помощью функции OrderCloseBuy, дабы на графике не было никаких просадок. Ведь по сути их нет и возникают только по причине неодновременного закрытия ордеров.

С уважением,

Александр
.

 
religare писал(а) >>

Проблемы нет, в том, чтобы закрыть два противоположных ордера с профитом, можно легко по формуле расчитать на каком уровне должно быть закрытие ордеров:

Если больший ордер Buy:


TPb=NR(sl-SPR*Point); //для buy

sl=NR(slev+(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)+ProfitPips*Point); //для sell

Если больший ордер Sell:

TPs=NR(sl+SPR*Point); //для sell

sl=NR(slev-(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)-ProfitPips*Point); //для buy

Вопрос в другом: как использовать функцию OrderCloseBuy, чтобы не было просадок до наступления тейка (большего ордера) и стопа (меньшего ордера). Т.е. ордера должны взимно закрыться без просадок за 1-3 pip до достижения ценой уровня тейка и стопа.

Пример:

спрэд - 7 Pip

профит - 10 Pip


buy

Цена открытия: 190,35

0,2 лота

sell

цена открытия: 190,15

0,1 лот


уровень стопа для sell:

sl=NR(lev+(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)+ProfitPips*Point+SPR*Point);

190,35+(190,35-190,15+2*0,07)/(0,2/0,1-1)+0,10+0,07=190,79

уровень тейка для buy

190,79+0,07=190,86

Итого, при достижении ценой этого уровня, ордера buy и sell закроются с профитом 10 pip х 0,2 лота.

Но на графике будет просадка, потому что закроется вначале sell (если он был открыт первым), а потом buy.

Чтобы не было просадки, нужно до достижения ценой этого уровня, например 190,76/190,84 закрыть оба этих ордера
с помощью функции OrderCloseBuy, дабы на графике не было никаких просадок. Ведь по сути их нет и возникают только по причине неодновременного закрытия ордеров.

С уважением,

Александр
.

Прежде, чем Вы сможете воспользоваться функцией OrderCloseBy, Вам необходимо сбалансировать суммарную позицию. Т.е. в вашем примере продать 0.1 лота на этом уровне. А дальше пользуйтесь функцией OrderCloseBy два раза.

 

По сути высказывания: как продать 0.1 лот на этом уровне, если у меня ордер buy равен 0.2 лота. Функция OrderCloseBy не может использоваться два раза, она одновременно закрывает один лот за счет другого. Может я не совсем понимаю механизм. Покажите, как это выглядет в коде на примере этих ордеров?


 
religare >>:

уровень стопа для sell:

sl=NR(lev+(MathAbs(lev-slev)+2*SPR*Point)/(LotS/LotO-1)+ProfitPips*Point+SPR*Point);

190,35+(190,35-190,15+2*0,07)/(0,2/0,1-1)+0,10+0,07=190,79

уровень тейка для buy

190,79+0,07=190,86

Вот ваша ошибка, на которую я вам уже указывал. У вас тейк для Buy выше, чем стоп для селл. В результате, ваш sell закрывается тогда, когда Bid составляет 190.72, то есть на 14 пунктов раньше, чем закроется Buy по профиту. Поэтому вам нужно не прибавлять спрэд к цене стопа, а отнимать.

Таким образом, тейк для Buy должен составить 190.72. В этом случае вы получаете одновременное закрытие позиций. И тут неважно, какая из них была первой.

 
religare писал(а) >>

По сути высказывания: как продать 0.1 лот на этом уровне, если у меня ордер buy равен 0.2 лота. Функция OrderCloseBy не может использоваться два раза, она одновременно закрывает один лот за счет другого. Может я не совсем понимаю механизм. Покажите, как это выглядет в коде на примере этих ордеров?

Именно два раза, поскольку эта функция может закрыть только равные по величине, но противоположные позиции. Во время частичного закрытия первым ордером больший лот разбивается на два: равный встречному и остальная часть. Поэтому прийдется закрывать второй раз вторым ордером. Но при этом учтите, что оставшаяся часть, перенесена в новый ордер со своим тикетом.