Закрытие заказов OrderClose() одного типа (BUY или SELL)

 
Приветствую.

Есть задача - закрыть все ордера на BUY (или на SELL) на определенной валюте. Прохожу по всем ордерам, из них нахожу Sumbol() == OrderSymbol() нужную валюту и OrderType() тип OP_BUY или SELL, выбираю ордер OrderSelect() и через OrderClose() закрываю.

Проблема в том, что не всегда все заказы одного типа (BUY или SELL) закрываются, иногда остаются открытыми.
В чём может быть дело?
 
Дело может быть в цене закрытия.
Пока один ордер закрывается цена может измениться, поэтому сервер отказывает в исполнении.
Для качественного закрытия необходимо внимательно анализировать ситуацию.
 
Может, у Вас цикл обхода ордеров от нуля до TotalTrades?
 
Код такой:

// закрыть все Buy-ордера по данной валюте int closeBuySymbolOrders(double lots) { int _OrdersTotal = OrdersTotal(), err = 0, ret_count = 0, ticket; for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { err = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", err, "; mess: " , ErrorDescription(err)); continue; } if ( OrderSymbol() == Symbol() ) { if (OrderType() == OP_BUY) { ticket = OrderTicket(); if (OrderClose(ticket,lots,Ask,3,Red)) Print( "OrderClose(OP_BUY) #", ticket); else PrintErrMessage("OrderClose() error "); ret_count += 1; } } } return (ret_count); } // закрыть все Sell-ордера по данной валюте int closeSellSymbolOrders(double lots) { int _OrdersTotal = OrdersTotal(), err = 0, ret_count = 0, ticket; for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { err = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", err, "; mess: " , ErrorDescription(err)); continue; } if ( OrderSymbol() == Symbol() ) { if (OrderType() == OP_SELL) { ticket = OrderTicket(); if (OrderClose(ticket,lots,Bid,Red)) Print( "OrderClose(OP_SELL) #", ticket); else PrintErrMessage("OrderClose() error "); ret_count += 1; } } } return (ret_count); }


Он не всегда закрывает ордера нужного типа.
 
Че гадать, вставь распринтовку и сразу все станет ясно.

ЗЫ. Я бы все-таки рекомендовал закрытвать прождажи по Ask, а покупки по Bid. Но не наставиваю, автору видней .
ЗЗЫ. заодно можно подумать на кой хер в эти функции передается параметр
double lots

ЗЗЗЫ На самом деле вопросов больше к автору, а не к коду.
 
chv:
Проблема в том, что не всегда все заказы одного типа (BUY или SELL) закрываются, иногда остаются открытыми.
Правильно ли я понимаю? Были случаи, когда ордера закрывались?
 
Да, иногда OrderClose в журнале был, они закрывались.

Я переделал код на:
RefreshRates(); if (OrderClose(ticket,lots,Ask,3,Red)) Print( "OrderClose(OP_BUY) #", ticket); else { //err = GetLastError(); //if (err == 135) // цена изменилась // RefreshRates(); PrintErrMessage("OrderClose() error "); }

т.е. поставил вызов RefreshRates() до закрытия, может быть дело в этом.

2. И второй вопрос по поводу фразы "Я бы все-таки рекомендовал закрытвать прождажи по Ask, а покупки по Bid. Но не наставиваю" - это верно?
Мне кажется, всё нужно закрывать по Ask, и BUY и SELL, это же последняя известная цена продажи. Или я не прав?

3. По поводу передачи параметра lots - он же используется в вызове:
OrderClose(ticket,[b]lots[/b],Ask,3,Red)

Как я могу закрыть ордер без этого параметра, или можно закрыть весь ордер без передачи lots?
 
Как я могу закрыть ордер без этого параметра, или можно закрыть весь ордер без передачи lots?
Да, есть OrderLots().
 
Мне кажется, всё нужно закрывать по Ask, и BUY и SELL, это же последняя известная цена продажи. Или я не прав?
Не прав.
Для правильного понимания легче всего ориентироваться на такое правило:
Все ордера всегда открываются и закрываются по худшему для трейдера курсу.

Возьмём для примера BUY.
Он открывается по Ask и закрывается по Bid. В момент открытия доход по ордеру сразу же начинает считаться от Bid и равен спреду со знаком минус. И только если цена пойдёт в нужную сторону, когда цена по Bid сравняется с курсом открытия ордера, прибыль по ордеру будет равна 0.

Это же требование справедливо и для отложенных ордеров.
Для открытия BuyLimit и BuyStop необходимо касание Ask-ом заявленного курса отл. ордера.

То же касается и StopLoss и TakeProfit ордеров. Для BUY необходимо достижение этих цен Bid-ом

Для ордеров SELL применяются зеркальные требования.
----------

В приведенном коде всё написано наоборот. Поэтому удивительно, что программа вообще что-либо закрывала.
Видимо, это происходило в тех редких случаях, когда за время, пока приказ доходит до сервера, цена меняется настолько, что укладывается в slippage, в представленном коде это 3.
 
Спасибо.

Тогда, на ваш взгляд, такой вариант лучше?

Для SELL:
if (OrderType() == OP_SELL) { ticket = OrderTicket(); RefreshRates(); if (OrderClose(ticket,lots,Ask,30,Red)) Print( "OrderClose(OP_SELL) #", ticket); else { PrintErrMessage("OrderClose() error "); } ret_count += 1; }


и для BUY:
if (OrderType() == OP_BUY) { ticket = OrderTicket(); RefreshRates(); if (OrderClose(ticket,lots,Bid,30,Red)) Print( "OrderClose(OP_BUY) #", ticket); else { PrintErrMessage("OrderClose() error "); } ret_count += 1; }
 
Так правильней, конечно.

В остальном - смотря к чему стремиться.
Например, я бы не ставил слип 30.
Кроме того, если дилер настойчиво не закрывает, то можно подогнать поближе Стоп и Профит, в расчёте на то, что приказы на модификацию (на большинстве ДЦ) исполняются автоматически и при достижении Стопа или Профита ордер автоматически закроется.

В общем, смотря..
"- Вы, наверное, хорошо стреляете?
- Подходяще, - ответил Азазелло.
- А на сколько шагов? - задала Маргарита Азазелло не совсем ясный вопрос.
- Во что, смотря по тому, - резонно ответил Азазелло" (М.Булгаков)
Причина обращения: