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

 
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()

 

Подскажите работает ли MetaTrader 5 на Windows 7,8 ?

 
pivomoe #:

Подскажите работает ли MetaTrader 5 на Windows 7,8 ?

Работает, но лучше чтобы была 64-разрядная ОС

 
Mikhail Toptunov #:

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

Опять двадцать пять. 

   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);
        }

Смешались в кучу кони, люди...

Это вообще что?

Запрашиваем количество открытых ордеров, а проверяем позиции. Так не пойдёт.
 
JRandomTrader #:

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

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

Это исключение из правил, а у человека не получается понять разницу между ордерами, сделками и позициями. А вы его ещё и исключениями путаете)))

Когда поймёт как это работает, сможет сам написать проверку под свои нужды.

Причина обращения: