10013 Invalid request, почему? Что не так написано?

 

Собственно сабж, вот код:

void OPEN_SHORT()
  {
   MqlTradeRequest req;
   MqlTradeCheckResult check;
//---
   req.type=ORDER_TYPE_SELL;
   req.action=TRADE_ACTION_DEAL;
   req.symbol = _Symbol;
   req.volume = NormalizeDouble(Lot,1);
   req.deviation=SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   req.type_filling=ORDER_FILLING_IOC;
//---
   for(int i=0;i<3;i++)
     {
      req.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
      req.tp=req.price-SymbolInfoDouble(_Symbol,SYMBOL_POINT)*300*i;
      if(OrderCheck(req,check)){Print("Купи слона!");
        if(!OrderSend(req,TradeResultArray[i]) || TradeResultArray[i].deal==0)
          {Print("Сделка не открылась"); ExpertRemove();}}
      Print(check.retcode, check.comment);
     }
   }

 Понять не могу почему выходит ошибка OrderCheck. Этот код я скопировал из чужого работающего эксперта, и чуть чуть поменял (Посылается 3 заявки) присвоение параметров осталось прежним. 

 
Bonifacy:

Собственно сабж, вот код:

 Понять не могу почему выходит ошибка OrderCheck. Этот код я скопировал из чужого работающего эксперта, и чуть чуть поменял (Посылается 3 заявки) присвоение параметров осталось прежним. 

Поиск рулит.

Из чужого - верю. Из работающего - не верю.

Вы случайно при чуть-чуть изменении работающего кода не удалили обнуление структур?

 
stringo:

Поиск рулит.

Из чужого - верю. Из работающего - не верю.

Вы случайно при чуть-чуть изменении работающего кода не удалили обнуление структур?

Случайно ничего не удалял, как видите код процедуры приведен полностью, исключение составляет TradeResultArray и Lot которые объявлены вне процедуры. Вот ссылка на оригинальный код: https://www.mql5.com/ru/code/viewcode/1554/31013/madelta_ea.mq5
 

Ну, Вы забыли про остальные поля.

  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};

   
//--- Fill structure
  request.magic        = magic;
  request.symbol       = _Symbol;
  request.volume       = volume; 
  request.type_filling = ORDER_FILLING_IOC;
  request.type_time    = ORDER_TIME_DAY;
    
  if ( price == 0 )
  {
    request.action     = TRADE_ACTION_DEAL;
    request.comment    = "Рыночный ордер...";
//---    
    if ( buy_sell )
    {
      request.type     = ORDER_TYPE_BUY;
    }
    else
    {
      request.type     = ORDER_TYPE_SELL;
    }
  }
  else
  { 
    request.action     = TRADE_ACTION_PENDING;
    request.price      = price;
    request.comment    = "Лимитный ордер...";
//---    
    if (buy_sell)
    {
      request.type     = ORDER_TYPE_BUY_LIMIT;
    }
    else
    {
      request.type     = ORDER_TYPE_SELL_LIMIT;
    }   
  }
 
Bonifacy:

Собственно сабж, вот код:

 Понять не могу почему выходит ошибка OrderCheck. Этот код я скопировал из чужого работающего эксперта, и чуть чуть поменял (Посылается 3 заявки) присвоение параметров осталось прежним. 

Лот какого размера?

У Вас округление до 1 цифры после запятой req.volume = NormalizeDouble(Lot,1);

Если Lot =0.01, то req.volume будет 0.0

Возможно это тоже причина... 

 
elugovoy:

Лот какого размера?

У Вас округление до 1 цифры после запятой req.volume = NormalizeDouble(Lot,1);

Если Lot =0.01, то req.volume будет 0.0

Возможно это тоже причина... 

Лот указан верно, а точнее размером 0,1 в req.volume содержит именно это значение.

Mikalas:

Ну, Вы забыли про остальные поля.

Все поля были заполнены верно, судя по справке необходимые поля заполнялись верно их нужно 5, вот вырезка из справочника по типу MqlTradeRequest:

Market Execution

Торговый ордер на открытие позиции в режиме Market Execution (режим исполнения торговых приказов по рынку). Требуется указание 5 полей:

  • action
  • symbol
  • volume
  • type
  • type_filling

Можно также задать значения полей magic и comment.

А проблема решилась - т.к. я не инициализировал переменные request и result должным образом, как вы показали в своем коде:

MqlTradeRequest request = {0};
MqlTradeResult  result  = {0};
Очевидно, что в них попадал "мусор". Спасибо за помощь!
Причина обращения: