PositionOpen or OrderSend, PositionModify or OrderModify, PositionClose or OrderDelete

 

Сначала я понял что все команды начинающиеся с Position предназначены для открытия, изменения и закрытия позиций (рыночных ордеров). Все команды начинающиеся с Order предназначены для работы с отложенными ордерами, согласно документации. Но если это так, то зачем OrderOpen нужен ENUM_ORDER_TYPE, которому можно приписать ORDER_TYPE_BUY или ORDER_TYPE_SELL и ордер станит рыночным при дополнительном условии action=TRADE_ACTION_DEAL? То есть получается что существуют два способа работы с ордерами: через PositionXXXX или через OrderXXXX. Зачем нужны ДВА разных метода работы с ордерами? В чём между ними разница? Если мне нужно открыть несколько одновременных сделок, каким методом нужно пользоваться? Как выбирать индивидуальные сделки для их изменения (передвига стоплосса например) или закрытия?

И ещё одно замечание. Командa trade.PositionOpen ожидает тип позиции как ENUM_ORDER_TYPE, а не ENUM_POSITION_TYPE. А при закрытии позиции, posInfo.Type ожидает тип позиции как ENUM_POSITION_TYPE. Неплохо бы если бы в обоих случаях нужно было указывать тип позиции как ENUM_POSITION_TYPE.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
Вы что-то напутали, названных Вами функций в MQL5 нет, за исключением OrderSend(). Посмотрите раздел Торговые функции

 

Rosh:
Вы что-то напутали, названных Вами функций в MQL5 нет, за исключением OrderSend(). Посмотрите раздел Торговые функции 

 

То есть как нет? А вот здесь есть

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade 

Или эта страничка уже недействительна?

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade - Документация по MQL5
 
Это методы класса CTrade из Стандартной библиотеки. Библиотека предназначена для облегчения написания программ на MQL5. Один из примеров использования класса описан в статье Пример торговой системы на основе индикатора Heiken-Ashi

 
gpwr:

Сначала я понял что все команды начинающиеся с Position предназначены для открытия, изменения и закрытия позиций (рыночных ордеров). Все команды начинающиеся с Order предназначены для работы с отложенными ордерами, согласно документации. Но если это так, то зачем OrderOpen нужен ENUM_ORDER_TYPE, которому можно приписать ORDER_TYPE_BUY или ORDER_TYPE_SELL и ордер станит рыночным при дополнительном условии action=TRADE_ACTION_DEAL? То есть получается что существуют два способа работы с ордерами: через PositionXXXX или через OrderXXXX. Зачем нужны ДВА разных метода работы с ордерами? В чём между ними разница? Если мне нужно открыть несколько одновременных сделок, каким методом нужно пользоваться? Как выбирать индивидуальные сделки для их изменения (передвига стоплосса например) или закрытия?

И ещё одно замечание. Командa trade.PositionOpen ожидает тип позиции как ENUM_ORDER_TYPE, а не ENUM_POSITION_TYPE. А при закрытии позиции, posInfo.Type ожидает тип позиции как ENUM_POSITION_TYPE. Неплохо бы если бы в обоих случаях нужно было указывать тип позиции как ENUM_POSITION_TYPE.

Метод класса СTrade::PositionOpen(...) так же реализуется через установку ордера на совершение сделки.

Для этого заполняется структура запроса 

struct MqlTradeRequest , а она однозначно определена в MQL5 (поля и типы значений). Она то как раз и требует указания ENUM_ORDER_TYPE, а не ENUM_POSITION_TYPE.


То же самое и в методе CTrade::PositionClose(...).


//+------------------------------------------------------------------+
//| Open position.                                                   |
//| INPUT:  symbol     -symbol for trade,                            |
//|         order_type -direct for open,                             |
//|         volume     -volume of position,                          |
//|         price      -price for open,                              |
//|         stop       -price of stop loss,                          |
//|         take       -price of take profit,                        |
//|         comment    -comment of position.                         |
//| OUTPUT: true-if successful, false otherwise.                     |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CTrade::PositionOpen(const string symbol,ENUM_ORDER_TYPE order_type,double volume,
                          double price,double sl,double tp,const string comment)
  {
//--- checking
   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;
   m_request.type_filling=ORDER_FILLING_AON;
   m_request.comment     =comment;
//---
   return(OrderSend(m_request,m_result));
  }

 
