контроль исполнения ордера

 

Добрый день!

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

#include <Trade\Trade.mqh>

CTrade Trade;

...

Trade.Buy(lot, my_symbol);

Print("Тренд вверх, покупка по ", Trade.RequestPrice(), " (RequestPrice) ", Trade.ResultPrice(), " (ResultPrice) ",", Ticket ", Trade.ResultOrder(),", ", Trade.RequestOrder(),", ", Trade.ResultDeal());

Если я правильно понимаю, .Buy использует алгоритм отложенного ордера и по этому Trade.ResultPrice() это цена которую я заказал брокеру, Trade.RequestPrice() это цена которую подтвердил брокер, а вот если график сдвинулся то фактическая цена исполнения будет совершенно другой, и мне необходимо узнать данную цену исполнения ордера.

Я так понимаю, что цену исполнения ордера я могу узнать через COrderInfo, CDealInfo или CHistoryOrderInfo? Какой из данных классов для этого использовать проще всего или может есть какой то другой способ узнать цену исполнения ордера зная тикет ордера?

Или может у класса CTrade есть какой то алгоритм способный дать цену исполнения?

Заранее спасибо!

Как заказать торгового робота на MQL5 и MQL4
Как заказать торгового робота на MQL5 и MQL4
  • www.mql5.com
Сервис "Фриланс" является самой большой биржей для заказа торговых роботов и технических индикаторов. Сотни профессиональных разработчиков готовы написать торговое приложение для терминала MetaTrader 4/5.
 
m.kodash:

Добрый день!

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

Если я правильно понимаю, .Buy использует алгоритм отложенного ордера и по этому Trade.ResultPrice() это цена которую я заказал брокеру, Trade.RequestPrice() это цена которую подтвердил брокер, а вот если график сдвинулся то фактическая цена исполнения будет совершенно другой, и мне необходимо узнать данную цену исполнения ордера.

Я так понимаю, что цену исполнения ордера я могу узнать через COrderInfo, CDealInfo или CHistoryOrderInfo? Какой из данных классов для этого использовать проще всего или может есть какой то другой способ узнать цену исполнения ордера зная тикет ордера?

Или может у класса CTrade есть какой то алгоритм способный дать цену исполнения?

Заранее спасибо!

С почином! А не надо гадать, надо зайти в коды нужного класса и просто посмотреть, что и как там реализовано. Например:

 

bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")
  {
//--- check volume
   if(volume<=0.0)
     {
      m_result.retcode=TRADE_RETCODE_INVALID_VOLUME;
      return(false);
     }
//--- check symbol
   string symbol_name=(symbol==NULL) ? _Symbol : symbol;
//--- check price
   if(price==0.0)
      price=SymbolInfoDouble(symbol_name,SYMBOL_ASK);
//---
   return(PositionOpen(symbol_name,ORDER_TYPE_BUY,volume,price,sl,tp,comment));
  }

Как видно в последней строке, в PositionOpen передается тип ордера ORDER_TYPE_BUY. Если вы не знаете, это перечисление (enum) и его легко посмотреть в справке редактора. Курсор на ORDER_TYPE_BUY, жамкаем на F1 и впитываем мудрость Метаквотов )):

ORDER_TYPE_BUY

Рыночный ордер на покупку

Для отложенников будут другие значения, в справке все прокомментировано. И когда вы посылаете рыночный ордер, он срабатывает максимально быстро, обычно десятки-сотни мс. После чего открывается позиция, а ордер уходит в историю. Вот у позиции и надо смотреть параметры:

double CPositionInfo::PriceOpen(void) const
  {
   return(PositionGetDouble(POSITION_PRICE_OPEN));
  }

  Успехов в изучении MQL5, как говорил Лао-Цзы, путь в тысячу ли начинается с первого шага!