- : pending order # cannot be closed
- Советники: VR---Overturn
- Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6.
Я наивно полагал, что если при закрытии ордера мы получаем реквот, то OrderClose нам вернет false и GetLastError() мне скажет что-то вроде ERR_PRICE_CHANGED . Ан нет. OrderClose() возвращает true и советник считает, что ордер закрыт, и радостно об этом сообщает, а ордер продолжает болтаться. Подскажите, пожалуйста, как это побороть?
Ищите ошибки в своем коде.
for (int i = 0; i < TryCount; i++) { if (!OrderClose(ATicket,OrderLots(),ClosePrise,5, Green)) { int EC = GetLastError(); Print("Не могу закрыть ордер по паре "+Symbol()+", причина: "+ErrorDescription(EC)); RefreshRates(); switch(OrderType()) { case OP_BUY : ClosePrise = Bid; break; case OP_SELL : ClosePrise = Ask; break; } Profit = OrderProfit(); } else { ClosedProfit += Profit; return; } }
Доктор, что я делаю не так?
Я пока костылик придумал с глобальной переменной, но есть мнение, что это криво.
вот так делайте 'Полезные функции от KimIV'
Там вроде открытие, а мне закрытие нужно. В любом случае спасибо всем, кто откликнулся.
З.ы.: Кстати, так писать функции, как на страничке, указанной Вами, нельзя. Я имею ввиду явное указание названия инструмента в строке. Я уже на эти грабли наступил, есть ДЦ, в котором пары называются не GBPUSD, а GBPUSDXFX. Зачем это сделано, я без понятия, может как раз для борьбы с кривыми роботами.
Edit: Просмотрел почти всю ветку, нашел и функции закрытия. От моих не отличаются ничем, разве что вот это:
if (ErrorCode==ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000);
к себе утянул. Но я очень осторожно отношусь к циклам типа while, очень много в них подводных камней, можно влегкую зацикливание получить.
Выбран ли у Вас ордер с помощью OrderSelect(...)?
Если выбран то тот ли который нужен?
Да, естественно. Похоже, я где-то на ходу пофиксил этот глюк, потому что уже давно не вижу его. Сейчас, в окончательном виде, функция закрытия ордера выглядит следующим образом:
void Orders.CloseTicket(int ATicket) { double ClosePrice = 0; int ErrorCode = 0; if (OrderSelect(ATicket, SELECT_BY_TICKET, MODE_TRADES)) { RefreshRates(); switch(OrderType()) { case OP_BUY : ClosePrice = NormalizeDouble(Bid, Digits); break; case OP_SELL : ClosePrice = NormalizeDouble(Ask, Digits); break; } double Profit = OrderProfit(); for (int i = 0; i < TryCount; i++) { if (!OrderClose(ATicket,OrderLots(),ClosePrice,5, Green)) { ErrorCode = GetLastError(); Print("Не могу закрыть ордер по паре "+Symbol()+", причина: "+Orders.ErrorDescription(ErrorCode)); if (ErrorCode==ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000); RefreshRates(); switch(OrderType()) { case OP_BUY : ClosePrice = NormalizeDouble(Bid, Digits); break; case OP_SELL : ClosePrice = NormalizeDouble(Ask, Digits); break; } Profit = OrderProfit(); } else { ClosedProfit += Profit; return; } } } else { ErrorCode = GetLastError(); Print("Ордер "+DoubleToStr(ATicket,0)+" не найден. Ошибка: "+Orders.ErrorDescription(ErrorCode)); } }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования