Скачать MetaTrader 5

"Отрытие Брокер" MqlTradeResult содержит неверные данные

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vitalya Antonov
1378
Vitalya Antonov  

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

В ходе тестирования робота на фьючерс евро-доллар на FORTS у брокера "Отрытие" выяснилась такая ситуация: я выставляю рыночный ордер следующей функцией:

#define MAGIC 123
#define SLIP 300
#define LOTS 1.0

double Trade()
{  
   bool error_ctrl;
   MqlTradeRequest request = {0};
   MqlTradeResult result = {0};
   MqlTradeCheckResult checkres = {0};
   MqlTick prices;
   
   //получаем котировки
   error_ctrl = SymbolInfoTick(Symbol(), prices);
   if (!error_ctrl)
   {
      Print("Не могу получить информацию о ценах");
      return (-1);
   }
   
   //заполняем структуру запроса
   request.action = TRADE_ACTION_DEAL;
   request.symbol = Symbol();
   request.magic = MAGIC;
   request.deviation = SLIP;
   request.type_filling = ORDER_FILLING_FOK;
   request.type_time = ORDER_TIME_GTC; 
   request.volume = LOTS;
   
   //покупаем
   request.price = prices.ask;
   request.type = ORDER_TYPE_BUY;
   
   error_ctrl = OrderCheck(request, checkres);
   if (!error_ctrl)
   {
      Print("Проверка показывает, что ордер не может быть отправлен. Ошибка "+IntegerToString((long)checkres.retcode));
      return (-1);
   }
      
   error_ctrl = OrderSend(request, result);
   if (!error_ctrl)
   {
      Print("Отправить ордер не получилось. Ошибка "+IntegerToString((long)result.retcode));
      return (-1);
   }
   else
      return (result.price);
}

На форексе всё работает нормально и функция возвращает цену, по которой была совершена сделка.

На FORTS у брокера "Открытие" эта функция возвращает 0, хотя ордер выставляется и сделка совершается. Из-за этого робот постоянно покупает, пока не кончатся деньги (потому что алгоритм устроен так, что если цена сделки меньше или равна 0, то её не было и нужно совершить её ещё раз).

Решил проверить, почему так, и распечатал все поля структуры MqlTradeResult:

result.ask = 0.0
result.bid = 0.0
result.comment = Order placed
result.deal = 0
result.order = 3648190
result.price = 0.0
result.request_id = 125
result.retcode = 10008
result.volume = 0.0

И у меня вопрос к коллегам, почему так, кто с этим сталкивался, и как всё-таки получить цену, по которой была совершена сделка?

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса - Документация по MQL5
Rashid Umarov
Админ
12075
Rashid Umarov  

Ответ Order placed означает, что заявка проверена на корректность и выставлена в торговую систему (на биржу). Цена исполнения будет сообщена в событии OnTradeTransaction().

Посмотрите статью Торговые события в MetaTrader 5

Vitalya Antonov
1378
Vitalya Antonov  

ок, спасибо

всё заработало)

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