Скачать MetaTrader 5

Трудности перехода с МТ4 на МТ5

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

В МТ4 создавал примерно такие процедуры:

int CreateOrder(string pSymbol, double pLot, int pTipOrder, double pPrice)
{
int nTicket;
string locStr;
double TP;
 
  if (CheckMoneyForOpen(pLot))
  {
   TP = makeTP(pTipOrder, pPrice, eTakeProfit);
   nTicket = OrderSend(pSymbol, pTipOrder, pLot, pPrice, eSlippage, 0, TP, "", MN_ST, 0, CLR_NONE);
   if (nTicket < 0)
    {
     locStr = "--------- Не удалось создать ордер ---------";
     PrintLog(0, locStr);
     PrintLog(1, "CreateOrder");
     PrintLog(0, "locPrice ="+pPrice);
     PrintLog(0, "pTipOrder ="+pTipOrder);
     PrintLog(0, "SL = "+0);
     PrintLog(0, "TP = "+TP);
     PrintLog(0, "Digits = "+Digits);
    }
  }
    return(nTicket);
}

Если все хорошо то nTicket содержал тикет созданного ордера все было отлично :)  если тикет отрицательный то тоже замечательно я знаю что ордер  не создался.

Теперь в МТ5 

хочу использовать стандартные классы

PositionOpen

Открывает позицию с заданными параметрами по указанному символу. 

Примечание

Успешное окончание работы метода PositionOpen(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode(), а также значение, возвращаемое методом ResultDeal(). 

Теперь как поступать?

m_trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, eLot,  Cur1, 0, 0, "");

bBuy = m_trade.ResultRetcode();

        if (nBuy != 10008 ||  nBuy != 10009 || nBuy != 0)
         {что то пошло не так ордер не размещен}

а ResultDeal с ним что делать?

1) Объясните как в МТ5 проанализировать что позиция открыта?

2) Как по открытой позиции выбрать из истории относящиеся к ней ордера? С помощью

HistorySelectByPosition

Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции.

??? 

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

написал функцию

int CheckResultOrder()
 {
  int  nResult;
 
  nResult = GetLastError();
  if (nResult != 10008 && nResult && 10009 && nResult != 0 )
   {
     nResult = -1;
   }
  ResetLastError();

  return(nResult);
 
 } 

теперь если функция вернет -1 то ордер не создался

кто нибудь подскажет я в правильном направлении иду?)

1) Объясните как в МТ5 проанализировать что позиция открыта?

2) Как по открытой позиции выбрать из истории относящиеся к ней ордера? С помощью

HistorySelectByPosition

Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции.

???  

Дмитрий Александрович
1705
Дмитрий Александрович  
Konstantin83:

написал функцию

int CheckResultOrder()
 {
  int  nResult;
 
  nResult = GetLastError();
  if (nResult != 10008 && nResult && 10009 && nResult != 0 )
   {
     nResult = -1;
   }
  ResetLastError();

  return(nResult);
 
 } 

теперь если функция вернет -1 то ордер не создался

кто нибудь подскажет я в правильном направлении иду?)

1) Объясните как в МТ5 проанализировать что позиция открыта?

2) Как по открытой позиции выбрать из истории относящиеся к ней ордера? С помощью

HistorySelectByPosition

Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции.

???  

Нет не в правильном, первый пример ваш был почти верный.

bBuy = m_trade.ResultRetcode();
if (bBuy != 10008 ||  bBuy != 10009)
{
   //что то пошло не так ордер не размещен
}
На сколько я помню.
Анализировать код возврата нужно из поля retcode структуры MqlTradeResult , которую вы передаете вторым параметром в функцию OrderSend (без стандартной библиотеки классов).

Или получаете методом ResultRetcode() (стандартная библиотека классов). GetLastError() тут не при чем.

А ResultDeal() возвращает тикет сделки, тоесть ее уникальный номер. Смею предположить, что в случае ошибки значение либо не определено, либо ноль.

На счет ордеров, не помню, надо смотреть (пока некогда).

Konstantin Chernov
9803
Konstantin Chernov  

а если использую торговые классы

делаю так
m_trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, locLot,  Cur1, 0, 0);
Примечание
Успешное окончание работы метода PositionOpen(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode(), а также значение, возвращаемое методом ResultDeal().
OrderCheck используется в PositionOpen PositionClose и PositionModify
Возвращаемое значение
В случае нехватки средств или ошибочно заполненных параметров функция возвращает false. В случае успешной базовой проверки структур (проверка указателей) возвращается true – это не является свидетельством того, что запрашиваемая торговая операция непременно выполнится успешно. Для получения подробного описания результата выполнения функции следует анализировать поля структуры result.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
делаю так
   bSell = CheckResultOrder(); //теперь если функция вернет -1 то ордер не создался

int CheckResultOrder()
 {
  int  nResult;
 
  nResult = GetLastError();
  if (nResult != 0 )
   {
     nResult = -1;
   }
  ResetLastError();

  return(nResult);
 
 } 

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

Вы путаете ошибку программы https://www.mql5.com/ru/docs/constants/errorswarnings/errorcodes   (например деление на ноль, ошибка в функции и т.п.)
и код возврата сервера https://www.mql5.com/ru/docs/constants/errorswarnings/enum_trade_return_codes  (нету денег, неправильная цена и т.п.)

Код возврата сервера получать нужно m_trade.ResultRetcode() .
Если позиция открылась m_trade.ResultRetcode() вернет 10009 (может еще 10008), если позиция не открылась, вернет другой код возврата сервера.
Если позиция не откроется вызов GetLastError() вернет "0", а если откроется, то вернет тоже "0", надеюсь так понятно?

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения - Документация по MQL5
ruanovc
18
ruanovc  
Дмитрий Александрович:

 

...А ResultDeal() возвращает тикет сделки, тоесть ее уникальный номер. Смею предположить, что в случае ошибки значение либо не определено, либо ноль

Ноль. И получить ничего кроме ноля так и не получилось.

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