как боротся с ошибкой 138 неверные цены

 
Парни кто с талкивался с подобной ошибкой ? на демо она вылазиет не так часто, на реале намного чаще, как обойти эту проблему? брокер с 5 знаками!
 
int err = GetLastError();
if(err == 138){
Sleep(1000);
RefreshRates();
}
 
а толку то он купить всеравно не может, мне нужно что бы он покупал а он не хочет, точнее через раз покупает
 
ERR_REQUOTE 138 Новые цены


Обычно возникает на быстрых рынках

 

ага так оно и есть, вот я испрашиваю как сделать что бы он все равно пытался сделать ордер пока не сделает ?

 
Pyxlik2009:

ага так оно и есть, вот я испрашиваю как сделать что бы он все равно пытался сделать ордер пока не сделает ?

пусть тупо долбится пока не вернется тикет больше 0
 

вообще может пригодится :)

//---------- Копировать -----------------//

//+------------------------------------------------------------------+
double iif( bool condition, double ifTrue, double ifFalse )
{
if( condition ) return( ifTrue );

return( ifFalse );
}

//+------------------------------------------------------------------+
int orderDirection(int type, int revers)
{
int res = 0;

if(type == OP_BUY || type == OP_SELLLIMIT || type == OP_BUYSTOP)
res = 1;
if(type == OP_SELL || type == OP_BUYLIMIT || type == OP_SELLSTOP)
res = -1;

//если реверс = 1, то это для выставления ордера, если = -1 то для
//расчета стопов и тейков

if(type == OP_BUYLIMIT || type == OP_SELLLIMIT)
res = res * revers;
//return( 1 - 2 * ( OrderType() % 2 ) );
return(res);
}


//+-------------------------------------------------------------------+
//выставляет ордер
//на входе: переменные для открытия ордера
//на выходе - тикет открытого ордера или -1 если ордер
//не может быть открыт
//+-------------------------------------------------------------------+
int OpenOrder(string _symbol,int _cmd, double _volume, double _price, int _sleepage, double _stoploss, double _takeprofit, string _comment, int _magic, int _exp, string fn = "")
{
/*
symbol - Наименование финансового инструмента, с которым проводится торговая операция.
cmd - Торговая операция. Может быть любым из значений торговых операций.
volume - Количество лотов.
price - Цена открытия.
slippage - Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
stoploss - Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).
takeprofit - Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).
comment - Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.
magic - Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.
expiration - Срок истечения отложенного ордера.
arrow_color - Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.

если price == 0 тогда открываем по текущей цене
*/
int res = -1;
int countOfTry = 5;
int nTry = 0;

int sltpLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);



while(res < 0 && nTry <= countOfTry && !IsStopped() && IsTradeAllowed())
{
if(!IsExpertEnabled()) break;

while(IsTradeContextBusy())
{
Sleep(3000);
}

RefreshRates();
if (_price == 0){
_price = iif(orderDirection(_cmd,1)>0,MarketInfo(Symbol(),MODE_ASK),MarketInfo(Symbol(),MODE_BID));
}

if(_price > 0 ){
if(_cmd == OP_BUYSTOP || _cmd == OP_SELLLIMIT){
if(_price < (MarketInfo(Symbol(),MODE_ASK) + sltpLevel * Point)){
Print("================== cant open ", "ot = ",_cmd, " op = ",_price);
return(-1);
}
}
//***
if(_cmd == OP_SELLSTOP || _cmd == OP_BUYLIMIT){
if(_price > (MarketInfo(Symbol(),MODE_BID) - sltpLevel * Point)){
Print("================== cant open ", "ot = ",_cmd, " op = ",_price);
return(-1);
}
}
}

//нормализуем все переменные зависящие от цены
_price = NormalizeDouble(_price, Digits);
_stoploss = NormalizeDouble(_stoploss, Digits);
_takeprofit = NormalizeDouble(_takeprofit, Digits);

res = OrderSend(_symbol,_cmd,_volume,_price,_sleepage,_stoploss,_takeprofit,_comment,_magic,_exp,CLR_NONE);

Print(StringConcatenate("OpenOrder = ",res));

if(res > -1)
return(res);
//---
int err = GetLastError();
if(err > 0)
{
if(err == 4109){
Print("TRADE IS DISABLED!!!!");
return(-1);
}

if(err == 4051)
break;
//logInfo(_price);
if(err == 148){
Print("BROCKER MAX ORDERS!!!!!");
return(-1);
}

if(err == 130){
Print(StringConcatenate("sl = ",_stoploss," tp = ",_takeprofit));
return(-1);
}
Print("OpenOrder",StringConcatenate("OrderSendError, fn = ",fn),err);
Print(StringConcatenate("Price = ",_price," cmd = ",_cmd, " bid = ", Bid, " ask = ", Ask));
}

nTry++;
}

return(res);
}

//---------- Копировать -----------------//

 
sanyooooook:
пусть тупо долбится пока не вернется тикет больше 0

о санек не подскажеш как это сделать ?
 

у меня вот так стоит что подправить ?

void CLOSEORDER(string ord)
{
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUY && ord=="Buy")
            OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),30,CLR_NONE);
         if (OrderType()==OP_SELL && ord=="Sell")
            OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),30,CLR_NONE);
      }   
   }
}
 
int res=-1;
while(res < 0 )
{
   RefreshRates();
   res=OrderSend();
   Sleep(3000);
}
 
Pyxlik2009:

у меня вот так стоит что подправить ?

этож закрытие ордеров