Valmars:

Метод класса СTrade::PositionOpen(...) так же реализуется через установку ордера на совершение сделки.

Для этого заполняется структура запроса 

struct MqlTradeRequest , а она однозначно определена в MQL5 (поля и типы значений). Она то как раз и требует указания ENUM_ORDER_TYPE, а не ENUM_POSITION_TYPE.


То же самое и в методе CTrade::PositionClose(...).

 

Спасибо за ответ. И всё таки у меня остаётся глубокое непонимание торговых операций в mql5. Ситуация довольно простая:

Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?

Открыть ордера просто. А модифицировать их трудно. Думал что как и в mql4 запустить цикл выбора ордеров типа

for(int i=OrdersTotal()-1;i>=0;i--)
{
ulong ticket=OrderGetTicket(i);
   OrderSelect(ticket);

 Но оказалось что OrdersTotal всегда возвращает 0. Повидимому, OrdersTotal подсчитывает отложенные ордера. А как подсчитать открытые/активные рыночные ордера. HistoryOrdersTotal тоже всегда возвращает 0. PositionsTotal всегда возвращает 1 независомо от количества открытых ордеров/сделок. Неужели придётся самому счётчик открытых ордеров ставить? А как тогда поступать с ордерами закрытыми по стоплоссу? Было бы намного удобнее если OrdersTotal работал как и в mql4.

 
gpwr:

 

Спасибо за ответ. И всё таки у меня остаётся глубокое непонимание торговых операций в mql5. Ситуация довольно простая:

Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?

Открыть ордера просто. А модифицировать их трудно. Думал что как и в mql4 запустить цикл выбора ордеров типа

 Но оказалось что OrdersTotal всегда возвращает 0. Повидимому, OrdersTotal подсчитывает отложенные ордера. А как подсчитать открытые/активные рыночные ордера. HistoryOrdersTotal тоже всегда возвращает 0. PositionsTotal всегда возвращает 1 независомо от количества открытых ордеров/сделок. Неужели придётся самому счётчик открытых ордеров ставить? А как тогда поступать с ордерами закрытыми по стоплоссу? Было бы намного удобнее если OrdersTotal работал как и в mql4.

1. Вам надо почитать справку по клиентскому терминалу, в частности, раздел "Торговля". Там описано,что происходит с ордером с момента установки до исполнения.

2. OrdersTotal подсчитывает и активные ордера, просто они активны только до момента, когда будут исполнены, а это секунды, затем они перемещаются в историю.

3. По одному инструменту может существовать только одна позиция, может только меняться её объём и (или) направление.

4. HistoryOrdersTotal возвращает 0, потому, что Вы предварительно не запросили историю функцией HistorySelect(...).

5. Сделка - это исполненный ордер и найти их можно только в истории.

6. Успехов в изучении MQL5 !

 
Valmars:

1. Вам надо почитать справку по клиентскому терминалу, в частности, раздел "Торговля". Там описано,что происходит с ордером с момента установки до исполнения.

2. OrdersTotal подсчитывает и активные ордера, просто они активны только до момента, когда будут исполнены, а это секунды, затем они перемещаются в историю.

3. По одному инструменту может существовать только одна позиция, может только меняться её объём и (или) направление.

4. HistoryOrdersTotal возвращает 0, потому, что Вы предварительно не запросили историю функцией HistorySelect(...).

5. Сделка - это исполненный ордер и найти их можно только в истории.

6. Успехов в изучении MQL5 !

Спасибо.

Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?

Возможно или нет? 

 

 
Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5
Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5
  • 2010.05.14
  • Paul
  • www.mql5.com
Эта библиотека классов может быть добавлена в советники, написанные для MetaTrader 5, чтобы они могли работать с ордерами в рамках подхода, реализованного в MetaTrader 4, а не в рамках позиционно-ориентированного подхода платформы MetaTrader 5. Это достигается путем отслеживания "виртуальных" ордеров в терминале MetaTrader 5, поддержки стопов, невидимых для брокера, и установкой дальних защитных реальных стопов на торговом сервере.
 
gpwr:

Спасибо.

Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?

Возможно или нет? 

 

Если всё сделал и ничего не помогает - учи матчасть ! Почему Вы не хотите читать документацию ? Вы автоматом переносите свои представления из MT4 в MT5, а здесь другая парадигма.

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

 

 

Огромное спасибо! То что искал. 

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