Дело может быть в цене закрытия.
Пока один ордер закрывается цена может измениться, поэтому сервер отказывает в исполнении.
Для качественного закрытия необходимо внимательно анализировать ситуацию.
Пока один ордер закрывается цена может измениться, поэтому сервер отказывает в исполнении.
Для качественного закрытия необходимо внимательно анализировать ситуацию.
Может, у Вас цикл обхода ордеров от нуля до 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. Но не наставиваю, автору видней .
ЗЗЫ. заодно можно подумать на кой хер в эти функции передается параметр
ЗЗЗЫ На самом деле вопросов больше к автору, а не к коду.
ЗЫ. Я бы все-таки рекомендовал закрытвать прождажи по Ask, а покупки по Bid. Но не наставиваю, автору видней .
ЗЗЫ. заодно можно подумать на кой хер в эти функции передается параметр
double lots
ЗЗЗЫ На самом деле вопросов больше к автору, а не к коду.
chv:
Проблема в том, что не всегда все заказы одного типа (BUY или SELL) закрываются, иногда остаются открытыми.
Правильно ли я понимаю? Были случаи, когда ордера закрывались?
Проблема в том, что не всегда все заказы одного типа (BUY или SELL) закрываются, иногда остаются открытыми.
Да, иногда OrderClose в журнале был, они закрывались.
Я переделал код на:
т.е. поставил вызов RefreshRates() до закрытия, может быть дело в этом.
2. И второй вопрос по поводу фразы "Я бы все-таки рекомендовал закрытвать прождажи по Ask, а покупки по Bid. Но не наставиваю" - это верно?
Мне кажется, всё нужно закрывать по Ask, и BUY и SELL, это же последняя известная цена продажи. Или я не прав?
3. По поводу передачи параметра lots - он же используется в вызове:
Как я могу закрыть ордер без этого параметра, или можно закрыть весь ордер без передачи lots?
Я переделал код на:
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?
Мне кажется, всё нужно закрывать по Ask, и BUY и SELL, это же последняя известная цена продажи. Или я не прав?
Не прав.Для правильного понимания легче всего ориентироваться на такое правило:
Все ордера всегда открываются и закрываются по худшему для трейдера курсу.
Возьмём для примера BUY.
Он открывается по Ask и закрывается по Bid. В момент открытия доход по ордеру сразу же начинает считаться от Bid и равен спреду со знаком минус. И только если цена пойдёт в нужную сторону, когда цена по Bid сравняется с курсом открытия ордера, прибыль по ордеру будет равна 0.
Это же требование справедливо и для отложенных ордеров.
Для открытия BuyLimit и BuyStop необходимо касание Ask-ом заявленного курса отл. ордера.
То же касается и StopLoss и TakeProfit ордеров. Для BUY необходимо достижение этих цен Bid-ом
Для ордеров SELL применяются зеркальные требования.
----------
В приведенном коде всё написано наоборот. Поэтому удивительно, что программа вообще что-либо закрывала.
Видимо, это происходило в тех редких случаях, когда за время, пока приказ доходит до сервера, цена меняется настолько, что укладывается в slippage, в представленном коде это 3.
Спасибо.
Тогда, на ваш взгляд, такой вариант лучше?
Для SELL:
и для BUY:
Тогда, на ваш взгляд, такой вариант лучше?
Для 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.
Кроме того, если дилер настойчиво не закрывает, то можно подогнать поближе Стоп и Профит, в расчёте на то, что приказы на модификацию (на большинстве ДЦ) исполняются автоматически и при достижении Стопа или Профита ордер автоматически закроется.
В общем, смотря..
"- Вы, наверное, хорошо стреляете?
- Подходяще, - ответил Азазелло.
- А на сколько шагов? - задала Маргарита Азазелло не совсем ясный вопрос.
- Во что, смотря по тому, - резонно ответил Азазелло" (М.Булгаков)
В остальном - смотря к чему стремиться.
Например, я бы не ставил слип 30.
Кроме того, если дилер настойчиво не закрывает, то можно подогнать поближе Стоп и Профит, в расчёте на то, что приказы на модификацию (на большинстве ДЦ) исполняются автоматически и при достижении Стопа или Профита ордер автоматически закроется.
В общем, смотря..
"- Вы, наверное, хорошо стреляете?
- Подходяще, - ответил Азазелло.
- А на сколько шагов? - задала Маргарита Азазелло не совсем ясный вопрос.
- Во что, смотря по тому, - резонно ответил Азазелло" (М.Булгаков)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Есть задача - закрыть все ордера на BUY (или на SELL) на определенной валюте. Прохожу по всем ордерам, из них нахожу Sumbol() == OrderSymbol() нужную валюту и OrderType() тип OP_BUY или SELL, выбираю ордер OrderSelect() и через OrderClose() закрываю.
Проблема в том, что не всегда все заказы одного типа (BUY или SELL) закрываются, иногда остаются открытыми.
В чём может быть дело?