Rosh:
Вы что-то напутали, названных Вами функций в MQL5 нет, за исключением OrderSend(). Посмотрите раздел Торговые функции
То есть как нет? А вот здесь есть
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade
Или эта страничка уже недействительна?
- www.mql5.com
Сначала я понял что все команды начинающиеся с 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)); }
Метод класса С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.
Спасибо за ответ. И всё таки у меня остаётся глубокое непонимание торговых операций в mql5. Ситуация довольно простая:
Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?
Открыть ордера просто. А модифицировать их трудно. Думал что как и в mql4 запустить цикл выбора ордеров типа
Но оказалось что OrdersTotal всегда возвращает 0. Повидимому, OrdersTotal подсчитывает отложенные ордера. А как подсчитать открытые/активные рыночные ордера. HistoryOrdersTotal тоже всегда возвращает 0. PositionsTotal всегда возвращает 1 независомо от количества открытых ордеров/сделок. Неужели придётся самому счётчик открытых ордеров ставить? А как тогда поступать с ордерами закрытыми по стоплоссу? Было бы намного удобнее если OrdersTotal работал как и в mql4.
1. Вам надо почитать справку по клиентскому терминалу, в частности, раздел "Торговля". Там описано,что происходит с ордером с момента установки до исполнения.
2. OrdersTotal подсчитывает и активные ордера, просто они активны только до момента, когда будут исполнены, а это секунды, затем они перемещаются в историю.
3. По одному инструменту может существовать только одна позиция, может только меняться её объём и (или) направление.
4. HistoryOrdersTotal возвращает 0, потому, что Вы предварительно не запросили историю функцией HistorySelect(...).
5. Сделка - это исполненный ордер и найти их можно только в истории.
6. Успехов в изучении MQL5 !
1. Вам надо почитать справку по клиентскому терминалу, в частности, раздел "Торговля". Там описано,что происходит с ордером с момента установки до исполнения.
2. OrdersTotal подсчитывает и активные ордера, просто они активны только до момента, когда будут исполнены, а это секунды, затем они перемещаются в историю.
3. По одному инструменту может существовать только одна позиция, может только меняться её объём и (или) направление.
4. HistoryOrdersTotal возвращает 0, потому, что Вы предварительно не запросили историю функцией HistorySelect(...).
5. Сделка - это исполненный ордер и найти их можно только в истории.
6. Успехов в изучении MQL5 !
Спасибо.
Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?
Возможно или нет?
- 2010.05.14
- Paul
- www.mql5.com
Спасибо.
Мне нужно открыть несколько ордеров в одном и том же направлении (например 2 покупки), но в разное время и потом модифицировать эти ордера независимо (подтянуть стоплоссы например). Как это сделать?
Возможно или нет?
Если всё сделал и ничего не помогает - учи матчасть ! Почему Вы не хотите читать документацию ? Вы автоматом переносите свои представления из MT4 в MT5, а здесь другая парадигма.
Нельзя модифицировать ордера, которые уже находятся в истории. Несколько ордеров в одном направлении только увеличат (уменьшат, если против позиции) размер открытой позиции на объём, указанный в ордерах.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сначала я понял что все команды начинающиеся с 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.