Частичная фиксация прибыли

 

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

      for(int i7=OrdersTotal()-1; i7>=0; i7--) {
         if(!OrderSelect(i7,SELECT_BY_POS,MODE_TRADES)) continue;
            if(OrderSymbol()!=Symbol()) continue;
               if(OrderMagicNumber()==Magic) {
                  if(OrderType()==OP_BUY) {
                     if(Bid-OrderOpenPrice()>LVL1fiks*Point && OrderLots()==NormalizeDouble(lot,2) && LVL1fiks!=0) {
                        ticket=OrderClose(OrderTicket(),LOT1fiks,NormalizeDouble(Bid,Digits),Slippage,Yellow);
                              }
                     if(Bid-OrderOpenPrice()>LVL2fiks*Point && OrderLots()==NormalizeDouble(lot-LOT1fiks,2) && LVL2fiks!=0) {
                        ticket=OrderClose(OrderTicket(),LOT2fiks,NormalizeDouble(Bid,Digits),Slippage,Yellow);
                              }
                     if(Bid-OrderOpenPrice()>LVL3fiks*Point && OrderLots()==NormalizeDouble(lot-LOT1fiks-LOT2fiks,2) && LVL3fiks!=0) {
                        ticket=OrderClose(OrderTicket(),LOT3fiks,NormalizeDouble(Bid,Digits),Slippage,Yellow);
                              }
                     if(Bid-OrderOpenPrice()>LVL4fiks*Point && OrderLots()==NormalizeDouble(lot-LOT1fiks-LOT2fiks-LOT3fiks,2) && LVL4fiks!=0) {
                        ticket=OrderClose(OrderTicket(),LOT4fiks,NormalizeDouble(Bid,Digits),Slippage,Yellow);
                              }
                                 }
                                    }
                                       }

где LVL1fiks - первый уровень на котором фиксируется часть лотов, LOT1fiks - количество лотов для закрытия. Как видите здесь упор идет на цену и на остаток лотов, после закрытия части. На что можно сделать еще упор, чтобы код получился более универсальным. Понятно что можно поставить счетчик при открытии сделки его обнулять и прибавлять единицу при каждой фиксации, но это слишком усложняет задачу для нескольких ордеров, получится что нужно вести счетчик для каждой открытой позиции, что очень не удобно. Очень надеюсь на вашу помощь.

 
Lenar Shajdullin:

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

где LVL1fiks - первый уровень на котором фиксируется часть лотов, LOT1fiks - количество лотов для закрытия. Как видите здесь упор идет на цену и на остаток лотов, после закрытия части. На что можно сделать еще упор, чтобы код получился более универсальным. Понятно что можно поставить счетчик при открытии сделки его обнулять и прибавлять единицу при каждой фиксации, но это слишком усложняет задачу для нескольких ордеров, получится что нужно вести счетчик для каждой открытой позиции, что очень не удобно. Очень надеюсь на вашу помощь.

при открытии ордера расставляешь лимитки на уровнях фиксации прибыли. При их сработке, закрываешь через CloseBy. При закрытии "главного" удаляешь несработавшие лимитки.

 
Maxim Kuznetsov:

при открытии ордера расставляешь лимитки на уровнях фиксации прибыли. При их сработке, закрываешь через CloseBy. При закрытии "главного" удаляешь несработавшие лимитки.


А как же спрэд? Если будет лимит ордер открыт, это получается потеря спреда. И все равно если будет открыто хотя бы 5-10 ордеров будет путаница похуже, чем если через оставшуюся часть лотов закрывать.
 
Lenar Shajdullin:

А как же спрэд? Если будет лимит ордер открыт, это получается потеря спреда.
когда закрытие через CloseBy, то всё нормально - спред дважды не отжирается.
 

На мой взгляд, установка отложенных ордеров для частичного закрытия - это лишние телодвижения. Хотя, они, конечно, помогут в том случае, если пропала связь с сервером. С другой стороны, не все брокеры дают возможность встречного закрытия (работаю с таким). Так что решение не универсальное.

Чтобы не использовать лишние ордера, производя закрытие по рынку, достаточно пройтись по истории счета и найти самый первый родительский ордер. А от него уже посчитать, сколько закрытий и на каких уровнях было. Код выйдет не совсем простой, но зато универсальный (можно будет применять для любого брокера).

 
Maxim Kuznetsov:
когда закрытие через CloseBy, то всё нормально - спред дважды не отжирается.
А как с проблемой нескольких открытых ордеров справиться. Скажем открыто 3 ордера, сработал лимит ордер, первый ладно, можно закрыть самую первую сделку, а потом сработало еще 2 лимит ордера, один от первой сделки, а второй от второй. Как их разобрать?
 
