Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1451

 
Mikhail Toptunov #:

Пожалуйста, покажите чем пользуетесь вы!

Выставляю через OrderSend или OrderSend Async, сохраняю в отсортированном по цене массиве выставленные ордера (или только один ордер - если рыночный) и отслеживаю их судьбу через OnTrade или OnTradeTransaction

Плюс, периодически и при старте, проверки на предмет пропущенных событий - сверка массива со списком действующих ордеров.

 
Mikhail Toptunov #:

Может ли быть такое , когда обратные связи свидетельствуют о том, что успех по открытию позиции

2023.04.21 13:06:24.961 MAllTradeV_0(черновик) (EURUSD,M1) Метод PositionOpen() выполнен успешно. Код возврата=10008 (placed)0 595 1682055000 lot 0.05000000

2023.04.21 13:06:25.952 MAllTradeV_0(черновик) (EURUSD,M1) Метод OrderOpen() выполнен успешно. Код возврата=10008 (placed)0 595 1682055000 lot 0.01000000

2023.04.21 13:18:03.075 MAllTradeV_0(черновик) (EURUSD,M1) Метод PositionOpen() выполнен успешно. Код возврата=10008 (placed)0 595 1682055000 lot 0.04000000


А на деле нет одного.


в истории не закрывалась.


использую стандартный класс для торговли


Подскажите как поймать Код возврата=10009 ???????

Кто знает как отследить конкретно ордер, исполнился он или нет? Я так понял код возврата по запросу 10008 это не конечный ответ. 

А почему вы отложенный ордер ищете среди позиций?

 
Alexey Viktorov #:

А почему вы отложенный ордер ищете среди позиций?

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

Использовал

   ENUM_ORDER_TYPE order_type= position_buff[i].type==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;


а надо 

 ENUM_POSITION_TYPE order_type= position_buff[i].type==0 ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
 

Не пойму , почему в PositionOpen ENUM_ORDER_TYPE , а не ENUM_POSITION_TYPE ?

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
bool CTrade::PositionOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                          const double price,const double sl,const double tp,const string comment)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- check
   if(order_type!=ORDER_TYPE_BUY && order_type!=ORDER_TYPE_SELL)
     {
      m_result.retcode=TRADE_RETCODE_INVALID;
      m_result.comment="Invalid order type";
      return(false);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.symbol   =symbol;
   m_request.magic    =m_magic;
   m_request.volume   =volume;
   m_request.type     =order_type;
   m_request.price    =price;
   m_request.sl       =sl;
   m_request.tp       =tp;
   m_request.deviation=m_deviation;
//--- check order type
   if(!OrderTypeCheck(symbol))
      return(false);
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
   m_request.comment=comment;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }
 
Mikhail Toptunov #:

Не пойму , почему в PositionOpen ENUM_ORDER_TYPE , а не ENUM_POSITION_TYPE ?

Потому, что позицию открыть нельзя.

Вы отправляете на сервер брокера торговый приказ (ордер) для совершения сделки. 

Позиция открывается только в случае если сделка была совершена. 

Тот факт, что ордер был успешно отправлен (10008), не гарантирует заключения сделки и соответственно открытия позиции (10009).


Если вы отправляете торговый приказ (ордер) на совершение торговой операции TRADE_ACTION_DEAL - то есть совершить сделку по текущей рыночной цене, то любой код возврата (m_result.retcode) отличный от 10009 будет говорить о том, что сделка не состоялась.

На всякий случай проверяйте ещё тикет сделки  m_result.deal.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
  • www.mql5.com
Коды возврата торгового сервера - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksandr Slavskii #:

Если вы отправляете торговый приказ (ордер) на совершение торговой операции TRADE_ACTION_DEAL - то есть совершить сделку по текущей рыночной цене, то любой код возврата (m_result.retcode) отличный от 10009 будет говорить о том, что сделка не состоялась.

Увы, не совсем так. Показывал тут уже, как получил код 10012, нулевой тикет ордера, но ордер при этом исполнился. MQ хранят молчание по этому поводу.

Написал под это костыль, но проверить его можно будет только получив снова 10012 )

 
JRandomTrader #:

Увы, не совсем так. Показывал тут уже, как получил код 10012, нулевой тикет ордера, но ордер при этом исполнился. MQ хранят молчание по этому поводу.

Написал под это костыль, но проверить его можно будет только получив снова 10012 )

военное дело. приказал, получил ответ как поняли. получил ответ как исполнили, получил подтверждение что исполнили как приказал))) Все по людски)))

 
Valeriy Yastremskiy #:

военное дело. приказал, получил ответ как поняли. получил ответ как исполнили, получил подтверждение что исполнили как приказал))) Все по людски)))

А следующий приказ можно будет отдать только завтра. Кому нужна такая торговля???

 

господа, служители!)

Как же организовать проверку, на выставленный или исполненный ордер или позицию.

Если пришёл код 10008, как дальше отследить что именно тот ордер выставлен в список ордеров или позиций? 

Чтобы исключить вариант, что код пришёл , а позиции или ордера нет

//-------------------------------------------------------------------+
void OnTrade()
  {
//--- Фиксируем если позиция открыта
   for(int i=0; i<ArraySize(position_buff); i++)
      if(position_buff[i].timeOp>1)
         if(!match_open_orders(position_buff[i].MagicNumber,position_buff[i].type,position_buff[i].comment)) // проверяю есть ли позиция
           {
            position_buff[i].timeOp= 0;     // Фиксировать время
            Print("Метод OnTrade() по рынку не выполнен. Код возврата=",m_trade.ResultRetcode(),
                  " (",m_trade.ResultRetcodeDescription(),")"+position_buff[i].comment+" lot "+DoubleToString(position_buff[i].lot));//
           }
         else
            Print("Метод OnTrade() по рынку выполнен успешно. Код возврата=",m_trade.ResultRetcode(),
                  " (",m_trade.ResultRetcodeDescription(),")"+position_buff[i].comment+" lot "+DoubleToString(position_buff[i].lot));//

  }
//--- Соответствие открытых ордеров ---------------------------------+
bool match_open_orders(long magic,int type,string comment)
  {
//---
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i))
        {
         long f= m_position.Magic();
         if(m_position.Comment()==comment)
            if(m_position.Type()==type)
               if(m_position.Magic()==magic)
                  return(true);
        }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i))
        {
         long f= m_position.Magic();
         if(m_position.Comment()==comment)
            if(m_position.Type()==type)
               if(m_position.Magic()==magic)
                  return(true);
        }
   return(false);
  }
 
Mikhail Toptunov #:

господа, служители!)

Как же организовать проверку, на выставленный или исполненный ордер или позицию.

Если пришёл код 10008, как дальше отследить что именно тот ордер выставлен в список ордеров или позиций? 

Чтобы исключить вариант, что код пришёл , а позиции или ордера нет

Попробуйте вместо OnTrade() использовать  OnTradeTransaction()