Ошибка 10013

 

Здравствуйте.

Прошу помочь разобраться. 

Пишу советник. При попытке открыть ордер возникает ошибка 10013. Формулировка просто потрясающая: Не правильный запрос.

И черт его разберет что там в запросе не правильного. Все вроде верно. 

 

Функция открытия ордера.

 

bool buy(double lots, int stopLoss, int takeProfit, string orderComment)
      {
         MqlTradeRequest request;
         MqlTradeResult result;
        
         request.action       = TRADE_ACTION_DEAL;
         request.magic        = magic;
         request.symbol       = sy.name;
         request.volume       = lots;
         request.price        = sy.ask;
         request.sl           = stopLoss>0 ? request.price-stopLoss*sy.point : 0;
         request.tp           = takeProfit>0 ? request.price+stopLoss*sy.point+sy.spread : 0;
         request.deviation    = slippage;
         request.type         = ORDER_TYPE_BUY;
         request.type_filling = ORDER_FILLING_IOC;
         request.type_time    = ORDER_TIME_GTC;
         request.comment      = orderComment;
         request.stoplimit    = 0;
        
         if(needFix) fix(request);
        
         bool success = OrderSend(request, result);
        
         commentRequest(request);
         commentResult(result);
        
         return success;
      }


 

 

Вызываю с такими параметрами:

trade.buy(0.1, 0, 0, "OrderComment");


 

 
Эти попытки на форексе?

Как минимум, структуры перед заполнением очень желательно обнулить. И разобраться-бы с количеством полей необходимых для заполнения. А уже потом можно разбираться с правильностью параметров.
 
Alexey Viktorov:
Эти попытки на форексе?

Как минимум, структуры перед заполнением очень желательно обнулить. И разобраться-бы с количеством полей необходимых для заполнения. А уже потом можно разбираться с правильностью параметров.
Да, на форексе. Обнуление не помогает. Конечно же перепробовал все простые варианты прежде чем писать на форуме.
 
Антон:
Да, на форексе. Обнуление не помогает. Конечно же перепробовал все простые варианты прежде чем писать на форуме.
и даже OrderCheck молчит?
 

10013

TRADE_RETCODE_INVALID

Неправильный запрос


разбирайтесь с параметром  request.type_filling = ORDER_FILLING_IOC;

 

разбирайтесь с параметром  request.type_filling = ORDER_FILLING_IOC;

Все перепробовал, ничего не помогает. 

 

Что-то совсем не понятное.

Весь день бился над открытием ордеров ничего не работало.

Сейчас  советник просто стоял на графике я его не трогал, не дорабатывал.

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

 
Может кто-то посоветует в какую сторону копать, что бы разобраться с происходящим?
 
Антон:
Да, на форексе. Обнуление не помогает. Конечно же перепробовал все простые варианты прежде чем писать на форуме.
Обнуление не помогает потому, что кроме этого ещё куча неправильных параметров.

И на второе моё предложение надо было отреагировать. По документации сколько полей структуры должно быть заполнено? Какие обязательны, а какие заполняются по желанию?

И только потом последуй совету

Alexander Bereznyak:

10013

TRADE_RETCODE_INVALID

Неправильный запрос


разбирайтесь с параметром  request.type_filling = ORDER_FILLING_IOC;

Это направление копать. От завтрака до забора....
 

Проблема тут:      

   //request.type_time    = ORDER_TIME_GTC;


При закомментировании этих строк ошибки нет.
 

Определённо поле request.type_time - лишнее.

Структура торгового запроса (MqlTradeRequest):

Для отправки приказов на совершение торговых операций  необходимо использовать функцию OrderSend(). Для каждой торговой операции необходимо указывать обязательные поля и можно заполнять опциональные поля. Всего предусмотрено семь вариантов отправки торгового запроса:

Request Execution

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

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

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

Instant Execution

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

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

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

Market Execution

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

  • action
  • symbol
  • volume
  • type
  • type_filling

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

Exchange Execution

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

  • action
  • symbol
  • volume
  • type
  • type_filling

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

А лучше, рекомендую, используйте стандартную библиотеку - торговый клас CTrade. Вот как это бы выглядело, при чём с распечаткой ошибок, если они есть:

if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
  {
   if(m_trade.ResultDeal()==0)
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());
   else
      Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());
  }
else
   Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
         ", description of result: ",m_trade.ResultRetcodeDescription());