Реквоты и как с ними бороться

 
Я наивно полагал, что если при закрытии ордера мы получаем реквот, то OrderClose нам вернет false и GetLastError() мне скажет что-то вроде ERR_PRICE_CHANGED . Ан нет. OrderClose() возвращает true и советник считает, что ордер закрыт, и радостно об этом сообщает, а ордер продолжает болтаться. Подскажите, пожалуйста, как это побороть?
 
Отслеживать закрытие ордера программно, например по OrderCloseTime().
 
KaBoom писал(а) >>
Я наивно полагал, что если при закрытии ордера мы получаем реквот, то OrderClose нам вернет false и GetLastError() мне скажет что-то вроде ERR_PRICE_CHANGED . Ан нет. OrderClose() возвращает true и советник считает, что ордер закрыт, и радостно об этом сообщает, а ордер продолжает болтаться. Подскажите, пожалуйста, как это побороть?

Ищите ошибки в своем коде.

 
Integer >>:

Ищите ошибки в своем коде.

        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'

 
KaBoom писал(а) >>

Доктор, что я делаю не так?

Я пока костылик придумал с глобальной переменной, но есть мнение, что это криво.

Не вижу ошибок, разве что не совсем уверен, что в ClosePrise будет точная цена закрытия ордера. Но все же никогда не замечал, ошибок возврата OrderClose().

 
Prival >>:

вот так делайте 'Полезные функции от KimIV'

Там вроде открытие, а мне закрытие нужно. В любом случае спасибо всем, кто откликнулся.


З.ы.: Кстати, так писать функции, как на страничке, указанной Вами, нельзя. Я имею ввиду явное указание названия инструмента в строке. Я уже на эти грабли наступил, есть ДЦ, в котором пары называются не GBPUSD, а GBPUSDXFX. Зачем это сделано, я без понятия, может как раз для борьбы с кривыми роботами.



Edit: Просмотрел почти всю ветку, нашел и функции закрытия. От моих не отличаются ничем, разве что вот это:

if (ErrorCode==ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000);

к себе утянул. Но я очень осторожно отношусь к циклам типа while, очень много в них подводных камней, можно влегкую зацикливание получить.

 
KaBoom >>:


Доктор, что я делаю не так?


Я пока костылик придумал с глобальной переменной, но есть мнение, что это криво.

А в переменной ATicket как значение получается ? Может там проблемка ?

 
KaBoom >>:

... что я делаю не так?

Выбран ли у Вас ордер с помощью OrderSelect(...)?

Если выбран то тот ли который нужен?

 
goldtrader >>:

Выбран ли у Вас ордер с помощью 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));
     }
}
Причина обращения: