Частичное закрытие ордеров

 

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

В принципе, я вижу это как-то так:

      for (int x = OrdersHistoryTotal() - 1; x >= 0; x--) {
        Print("x = ", x);
        Print("comment = ", OrderComment());
      }
      if (OrderType() == OP_BUY) {
        double vTP = ND(OrderTakeProfit() - OrderOpenPrice());
        double distanceToTP1 = ND(OrderOpenPrice() + vTP * 0.3);
        if (ND(ptrSymbol.getLastTick().bid) > distanceToTP1) {
          Print("ticket = ", OrderTicket());
          ptrTrade.close(ptrSymbol.getName(), OrderTicket(), i_lot/2, OrderType(), 0, -1);
        }
      }
      if (OrderType() == OP_BUY) {
      }

В данном случае, у меня реализовано частичное закрытие лонговой позиции ( 50% исходного лота ) на расстоянии 30% от цены покупки. Когда мы снова попадает в функцию частичного закрытия, перед этим самым закрытием я добавил вышеуказанный цикл:

      for (int x = OrdersHistoryTotal() - 1; x >= 0; x--) {
        Print("x = ", x);
        Print("comment = ", OrderComment());
      }

Здесь я по истории пробегаю и просматриваю комментарии закрытого ордера. Например, вижу:

2021.05.13 22:53:44.766 2019.01.30 08:14:53  supRes EURUSD,H1: comment = from #1

Понимаю, что этот ордер отщепнулся от позиции с тикетом № 1. Здесь всё понятно. Но откуда мне знать, тикет какой позиция остался в рынке? Ведь в рынке может быть не одна позиция. Я к тому веду, что при торговле одной позицией в конкретное время, всё элементарно. А если позиций несколько, это вопрос. Ведь нужно будет, перебираю ордера понять какой объём какой позиции закрывать и закрывать ли вообще что-либо у этой позиции.. т.к., возможно, на определённом уровне уже закрыт лот требуемый и нужно ждать другого уровня или условия, чтобы закрыть ещё часть, но, ни в кое случае, не закрывать ничего до этого момента.

 

Мне попадался этот пост. Но он не решает нужной задачи.

Например, в рынке 5 позиций с тикетами от 1 до 5. Мы закрыли 30% 3-ей позиции. Вместо 3-ей позиции откроется 6-ая, размером 70% от 3-ей. Ведь так? Далее может закрыться любая из изначальных 5-ти позиций, и 6-ая, которая открылась после закрытия 3-ей изначально.

Так вот. Откуда мне знать, в определённый момент времени, когда соблюдаются условия закрытия позиции (например, 6-ой или любой другой), что её необходимо закрыть? Ведь нахождение тикета, который породил очередной ордер задачу не решает.

 
Я смтрю в сторону магиков. Может реально завести итератор, который будет инкременировать к каждому новому ордеру еденичку? Таким образом, будет просто решать вопрос. Пробежался по истории и увидел, что мол закрыто 1, 2, 3 и тд позиции (части ордера исходного), соответсвенно, можно прикинуть сколько раз отщипнулся лот от исходной позиции нужно ли очередной раз это делать. Логично?
 
Viktar Dzemikhau:
Я смтрю в сторону магиков. Может реально завести итератор, который будет инкременировать к каждому новому ордеру еденичку? Таким образом, будет просто решать вопрос. Пробежался по истории и увидел, что мол закрыто 1, 2, 3 и тд позиции (части ордера исходного), соответсвенно, можно прикинуть сколько раз отщипнулся лот от исходной позиции нужно ли очередной раз это делать. Логично?
родной магик не меняется при частичном закрытии - производный ордер будет с родным магиком - с серией ордеров каждому изначальному ордеру нужен отдельный магик чтобы вести этот ордер и глобальная переменная с этим магиком в имени с описанием состояния ордера: 0 - не закрывался, 1 - первое частичное закрытие, 2 - второе частичное закрытие, и присваивать новое значение в глоб переменную во время этого самого частичного закрытия
 
Viktar Dzemikhau:

Здесь я по истории пробегаю и просматриваю комментарии закрытого ордера. Например, вижу:

Понимаю, что этот ордер отщепнулся от позиции с тикетом № 1. Здесь всё понятно. Но откуда мне знать, тикет какой позиция остался в рынке?

Связанные ордера указывают друг на друга. Вот ордер из истории:

Ордер в истории

А вот оставшийся ордер:

Рабочий ордер

Если было несколько частичных закрытий, то по истории счета восстанавливается вся цепочка.

 
Ihor Herasko:

Связанные ордера указывают друг на друга. Вот ордер из истории:

А вот оставшийся ордер:

Если было несколько частичных закрытий, то по истории счета восстанавливается вся цепочка.

то что в четвёрке пишется в коммент тикет родительского ордера это костыль разрабов чтобы было хоть что-то, они сами в этом признались и не рекомендуют всецело полагаться на Ордеркоммент() (не надёжно)

 
Aleksey Semenov:

то что в четвёрке пишется в коммент тикет родительского ордера это костыль разрабов чтобы было хоть что-то, они сами в этом признались и не рекомендуют всецело полагаться на Ордеркоммент() (не надёжно)

В данном случае другого пути нет. По крайней мере, эта информация никогда и нигде не изменяется.

 
Ihor Herasko:

В данном случае другого пути нет. По крайней мере, эта информация никогда и нигде не изменяется.

ага, не меняется, только вот стринг сплитать задолбаешься, а если брокер тебе в конец (sl) допишет или (tp) сразу так весело становится, ух прям, это если совсем не забыть про переписывание коммента маржин колей so%
 
Aleksey Semenov:
ага, не меняется, только вот стринг сплитать задолбаешься, а если брокер тебе в конец (sl) допишет или (tp) сразу так весело становится, ух прям, это если совсем не забыть про переписывание коммента маржин колей so%

В чем проблема найти нужную строку, которая является константой? Функция StringFind работает отлично, разбирать ничего не нужно (StringSplit не нужна в данном случае).

 
Aleksey Semenov:
ага, не меняется, только вот стринг сплитать задолбаешься, а если брокер тебе в конец (sl) допишет или (tp) сразу так весело становится, ух прям, это если совсем не забыть про переписывание коммента маржин колей so%

в целом поддерживаю - частичное закрытие плохо организованно в МТ4, документации о поведении нет

делал когда то запоминание тикетов ордеров перед закрытием, затем частичное закрытие и поиск новых появившихся тикетов по своему магику, тож сказали решение так себе - то связь пропадет, то эксперт зависнет )))

ЗЫ: из практики - не видел брокеров которые поместят в историю ордеров частично закрытый ордер с другим комментарием, всегда пишут каким тикетом было частичное закрытие