Ihor Herasko:

На мой взгляд, установка отложенных ордеров для частичного закрытия - это лишние телодвижения. Хотя, они, конечно, помогут в том случае, если пропала связь с сервером. С другой стороны, не все брокеры дают возможность встречного закрытия (работаю с таким). Так что решение не универсальное.

Чтобы не использовать лишние ордера, производя закрытие по рынку, достаточно пройтись по истории счета и найти самый первый родительский ордер. А от него уже посчитать, сколько закрытий и на каких уровнях было. Код выйдет не совсем простой, но зато универсальный (можно будет применять для любого брокера).


Тоже не подходит, в историю перемещаются только закрытые ордера и их номер всегда разный, к сожалению(а так идея была бы хорошей), а если открыто 4 ордера. У одного например сработало 2 фиксации, у вторго одна, как разобраться с третьим и четвертым?

 
Lenar Shajdullin:


Тоже не подходит, в историю перемещаются только закрытые ордера и их номер всегда разный, к сожалению(а так идея была бы хорошей), а если открыто 4 ордера. У одного например сработало 2 фиксации, у вторго одна, как разобраться с третьим и четвертым?


а какая разница сколько фиксаций? ведь первичен профит в пипсах?

в вашем коде, я бы сделал, сравнение наоборот от большей прибыли к меньшей, и вместо if поставил бы else if

 
Ihor Herasko:

На мой взгляд, установка отложенных ордеров для частичного закрытия - это лишние телодвижения. Хотя, они, конечно, помогут в том случае, если пропала связь с сервером. С другой стороны, не все брокеры дают возможность встречного закрытия (работаю с таким). Так что решение не универсальное.

Чтобы не использовать лишние ордера, производя закрытие по рынку, достаточно пройтись по истории счета и найти самый первый родительский ордер. А от него уже посчитать, сколько закрытий и на каких уровнях было. Код выйдет не совсем простой, но зато универсальный (можно будет применять для любого брокера).

вообще-то полностью "универсальное" решение - вертеть свою библиотеку :-) С отдельным классом MyOrder и методами для установки/изменения целей и прочими вкусняшками. Инстансы объектов можно восстанавливать и синхронизировать от серверных тикетов и их коментов.  А конкретный способ как отработать фиксацию прибыли - как ни странно дело десятое.

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

 
Lenar Shajdullin:


Тоже не подходит, в историю перемещаются только закрытые ордера и их номер всегда разный, к сожалению(а так идея была бы хорошей), а если открыто 4 ордера. У одного например сработало 2 фиксации, у вторго одна, как разобраться с третьим и четвертым?


Почему не подходит? У каждого дочернего ордера в комменте указание, от какого ордера он унаследован. Вот простой пример. Список рабочих ордеров:

Список истории счета:


Как это было получено:

  1. Открыл ордер sell 1.5 (#394552284) и sell 1.2 (#394552364).
  2. Закрыл частично ордер #394552284 на 0.25 лота. В результате появился ордер #394552432 с объемом 1.25 лота и указанием в комментарии "from #394552284". Соответственно, у закрытой части в истории комментарий "to #394552432".
  3. Закрыл частично ордер #394552364 на 0.2 лота. Появился ордер #394552517 с объемом 1.0 лот и указанием в комментарии "from #394552364". Соответственно, у закрытой части объемом 0.2 в комментарии указание "to #394552517".
  4. Закрыл частично ордер #394552432 на 0.1 лота. В результате появился ордер #394552596 с объемом 1.15 лота и указанием в комментарии "from #394552432". Соответственно, у закрытой части в истории комментарий "to #394552596".
И все это разбирается. Все равно, сколько ордеров: 1, 2, 5 или 100. Однозначное соответствие установить можно на 100%.

 
Maxim Kuznetsov:

вообще-то полностью "универсальное" решение - вертеть свою библиотеку :-) С отдельным классом MyOrder и методами для установки/изменения целей и прочими вкусняшками. Инстансы объектов можно восстанавливать и синхронизировать от серверных тикетов и их коментов.  А конкретный способ как отработать фиксацию прибыли - как ни странно дело десятое.

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


Да, я же говорю - удобнее, но не универсальнее, т. к. у каждого брокера свои правила. Правил, запрещающих частичное закрытие, еще не видел. А потому исходил из описанного метода.