Закрываем все ордера по одной цене

 

Есть несколько ордеров в обе стороны. Надо закрыть все ордера по одинаковой цене.

делаю так:

for ( z=OrdersTotal()-1; z>=0; z--){
if(OrderSelect(z, SELECT_BY_POS, MODE_TRADES)){
if (OrderType() == OP_BUY) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5);
if (OrderType() == OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5);
}}

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

Как правильно сформировать условие, чтобы все ордера закрылись по одной цене при достижении суммарного профита по всем ордерам больше 0?

 

Может быть Вам поможет функция OrderCloseBy ?

 

А их и не надо закрывать по одной цене, т.к. селовские и баевские ордера в один момент времени всегда закроются по разной цене из-за спреда.

Варианты решения:

  1. При переваливании суммарного профита выше 0, закрываем баи по биду, а селы по аску на тот момент... Цена закрытия естественно будет разная.
  2. Можно воспользоваться функцией OrderCloseBy, как писал выше KimIV.
 

Разнонаправленные ордера всегда взаимогасятся в объёме совпадающей стоимости и от цены закрытия это не зависит.

Например, у Вас есть Sell 5 лотов и Buy 3 лота.

1. Можно сразу встречно закрыть в объёме 3 лота, оставить только Sell 2 лота и ждать когда он достигнет нужной цены.

2. Можно ничего не закрывать и ждать когда Sell достигнет цены. А когда достигнет, то встречно закрыть 3 лота и отдельно остаток 2 лота.

Определяющим моментом и в 1 и во 2 случае является цена закрытия Sell 2 лота. А встречное закрытие на 3 лота можно выполнить при любой цене, это не повлияет на конечный результат.

Поэтому последовательность закрытия должна быть такая: сначала закрыть ордера в той части, что не совпадает (здесь-2 лота).

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

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

Причина обращения: